Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.23;
Скачать: CL | DM;

Вниз

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 вся ветка

Текущий архив: 2006.04.23;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.274 c
3-1141056218
Sollo
2006-02-27 19:03
2006.04.23
dbexpress нужна временная таблица ?


15-1143469715
Shweps
2006-03-27 18:28
2006.04.23
Документация


3-1140813732
shulik
2006-02-24 23:42
2006.04.23
База mysql+Delphi+TStringGrid


3-1141203381
Alex_d
2006-03-01 11:56
2006.04.23
IAppServer


4-1138915613
den_c
2006-02-03 00:26
2006.04.23
Язык системы.