Taggy web engine
A new type of knowledge storing
Чтобы передать моему устройству информацию по 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 на этой странице. По ним вы можете подобрать соответствующий кварц и режим работы, чтобы ошибок не было совсем.

© Vladimir Smagin, 2007-2015