Форум программистов, компьютерный форум, киберфорум
Lazarus
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/29: Рейтинг темы: голосов - 29, средняя оценка - 4.90
0 / 0 / 0
Регистрация: 05.04.2015
Сообщений: 45
1

5dpo: чтение данных из Serial port

14.03.2016, 08:39. Показов 5957. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. Приношу извинение за возможно глупый вопрос, но более менее понятной для меня информации в сети не нашел...
Суть вопроса: Lazarus получает данные через srial com port от контроллера arduino. при помощи дополнения Sdpo (5dpo). Данные представляют собой бесконечный лог текста. Текст это значение трех переменных через пробел.
С отображением данных я разобрался:
Pascal
1
Memo1.Lines.Add(SdpoSerial1.ReadData);
-данная строчка помещена в тело таймера и выводит на экран лог текста.
Но необходимо обрабатывать полученную информацию, в частности вычленить значение переменных из текста и преобразовать в числовой формат.
Завяз на самом начале...
Код:
Pascal
1
2
3
4
5
6
7
8
9
If (Length(Text)<=20) then
   begin
  Text:=(SdpoSerial1.ReadData);
   end
  else
  begin
  Label2.Caption:=Text;
  Text:='0';
  end;
- не работает. Прошу помощи у уважаемых программистов.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.03.2016, 08:39
Ответы с готовыми решениями:

Неблокирующее чтение с Serial Port Perl
Только начал изучать perl. Требуется написать модуль к проекту. В модуле должны быть реализованы...

Serial Port - прием данных
Добрый вечер! Пишу программу для работы с последовательным портом. Не работает прием данных. Также...

Serial port прием и вывод чистых данных
Всем привет столкнулся с такой проблемой, как прием данных через СОМ порт и вывод их на форму....

Вывод данных из Serial Port в Linux в файл
Требуется считывать данные из COM-порта в тестовый файл. Данные туда попадают от Arduino UNO. ...

1
0 / 0 / 0
Регистрация: 11.11.2014
Сообщений: 4
26.10.2017, 07:02 2
Посмотрел ссылки, почитал, попробовал... Но почему-то не работает, как нужно.
Идея (Работа через Zyxel):
1. Послать "+++"
2. Получить "ОК"
3. Послать "AT<Enter>"
4. Получить "ОК"
5. Послать "AT[команда]<Enter>"
6. Получить "ОК"
По факту проходит:
1,3,5 и через паузу все ответы 2,4,6 разом. Причем не все возвращают "OK".
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: char);
// ...
 
    if pos('+++',s)>0 then begin
      //i:=Form1.SdpoSerial1.WriteData('+++'); // Послать команду контроллеру
      Form1.SdpoSerial1.WriteData('+++'); // Послать команду контроллеру
      //Memo1.Append('Модем в режим команд '+inttostr(i));
      Memo1.Append('Модем в режим команд ');
      s:= Copy(s,pos('+++',s),length(s)-pos('+++',s)+1);
      sleep(3000);             //пауза ожидания перевода модема в режим команд
    end;
// ...
 
// Сразу за обработкой "+++" идет обработка "AT":
    if pos('at',s)>0 then begin
      {
      Form1.SdpoSerial1.WriteData(chr(13)+chr(10)+'+++'); // Послать команду контроллеру
      sleep(2000);             //пауза ожидания перевода модема в режим команд
// вот как узнать, когда ушло полностью?
      if Form1.SdpoSerial1.DataAvailable=false then Memo1.Append('_+1000_');
      if Form1.SdpoSerial1.DataAvailable=false then sleep(1000);
      if Form1.SdpoSerial1.DataAvailable=false then Memo1.Append('_+1000_');
      if Form1.SdpoSerial1.DataAvailable=false then sleep(1000);
      }
      Form1.SdpoSerial1.WriteData('at'+chr(13)+chr(10)); // Послать команду контроллеру
      sleep(500);
// вот как узнать, когда ушло полностью?
      //if SdpoSerial1.OnRxData=false then begin
      //end;
      s:= Copy(s,pos('at',s),x-pos('at',s)+1);
      Memo1.Append('Команда модему:'+s);
      Form1.SdpoSerial1.WriteData(s); // Послать команду модему
// вот как узнать, когда ушло полностью? Команда последняя и просто тупо ждем ответ в функции приема
      //sleep(500);              //пауза перед приёмом (может и не надо)
      Memo1.Append('Ответ модема:');
      //ShowMessage('AT='+s+'_');
    end;
// Функция приёма по факту прихода:
procedure TForm1.SdpoSerial1RxData(Sender: TObject);
begin
  // Случилось придти данным с контроллера
  Memo1.Append(Form1.SdpoSerial1.ReadData);
end;
=== ЛОГ:
СОМ1: 9600бод OnLine: 24.10.2017 2:15:25
+++ati
Модем в режим команд
Команда модему:at
Ответ модема:

+++at

OK

at
Модем в режим команд
Команда модему:ati
Ответ модема:

+++at

ERROR

ati
--- Сеанс завершен: 24.10.2017 2:16:11
Сохранено в H:\WZ\Lazarus_14\COM_P_RS232_(2)\20171024_021611.log
=======
То есть последнюю команду модем просто не увидел?
Что не так?
0
26.10.2017, 07:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.10.2017, 07:02
Помогаю со студенческими работами здесь

Работа Scilab Serial Port Library (COM port)
Как работает Scilab Serial Port Library ? (может кто то встречал описание подробное, поделитесь...

Как настраивать serial port под Linux для приёма данных от Arduino Uno
Здравствуйте! Есть устройство на базе Arduino Uno с которым ПК с Линкусом ( Федора )...

Как настраивать serial port под Linux для приёма данных от Arduino Uno
Здравствуйте! Есть устройство на базе Arduino Uno с которым ПК с Линкусом ( Федора )...

serial port
Здравствуйте. Использую стандартные классы .net для работы с ком портом. Работу с портом...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru