Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.011 c
15-1143789126
Курдль
2006-03-31 11:12
2006.04.23
Можно ли писать на Kylix под Solaris?


15-1142922769
Ученик чародея
2006-03-21 09:32
2006.04.23
213 вещей, которые запрещено делать в ВС США.


15-1143862359
Pazitron_Brain
2006-04-01 07:32
2006.04.23
Почему этот скрипт не отображает результат?


4-1137778074
Galiaf
2006-01-20 20:27
2006.04.23
Узнать частоту обновления экрана и сменить её.


8-1128977517
Alko
2005-10-11 00:51
2006.04.23
Обратный отсчте времени





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский