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

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

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

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

CAPTCHA
*

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

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


Комментарии
  • Игорь: Все настроил, еще раз просмотрел видео и методом научного тыка все настроил и сохранил, все работает и обе...
  • 21h: Здравствуйте, Игорь! Я не знаю :) Думаю аналогично согласно инструкции к вашей радиостанции.
  • Игорь: Добрый день, просмотрел Ваше видео все доступно и ясно для 8 ми канальных радеек, но мне нада настроить 69...
  • Гоги: Есть инструкция к Моторолкам – она подходит к серии Motorola TLKR T4… Т8. В конце сетка частот и...
  • 21h: торчок давно уже не обновлял, как только закрыл сайт где он работал. да, это морда для opentracker. без...
  • Buter: Какова дальнейшая жизнь торчка? Он кстати веб-интерфейсом для OpenTracker выступает? Без OpenTracker работать...
  • 21h: понятия не имею. гуглите инструкцию к вашей радейке и сверяйтесь с ней.
  • Денис: хочу их подружить с uv5r
  • Денис: t-388 walkie talkie на эти шпаргалочек нет,или как приминить ваши к их настройке?
  • John: Стекла для электроник – техночас.ру