Тонкости работы с COM портом

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Re: Тонкости работы с COM портом

Сообщение svk12 » 24.06.2011 19:05:10

Код: Выделить всё
a:=ser.RecvPacket(100);

'ser' пытается в течении 100 мипписекунд считывать данные из "com1",
после чего добавляет полученную строку в "Memo1" и завершает работу.
Вы уверены, что на вход "com1" каждые 100мс поступают какие-то данные?
svk12
постоялец
 
Сообщения: 407
Зарегистрирован: 09.06.2008 18:42:47

Re: Тонкости работы с COM портом

Сообщение xcod » 24.06.2011 21:07:20

если честно, я уже не уверен..
xcod
постоялец
 
Сообщения: 108
Зарегистрирован: 07.08.2009 12:37:23

Re: Тонкости работы с COM портом

Сообщение svk12 » 25.06.2011 00:17:59

Ну, тогда чтение порта следует зациклить.
А чтобы прога не вставала колом в ожидании приёма, поместить цикл в отдельный поток...
svk12
постоялец
 
Сообщения: 407
Зарегистрирован: 09.06.2008 18:42:47

Re: Тонкости работы с COM портом

Сообщение v-t-l » 25.06.2011 13:43:20

svk12 писал(а):А чтобы прога не вставала колом в ожидании приёма, поместить цикл в отдельный поток...

Достаточно в цикле вызывать Application.ProcessMessages().
v-t-l
энтузиаст
 
Сообщения: 728
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Re: Тонкости работы с COM портом

Сообщение xcod » 25.06.2011 19:33:10

Разобрался :)
ком порт был неисправен :D
спасибо всем откликнувшимся и извиняюсь за беспокойство :oops:
буквально сейчас на домашнем компе проверил все работает
xcod
постоялец
 
Сообщения: 108
Зарегистрирован: 07.08.2009 12:37:23

Re: Тонкости работы с COM портом

Сообщение Sash0k » 29.07.2011 10:57:17

Прочел тему, возникает вопрос:
Упоминаются 2 компонента для работы по rs232: synaser и cportlaz.

Как раз неспешно подыскиваю подобный компонент для следующих задач:
  • Обмен данными с микроконтроллером по текстовому протоколу
  • Управлением модемом через АТ-команды (практически равносильно первому пункту)

Хочется получить готовый кроссплатформенный класс для передачи данных по rs232. Сейчас у меня есть исходники своего старого проекта для Delphi7.
Если найдется готовый класс/компонент для модема, будет здорово, если нет - напишу.
Цель: перевод ПО на GNU/Linux-x86 и в перспективе на GNU/Linux-arm

Так вот, что из вышеперечисленного посоветуете, либо может кто предложит свою реализацию?
Sash0k
новенький
 
Сообщения: 43
Зарегистрирован: 19.01.2009 11:39:27
Откуда: Вятка - Киров

Re: Тонкости работы с COM портом

Сообщение mig-31 » 29.07.2011 11:06:36

Однозначно synaser.
mig-31
постоялец
 
Сообщения: 224
Зарегистрирован: 14.07.2011 13:46:48

Re: Тонкости работы с COM портом

Сообщение Sash0k » 29.07.2011 11:15:43

ага, сейчас как-раз изучаю его исходники. Напрягает то что последний релиз был в 2009, а fpc за это время ушел далеко вперед.
Sash0k
новенький
 
Сообщения: 43
Зарегистрирован: 19.01.2009 11:39:27
Откуда: Вятка - Киров

Re: Тонкости работы с COM портом

Сообщение Dimmrf » 31.07.2011 14:56:15

Здравствуйте товарищи форумчане!
Решил заняться работой с com-портом с помощью lazarus ис-под linux mandriva
Подключил Synaser

Вот прога:

uses
Linux, Synaser, Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

procedure TForm1.Button1Click(Sender: TObject);
var
WriteBytes: array [1..5] of Byte;
a: Byte;
ser:TBlockserial;
begin

ser:=TBlockserial.Create; //создаем устройство
ser.RaiseExcept:=false; //не обрабатываем исключения ошибок связи
ser.Connect('com1'); //соединяемся с портом
ser.Config(115200,8,'N',0,false,false);//настраиваем скорость, стоп биты, паритет

WriteBytes[1]:=1;
WriteBytes[2]:=2;
WriteBytes[3]:=3;
WriteBytes[4]:=4;

ser.SendInteger((WriteBytes[1] shl 0)or(WriteBytes[2] shl 8)or(WriteBytes[3] shl 16)or(WriteBytes[4] shl 24));
ser.Free;

end;
end.

При выполенении строки
ser.Connect('com1');
Выдается ошибка:
Проект вызвал класс исключения RunError(5)
и указывает на строку Rewrite(f) в файле synaser.pas вот в этой процедуре:


