Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.03.2015, 12:21   #1
mr_smit
Новичок
Джуниор
 
Аватар для mr_smit
 
Регистрация: 19.03.2009
Сообщений: 2
Вопрос Отправить запрос в COM порт, подождать, прочитать. Общение с устройством

Здравствуйте. Есть железка которая через переходник USB-RS485 подключена к компьютеру. Протокол простейший.

Пример
Отправляем: AB CD 01 01 86
Ответ: DC BA 01 01 68
и т.д.

Через терминал всё прекрасно работает. Задача отобразить получаемые данные в программе. Поставил компонент AsyncFree. Но не понимаю как подождать ответа от железки? Она отвечает сразу после получения запроса.

Код:
var
  Form1: TForm1;
  Zapros: array[0..4] of byte = ($AB,$CD,$01,$01,$86);
  ReadBuffer: array[0..254] of byte;
  CurrentPos: integer;
...
procedure TForm1.AfComPort1DataRecived(Sender: TObject; Count: Integer);
begin
  AfComPort1.ReadData(ReadBuffer[CurrentPos], Count);
  Inc(CurrentPos, Count);
  
  Label1.Caption:= IntToHex(ReadBuffer[3],2);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  CurrentPos:=0;
  AfComPort1.WriteData(Zapros, length(Zapros));
end;
Я посылаю запрос по таймеру раз секунду.
1-й запрос -> значение в label1 ноль
2-й запрос -> значение в label1 из 1-го запроса
3-й запрос -> значение в label1 из 2-го запроса
4-й запрос -> значение в label1 из 3-го запроса

Надо:
1-й запрос -> значение в label1 из 1-го запроса
2-й запрос -> значение в label1 из 2-го запроса
3-й запрос -> значение в label1 из 3-го запроса

Я понимаю что читаю данные до того как железка ответила. Но как подождать ответа?

Т.е. получается:
1. Один раз в секунду тикнул таймер и мы отправляем запрос;
2. Сидим и ждем пока нам придет 5 байт...;
3. Пришло? Считаем контрольную сумму и т.д...
4. Если всё хорошо, то отображаем 4-й байт в Label;
5. Повторяем пункты 1-4 до бесконечности.

Перечитал кучу статей, но нигде этот момент подробно не описан. Как можно сделать? Другой компонент, руками, всё равно. Программа из одной кнопки "Старт" и Label. Подскажите. Желательно код. Спасибо.

Последний раз редактировалось mr_smit; 26.03.2015 в 12:36.
mr_smit вне форума Ответить с цитированием
Старый 26.03.2015, 13:13   #2
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

Код:
procedure TForm1.AfComPort1DataRecived(Sender: TObject; Count: Integer);
begin
  AfComPort1.ReadData(ReadBuffer[CurrentPos], Count);
  Inc(CurrentPos, Count);
  
  if CurrentPos >= 3 then Label1.Caption:= IntToHex(ReadBuffer[3],2);
end;
northener вне форума Ответить с цитированием
Старый 26.03.2015, 19:36   #3
mr_smit
Новичок
Джуниор
 
Аватар для mr_smit
 
Регистрация: 19.03.2009
Сообщений: 2
По умолчанию

Блин, всё гениальное просто. Спасибо, заработало!
mr_smit вне форума Ответить с цитированием
Старый 27.03.2015, 01:35   #4
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

Рекомендую добавить ещё один таймер для контроля связи с железякой.
northener вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отправить данные на открытый порт Leelabsuper C/C++ Сетевое программирование 1 17.09.2014 14:23
Хочу тупо прочитать LPT порт под MSDOS и не могу... седьмой Паскаль, Turbo Pascal, PascalABC.NET 1 06.11.2013 22:13
Delphi. Можно ли отправить данные через порт открытый другой программой? losticsx Помощь студентам 2 24.08.2010 19:47
Как отправить несколько команд на COM порт sttauffen Компоненты Delphi 0 13.05.2009 18:16
http заголовок отправить прочитать RomanSamara Работа с сетью в Delphi 0 03.01.2009 21:01