Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Снова ComPort 3.1. Необходимо обрабатывать событие
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
smk
Мне нужно чтобы по приходу пакета из 14 байт в COM порт запускался обработчик этого события. Можно ли это сделать с помощью компонента ComPort 3.1 ? Есть ли возможность обнаружить это событие? Значение всех 14 байт может быть любым, все байты значащие. Спасибо.
DpInRock
Цитата
while (1)
{
ReadFile(handler,buffer[0],255,tail,nil);
if (tail>=14) then
begin
//тут обработчик вашего события.

end;

}

Так выглядит решение вашей задачи с использованием WinAPI.
Рекомендую выбросить на помойку компонент. Ибо вы все равно не пользуетесь возможностями объектно-ориентированного программирования. А используете данный объект просто как библиотеку.

Открытие компорта чуть сложнее.
Код
CommTimeOuts:_CommTimeOuts;
DCB:_DCB;
Procedure OpenPort(s:string);
var c:dword;
begin
r_head:=0;r_tail:=0;r_point:=0;r_inv:=0;r_state:=0;
if (hand>0) and (hand<>$FFFFFFFFF) then ClosePort;
c:=CreateFile(PAnsiChar('\\.\'+s),GENERIC_READ or GENERIC_WRITE,0,
              nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,0);
if (c=$FFFFFFFF) then  c:=0;
CommTimeOuts.ReadIntervalTimeout:= $FFFFFFFF;
CommTimeOuts.ReadTotalTimeoutMultiplier:= 0;
CommTimeOuts.ReadTotalTimeoutConstant:= 0;
CommTimeOuts.WriteTotalTimeoutMultiplier:= 0;
CommTimeOuts.WriteTotalTimeoutConstant:= 1500;
if (c>0) then
SetCommTimeouts(c, CommTimeOuts);
if (c>0) then begin
              getcommstate(c,dcb);

              //DCB.DCBlength:=0;
              DCB.BaudRate:=115200;//256000;
              DCB.Flags:=$1001;
              //DCB.XonLim:=0;
              //DCB.XoffLim:=0;
              DCB.ByteSize:=8;
              DCB.Parity:=0;
              DCB.StopBits:=0;

              //BuildCommDCB('256000,N,8,1',DCB);
              SetCommState(c, DCB);
              EscapeCommFunction(c,CLRRTS);
              EscapeCommFunction(c,CLRDTR);
              end;


w_head:=0;w_tail:=0;
hand:=c;
end;


Ну а дальше, все, что требуется, запустить отдельный поток с "while(1)...".
Таким образом в буфере вы всегда будете иметь принятые данные. Вся информация о текущем количестве у вас будет.
Для счастья больше ничего не требуется.
И все это занимает 50 строк на паскале.
smk
Спасибо за ответ. Выбросить конечно можно, но с моим Borland C++ Builder 6 пока по-другому ничего не получалось. Если можно обойтись без компонента так чтобы были примеры - можно бы попробовать. А если есть возможность с помощью ComPort 3.1 добиться того, что нужно, то наверно мне проще было бы так.
DpInRock
Это все у меня в Дельфи. Тоже пользовался компонентами. Теперь понял, что все эти компоненты - отстой полный.

А добиться вашим компонентом легко. Есть у вас событие по приему данных. Ну проверяйте внутри него количество... Что тут такого-то?
В чем проблема? Естетственно, учитывать следует, что ровно 14 байт в буфере будет исключительно редко. Ибо у контроллера ком порта есть фифо. Из которого данные забираются сразу все.
smk
Принимать по одному думал, но решил, что не спортивно на каждый байт отвлекаться. Хочется прочитать пакет целиком, тем более, что функция чтения буфера проста и понятна. Конечно можно вести счетчик и по приему последнего вынимать буфер. Если ничего толковей не найду - так и сделаю. Там в компоненте есть событие по приему пакета, но нужно указывать первый и последний байты (как я понял заголовочный и последний). Ее бы приспособить..
DpInRock
Вообще-то у такого рода компонентов есть собственный буфер, достаточно большой. Не надо вообще ничего делать.
А чтобы не отвлекаться - использовать надо этот компонент в отдельном потоке. Пусть декодирует пакеты так, как будто это одна единственная задача.
Единственная проблема, визуальное проектирование для отдельного потока не катит. Там все руками надо.
(Что намного сложнее, чем написать все это используя винапи. ).
smk
Спаибо. Буду думать дальше.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.