Форум программистов
 
Регистрация на форуме тут, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Как купить рекламу на форуме


Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме 20000 рублей в месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.07.2019, 20:48   #1
gromdel
Пользователь
 
Регистрация: 24.04.2012
Сообщений: 60
По умолчанию Читать comport

Здравствуйте, дорогие программисты.
Сегодня начал изучать comport, arduino (ардуино это другой вопрос)
С ардуино посылаются данные (цыфры). я хочу читать порт, через делфи. Записывать через определенное время в файл. и данные из файла отправлять на веб-сервер. далее отображать в виде графика на сайте. Все пункты мне подсильны, кроме чтения com порта. (пользовался и гуглом и форумом)
Подскажите пожалуйста, почему я не могу вывести прочтенные данные из com port в memo. Выходит пустота. api и прочее я бросил. скачал компонент afcomport . Терминал показывает, что приходят данные, а афкомпорт не пишет их в мемо.
Бросил самому что-то делать. Загуглил решение, думал, сейчас все заработает, но нет..
Код:
procedure TForm1.AfComPort1DataRecived(Sender: TObject; Count: Integer);
var  s: string;
begin
  try
    rcvStr := rcvStr + AfComPort1.ReadString;
      if pos('#',rcvStr)<>0  then  
          begin
            s:=copy(rcvStr,0,pos('#',rcvStr)-1);   
            Memo2.Lines.Add(s);
            Delete(rcvStr ,0,pos('#',rcvStr)); 
          end;  
  except
  end;
end;
Может будут варианты? Смотрю с 2005 года над этой проблемой бьются и постоянно не состыковки и неработоспособность кода (у криворуких, как я)

Последний раз редактировалось Вадим Мошев; 26.07.2019 в 22:53.
gromdel вне форума Ответить с цитированием
Старый 26.07.2019, 21:10   #2
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,300
По умолчанию

Да чё там делать то?

ReadString читает строку до появления пары символов NL=#$13#$10. Если ваша arduino их не отправляет, то вы ничего и не считаете.

Какой таймаут у компонента?

Плюс вопрос какая версия Delphi у вас?
Строки бывают ANSI,Unicode, Utf8 в каком формате у вас строке передаются и в каком читаются?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 26.07.2019 в 21:16.
Pavia на форуме Ответить с цитированием
Старый 26.07.2019, 21:18   #3
gromdel
Пользователь
 
Регистрация: 24.04.2012
Сообщений: 60
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
Да чё там делать то?

ReadString читает строку до появления пары символов NL=#$13#$10 если ваша arduino их не отправляет, то ваша ничего afcomport ничего не считает.

Какой таймаут у компонента?

Плюс вопрос какая версия Delphi у вас?
Строки бывают ANSI,Unicode, Utf8 в каком формате у вас строке передаются и в каком читаются?
Добрый вечер!
1. тайм аут у компонента я не нашел, что такое. (скорость 9600). А ардуино delay(500);
2. Делфи 7


Цитата:
Сообщение от Pavia Посмотреть сообщение
в каком формате у вас строке передаются и в каком читаются?
) Я что-то не указал в самом ардуино? (формат отправляемых данных
или в самой делфе не указал что-то?
gromdel вне форума Ответить с цитированием
Старый 26.07.2019, 22:45   #4
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,300
По умолчанию

Цитата:
Сообщение от gromdel Посмотреть сообщение
) Я что-то не указал в самом ардуино? (формат отправляемых данных или в самой делфе не указал что-то?
Это сложный вопрос. Но сейчас его опустим. Насколько я знаю по умолчанию у arduino ansi строки как и у Delphi 7.


Тогда путь такой. 1 проверяем провода. GND ком портов должна быть соединена для выравнивания потенциала. Что-бы 0 у компа был равен 0 у микроконтролёра.

TX, RX должны быть соединены крест-накрест
TX->RX
RX->TX

Запускаем любой терминал: WindowsTerminal, Putty, Terminal 1.9b
Лучше последнюю программу из списка.
Пробуем передавать и читать данные. Если данные приходят и не бьются не пропадают. Значит с железом всё нормально. Если данные не доходят или бьются то проблема аппаратная. Контакт плохой.

Собственно далее пробуйте в своей программе читать группу байт.

Если всё ок можно переходить к строкам. Тут навечки думают что если они напишут writestring то readstring сработает. Это не так, так как без символов <конец строки> процессор не знает когда остановиться и будет читать до отказа.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia на форуме Ответить с цитированием
Старый 27.07.2019, 01:51   #5
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,694
По умолчанию

Цитата:
Сообщение от gromdel Посмотреть сообщение
Загуглил решение, думал, сейчас все заработает, но нет..
Бредовое решение. Событие TAfComPort.OnDataRecived вызывается когда в буфере СОМ-порта появляется некоторое количество байт. Как правило это 4 или 8, но возможны и другие варианты. В любом случае количество принятых СОМ-портом байт указано в параметре Count. В обработчике этого события нужно просто принять эти байты процедурой/функцией типа Read или ReadBuffer или что там в этом компоненте как называется. Но ни в коем случае не ReadString!
ReadString процедура синхронная. Она не должна использоваться в асинхронном обработчике.

Последний раз редактировалось northener; 27.07.2019 в 01:58.
northener вне форума Ответить с цитированием
Старый 27.07.2019, 18:34   #6
gromdel
Пользователь
 
Регистрация: 24.04.2012
Сообщений: 60
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
Бредовое решение. Событие TAfComPort.OnDataRecived вызывается когда в буфере СОМ-порта появляется некоторое количество байт. Как правило это 4 или 8, но возможны и другие варианты. В любом случае количество принятых СОМ-портом байт указано в параметре Count. В обработчике этого события нужно просто принять эти байты процедурой/функцией типа Read или ReadBuffer или что там в этом компоненте как называется. Но ни в коем случае не ReadString!
ReadString процедура синхронная. Она не должна использоваться в асинхронном обработчике.
Спасибо за наводку. Про readbuffer, не знал про синхронную и ассинхронную передачу. Вернее в теории то знал, а при разработке...
Код:
 ComPort1.ReadStr(Buf, Count);
 memo1.Lines.Add(buf);
gromdel вне форума Ответить с цитированием
Старый 28.07.2019, 01:33   #7
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,694
По умолчанию

Цитата:
Сообщение от gromdel Посмотреть сообщение
Спасибо за наводку. Про readbuffer, не знал про синхронную и ассинхронную передачу. Вернее в теории то знал, а при разработке...
Не за что.
Осталось почитать теорию про асинхрон и синхрон. Если с ардуино что-то пойдёт не так.
northener вне форума Ответить с цитированием
Ответ
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi 7 ComPort library sarsen Помощь студентам 2 04.12.2016 21:08
ComPort Library tarakan1983 Компоненты Delphi 11 21.07.2016 22:39
Установка comport на ХЕ IliaIT Компоненты Delphi 7 22.10.2015 16:47
ComPort fedor6124 Общие вопросы Delphi 0 28.10.2011 20:22



Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS