INT 21h

Hi, I am Vladimir Smagin, sysadmin. Telegram Email

Lazarus: работа с последовательным портом

№ 4453 В разделах: Программирование Электроника от July 24th, 2012,

Чтобы передать моему устройству информацию по UART и не придумывать очередной велосипед (а велосипедистов в Lazarus тьма просто), я использую уже готовую мультиплатформенную библиотеку Synaser. Ее даже устанавливать не надо. Просто распакуйте в директорию с программой и добавьте ее в Uses.

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ComCtrls,synaser,strutils;

Кстати, чтобы программа собралась под Linux, мне пришлось наложить небольшой патч. Откройте файл synaser.pas и исправьте строку 1902 с SerialCheck(fpioctl(FHandle, TCFLSH, Pointer(TCIOFLUSH))); на SerialCheck(fpioctl(integer(FHandle), TCFLSH, Pointer(TCIOFLUSH)));. Ошибка не страшная, но запутать вопросом “какого хрена не собирается?!” может.

На сайте библиотеки есть примеры использования, но они не охватили использование обработчиков ошибок. А они ой как полезны! Например, возмем уже известный пример и добавим в него проверку на ошибки.

function send(port:string; data:string):string;
var
  ser: TBlockSerial;
  answer:string;
begin
  ser:=TBlockSerial.Create;
  try
    ser.connect(port);
    if ser.LastError>0 then ShowMessage(ser.LastErrorDesc);
    ser.config(9600,8,'N',0,false,false);
    if ser.LastError>0 then ShowMessage(ser.LastErrorDesc);
    ser.sendstring(data);
    if ser.LastError>0 then ShowMessage(ser.LastErrorDesc);
    answer := ser.Recvstring(2000);
    if ser.LastError>0 then ShowMessage(ser.LastErrorDesc);
    if ser.LastError>0 then Exit;
  finally
    ser.free;
  end;
  Result := answer;
end;

Программа отправит что-то микроконтроллеру и что-то должна получить в ответ. Скорость 9600 обычно стоит везде по умолчанию. Ее выбираю и я для своих устройств ser.config(9600,8,'N',0,false,false);. Чтобы обработать ошибочные ситуации в библиотеке есть переменные с ошибкой последнего действия. Я не стал делать exit из try сразу, но правильней было бы выйти сразу же при ошибке, но это вы уже сами сделаете в своих программах, а сейчас главное узнать о возможностях. LastError хранит 0, если последний вызов функций библиотеки был без ошибок, а LastErrorDesc покажет вам объяснение что именно случилось. Ну и конечно в конце полученный ответ возвращаем туда, откуда вызвали функцию send.

Обращаю ваше внимание на то, что у микроконтроллеров, работающих на некоторых частотах, возможны сбои при передачи информации! Иногда пакет с данными нужно отправлять дважды. Изучите таблицы 6-2 Determining Baud Rate на этой странице. По ним вы можете подобрать соответствующий кварц и режим работы, чтобы ошибок не было совсем.

Нет комментариев »

Leave a Reply

Your email address will not be published. Required fields are marked *

*

Комментарии

  • 21h: нене ) без меня )
  • Серегй: Не совсем грабить)) если грабить можно и без рации, есть...
  • 21h: магазин грабить собрались? ) не, тут я не помощник ;)
  • Серегй: А что бы мне поймать чужую волну, что мне для этого нужно...
  • 21h: слушать никто не запрещает. нет закона, который запрещает...
  • Серегй: Я хотел узнать могу ли я просто прийти с данной рацией baofeng...
  • 21h: У меня есть только эти 2. По другим ничего не знаю. В интернете...

© Vladimir Smagin, 2005-2017. Копирование материалов без разрешения запрещено.
Яндекс.Метрика