INT 21h

Домашняя страница самого страшного прерывания

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 на этой странице. По ним вы можете подобрать соответствующий кварц и режим работы, чтобы ошибок не было совсем.

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

Оставьте ваш комментарий »

Форма отправки комментария

*

Разрешенные HTML-теги:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

RSS RSS Feed только для этого поста |


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