Форум: "WinAPI";
Текущий архив: 2006.04.23;
Скачать: [xml.tar.bz2];
ВнизCOM-порт, как вставить обработчик события onRxChar в программу? Найти похожие ветки
← →
bvn123 (2006-01-31 13:37) [0]Здравствуйте.
Прошу подсказать (или указать ссылку), как организовать обработку события по приему символа COM-портом и как разместить обработчик этого события в самой программе ?
(Рекомендация использовать компонент на СОМ-порт не подходит: компонент есть, работает)
=====
Программа, работающая сейчас с подключенным к СОМ-порту микроконтроллером:
var Ovlp: OVERLAPPED
procedure TForm1.FormCreate(Sender: TObject);
begin
hndCOM:=CreateFile(..., 0 (*FILE_FLAG_OVERLAPPED*),0);
SetCommMask(hndCOM,EV_RXCHAR);
Ovlp.hEvent := CreateEvent(nil,true,false,PChar("onRXChar"));
end;
====
procedure TForm1.Button1Click()
определение полей DCB-структуры;
SetComState(...);
SetEvent(Ovlp.hEvent);
WriteFile(hndCOM, StrOut, J, Num, 0 (*@Ovlp*));
if WaitCommEvent(hndCOM,EventMask,@Ovlp) then
Timer1.Enabled=true;
======
procedure OnTimer1
ReadFile(..., 0 (*@Ovlp*));
=====
1) независимо от того, 0 или @Ovlp в WriteFile и в ReadFile, работает.
если же в CreateFile выбрать File_Flag_Overlapped, работать перестает (не появляется ответ микроконтроллера в соотв. окошке)
2)Функцией CreateEvent создано (верно ли создано?) событие onRXChar, как правильно вставить обработчик события в программу, чтобы вместо WaitCommEvent сделать обработчик:
procedure OnRxChar?
Что для этого нужно?
-Вставить в программе procedure onRXChar?
-нужно ли добавлять (Sender:TObject)?
-Нужно ли записывать его в private для TForm1?
-Если да, то какое значение указывать после слова message? EV_RXCHAR?
private procedure onRXChar; message EV_RXCHAR; (?)
Может, есть ссылка на пример с организацией обработчика в программе без создания компонента?
Спасибо.
← →
Kolan © (2006-01-31 13:46) [1]1. Определись с режимом работы. Если синхронный то
File_Flag_Overlapped
не нужен и о TOverlapped тоже забудь.
Если асинхронный то будь добр создать файл сFile_Flag_Overlapped
и причетении/записи передовать корекнию структуру TOverlapped.
2. Не уверен но кажется нет...
- Кажется надо смотретьSetCommMask
EV_RXCHAR
В статье про это написанноо...
Может, есть ссылка на пример с организацией обработчика в программе без создания компонента?
http://bcbsql.narod.ru/pub/rabcomm.htm
← →
bvn123 (2006-01-31 14:12) [2]Спасибо.
Статью читал, о создании обработчика события инф. нет.
Вашу тему также просматривал.
Я пользуюсь компонентом VarianAsync, там есть событие TVaComm.OnRxChar,
хотелось бы организовать похожее с Win API.
← →
Набережных С. © (2006-01-31 16:25) [3]
> bvn123 (31.01.06 14:12) [2]
> Статью читал, о создании обработчика события инф. нет.
Я сам, правда, указанной статьи не читал, но не думаю, что она сильно отличается от всех остальных, коих в сети море - не так уж много можно сказать о COM-порте в силу тривиальности темы. А потому, прочитав вот это:
> Что для этого нужно?
> -Вставить в программе procedure onRXChar?
> -нужно ли добавлять (Sender:TObject)?
> -Нужно ли записывать его в private для TForm1?
> -Если да, то какое значение указывать после слова message?
> EV_RXCHAR?
> private procedure onRXChar; message EV_RXCHAR; (?)
> Статью читал, о создании обработчика события инф. нет.
скажу откровенно: лучше тебе пока пользоваться готовым компонентом. Почему? Потому, что никто тебе здесь не скажет ничего нового, чего нет в практически любой статье по данной теме.
А на досуге неторопясь разбери исходный код компонента, перечитав еще пару-тройку раз статью. А если этот компонент без исходников, то выкинь его нафиг и скачай другой, каковых в сети как собак нерезанных.
← →
Evgeny V © (2006-02-01 07:54) [4]SetCommMask (EV_RXCHAR), WaitCommEvent проверить lpEvtMask на EV_RXCHAR. Рекомендую все же поискать статьи на Королевстве дельфи и в инете по работе с портом.
Очень хорош совет
> Набережных С. © (31.01.06 16:25) [3]
> А на досуге неторопясь разбери исходный код компонента,
> перечитав еще пару-тройку раз статью
http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=1126 - на Королевстве Дельфи есть и другие статьи. В этой просто кратенько по русски написано назначение функций и есть примеры реализаций
← →
tesseract © (2006-02-01 11:50) [5]Апшипки -
Для порта
FillChar(MaskOl,SizeOf(MaskOl),0);
ReadOl.hevent:=CreateEvent(nil,true,true,nil);
создание маски
FillChar(MaskOl,SizeOf(MaskOl),0);
MaskOl.hevent:=CreateEvent(nil,false,false,nil);
fMask:=EV_RXCHAR and not EV_RING; // для Win2k/XP - исбегаем ложных срабатовыний.
SetCommMask(hCom,fMask);
//честно говоря, так и не понял причину, но переменную,
//типа TOverlapped, если она используется, нужно
//объявлять в каждой процедуре(функции)
Бред полный бред. Почему так происходит см первый кусок кода.
//честно сказать, точное назначение кода обработки
//ошибки описанной ниже (ERROR_IO_PENDING) - не знаю!!!
//"срисовал" из известного примера tty.cpp
Ему тяжко было в HELP посмотреть??? Это значит что идёт незаконченная асинхронная операция .
← →
bvn123 (2006-02-01 13:18) [6]Спасибо откликнувшимся на мой вопрос.
Максимум информации на MSDN, встречавшиеся статьи - извлечения оттуда.
Попробую еще раз выставить на форумах тему, но более узко, скорее это вопрос не по COM-порту, а по организации событий и обработке сообщений в Delphi
← →
Набережных С. © (2006-02-01 13:30) [7]
> tesseract © (01.02.06 11:50) [5]
> fMask:=EV_RXCHAR and not EV_RING; // для Win2k/XP - исбегаем
> ложных срабатовыний
EV_RXCHAR and not EV_RING = EV_RXCHAR
← →
tesseract © (2006-02-01 14:02) [8]
> EV_RXCHAR and not EV_RING = EV_RXCHAR
Не везде. Реально бывают "ложные срабатывания".
Судя по всему в большинстве систем не встречается :-)
← →
Evgeny V © (2006-02-01 14:42) [9]bvn123 (01.02.06 13:18) [6]
Пример краткий части кода, более демонстративный, выполняется в отдельном потоке, но тем не менее рабочий. Вас здесь должно интерисовать, что делатеся по WaitCommEvent метка case WAIT_OBJECT_0 + 1:WaitCommEvent(PortHandle, FMask, @Mos);
sig := WaitForMultipleObjects(3, @b, false, INFINITE);
// жду три события - 1 выхода из потока,2 событие порта, собственно
//WaitCommEvent, 3 - в буфер записи добавлены данные для записи
case sig of
WAIT_OBJECT_0: // выход
begin
result := true;
exit;
end;
WAIT_OBJECT_0 + 1: // события порта
begin
if GetOverlappedResult(PortHandle, Mos, ByteTrans, false) then
// анализ на ошибке не привожу
begin
ResetEvent(Mos.hEvent);// Event создавал с ручным сбросом
if (FMask and EV_RXCHAR) <> 0 then
Rxproc;// тут делаем прием
if (FMask and EV_TXEMPTY) <> 0 then
TxProc;// если есть что передавать передаем
FMask := 0;
end
else // тут должен быть анализ на ошибку GetOverlappedResult
Дальше не расписываю, все это есть в статьях. У вас по коду увидел в первом посте проблемы с асинхронной работой порта, в частности с обработкой результата WaitCommEvent. На мой взгляд можно сделать проще и надежнее. на королевстве дельфи неплохие статьи по работе с портом, всеж таки рекомендую туда заглянуть. Есть и по асинхронной работе с портом. Работу с портом лучше вынести в отдельный поток
> tesseract © (01.02.06 14:02) [8]
>
> > EV_RXCHAR and not EV_RING = EV_RXCHAR
>
>
> Не везде. Реально бывают "ложные срабатывания".
> Судя по всему в большинстве систем не встречается :-)
Windows.pas EV_RXCHAR=1 EV_RING=$100 -> not EV_RING= $ FF FF FE FF
-> EV_RXCHAR AND EV_RING =EV_RXCHAR.
← →
Evgeny V © (2006-02-01 15:13) [10]Сорри, исправления, описка
Windows.pas EV_RXCHAR=1 EV_RING=$100 -> not EV_RING= $ FF FF FE FF
-> EV_RXCHAR AND NOT EV_RING =EV_RXCHAR.
← →
Набережных С. © (2006-02-01 16:08) [11]
> tesseract © (01.02.06 14:02) [8]
> Не везде.
Ага, особенно в военное время:)
← →
tesseract © (2006-02-02 13:42) [12]to Evgeny V>>
на королевстве дельфи неплохие статьи по работе с портом, всеж таки рекомендую туда заглянуть.
Если все такие на которую ты ссулку дал, то заглядывать не советую.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2006.04.23;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.013 c