procedure TBlockSerial.CreateLockfile(PidNr: integer);
var
f: TextFile;
s: string;
begin
// Create content for file
s := IntToStr(PidNr);
while length(s) < 10 do
s := ' ' + s;
// Create file
try
AssignFile(f, LockfileName);
try
Rewrite(f);
writeln(f, s);
finally
CloseFile(f);
end;

Что делать? Подскажите...
Dimmrf
незнакомец
 
Сообщения: 1
Зарегистрирован: 31.07.2011 13:59:41

Re: Тонкости работы с COM портом

Сообщение svk12 » 01.08.2011 12:06:06

Нужно дать юзверю права на запись для директории /var/run/lock, где создаётся LockfileName.
svk12
постоялец
 
Сообщения: 407
Зарегистрирован: 09.06.2008 18:42:47

Re: Тонкости работы с COM портом

Сообщение TEvg » 27.08.2011 12:20:35

При работе через Synaser с СОМ портом на прием - необходимо постоянно гонять в цикле чтение порта? Другого способа нет? Повесить куда-нибудь обратчик события, к примеру, что в порт что-то пришло - нельзя?
TEvg
новенький
 
Сообщения: 15
Зарегистрирован: 14.07.2011 06:53:50

Re: Тонкости работы с COM портом

Сообщение Mr.Smart » 27.08.2011 12:49:46

Нужно мониторить.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Тонкости работы с COM портом

Сообщение Sash0k » 29.09.2011 22:38:40

TEvg писал(а):При работе через Synaser с СОМ портом на прием - необходимо постоянно гонять в цикле чтение порта? Другого способа нет? Повесить куда-нибудь обратчик события, к примеру, что в порт что-то пришло - нельзя?


Присоединяюсь к вопросу.
Synaser - синхронный. Но иногда асинхронный обмен будет удобней.
Например, есть устройство.
Ему посылается команда, оно начинает ее исполнять. По окончанию возвращает "ОК". Время выполнения, в зависимости от команды, может занять секунды или даже минуты. Если в это время долбиться в порт с ожиданием ответа (пусть даже в потоке) - это лишняя трата системных ресурсов. Гораздо лучше иметь событие, выполняющееся по приходу данных в порт, и по нему написать нужный обработчик. А программа во время выполнения устройством команды пусть занимается другими полезными делами.

Может кто занимался подобным, как бы это реализовать для fpc. ОС - linux.
Sash0k
новенький
 
Сообщения: 43
Зарегистрирован: 19.01.2009 11:39:27
Откуда: Вятка - Киров

Re: Тонкости работы с COM портом

Сообщение alexrayne » 30.09.2011 11:20:40

я использую обертки стандартных вызовов файловых операций, и радуюсь. набрать несколько строк кода мне проще чем пилить целый компонент и возиться с его универсальностью и переносимостью.
alexrayne
постоялец
 
Сообщения: 125
Зарегистрирован: 03.12.2008 16:56:26

Re: Тонкости работы с COM портом

Сообщение zig » 12.02.2012 16:24:31

Столкнулся со следующими проблемами:

Работал в Ubuntu 11.10 через Synaser с виртуальными com портами ttyUSB* устройств на базе FTDI.

1. Все получалось замечательно пока не стал перетыкать USB. То есть делаю в программе дисконнект (или вообще закрываю программу), а потом перетыкаю устройство в другой порт или просто обратно в этот же порт. После этого нормально связаться с устройство не получалось: оно не отвечало на запросы, хотя коннект в системе проходил нормально.
Начал смотреть осциллографом и увидел что FTDI шарашит данные с компа на какой то бешенной скорости. Я всегда после коннекта конфигурю порт на 921600. А тут скорость в два раза выше (под два мегабита). В общем получалось что порт не воспринимал конфигурацию после перетыкания USB устройства. Проверил через терминал - да, порт якобы на скорости 921600.
Тогда я предположил что порт не воспринимает повторную конфигурацию если он уже сконфигурирован с такими параметрами (а на самом деле он сбойнул и работает на 1843200, допустим).
Тогда я сделал двойной вызов конфигурации, первый с той которая мне не нужна (с другими параметрами), а второй с нужными параметрами:
Код: Выделить всё
ser1.Config(460800,8,'N',SB1,false,false);
ser1.Config(921600,8,'N',SB1,false,false);

И все заработало!
Может я не до конца разобрался, но пока иного решения проблемы не нашел.

2. Еще проблема:
При инициализации в порт попадает какой то мусор. Я отправляю в устройство ПЕРВУЮ команду, а устройство отвечает что неизвестная команда (очевидно что туда перед моей посылкой уже попал какой то мусор). Дальше все нормально. Вызов purge перед отправкой не помогает (видимо данные уже отправлены). В виндах такого не было. Что за мусор не посмотрел (это надо подключаться с отладкой к контроллеру устройства).
Решил все просто: первую команду отсылаю дважды.
zig
незнакомец
 
Сообщения: 5
Зарегистрирован: 15.10.2011 16:46:46

Пред.След.

Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 50

Рейтинг@Mail.ru