№ 4453 В разделах: Electronics
Programming
от July 24th, 2012,
В подшивках: Lazarus, Pascal
Чтобы передать моему устройству информацию по 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 на этой странице. По ним вы можете подобрать соответствующий кварц и режим работы, чтобы ошибок не было совсем.
Fortune cookie: Today's spam: How BIG can I get?
Leave a Reply