|
|
|
COM-port асинхронная работа и чтение значений
|
|||
|---|---|---|---|
|
#18+
Работаю с COM-портом в асинхронном режиме. Компьютер является мастером, т.е. он инициализирует передачу данных. Принцип работы: Компьютер посылает команду, состоящую из нескольких байт, в течение ~1 сек должен получить ответ от железки (ответ может состоять из разного кол-ва байт). После чего исходя из полученных данных, что-то меняется на форме. Вот примерный код, как все это делается: автор DCB dcb; OVERLAPPED ovr; COMMTIMEOUTS ct; HANDLE port; DWORD bc; DWORD mask; ... void __fastcall TForm1::Button1Click(TObject *Sender) { dcb.DCBlength=sizeof(DCB); BuildCommDCB("baud=9600 parity=N data=8 stop=1",&dcb); dcb.fNull=TRUE; ct.ReadIntervalTimeout=1000; ct.ReadTotalTimeoutMultiplier=ct.ReadTotalTimeoutConstant=0; ct.WriteTotalTimeoutMultiplier=ct.WriteTotalTimeoutConstant=0; port=CreateFile("COM2",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED ,NULL); SetCommTimeouts(port,&ct); SetCommState(port,&dcb); PurgeComm(port,PURGE_TXCLEAR|PURGE_RXCLEAR); SetCommMask(port,EV_RXCHAR); // начало записи BYTE* pBuf = new BYTE[2]; AnsiString sb="AC"; HexToBin(sb.c_str(), pBuf, 2); WriteFile(port,pBuf,1,&bc,&ovr); //конец записи memset(&ovr,0,sizeof(ovr)); ovr.hEvent=CreateEvent(NULL,false,false,NULL); BYTE* pBuf1 = new BYTE[2]; ReadFile(port,pBuf1,1,&bc,&ovr); if(WaitForSingleObject(ovr.hEvent,1000)==WAIT_OBJECT_0) { GetOverlappedResult(port,&ovr,&bc,FALSE); } else { ShowMessage("error!"); } ResetEvent(ovr.hEvent); delete pBuf; delete pBuf1; CloseHandle(port); CloseHandle(ovr.hEvent); } Вопрос#1 С этим кодом возникли следующие проблемы, когда кликаем на Button1 первый раз все нормально байт отправился и байт получил (стоит перемычка Tx-Rx + LGComSpy++, Portmon). Когда жму на кнопку второй раз выскакивает ShowMessage("error!"). В чем может быть проблема? Вопрос#2 Как сделать отдельный обработчик что-то вроде onReceiveData, который бы вызывался как только получен первый байт пакета (при условии что известен максимальный размер пакета, напрмер 10 байт) Вопрос#3 Как организовать 9-битную передачу? Я так понимаю что 9 бит это бит паритета? как им управлять и читать его? ЗЫ. Буду признателен если разъясните как что сделать и какие ошибки я сделал :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2005, 16:00 |
|
||
|
COM-port асинхронная работа и чтение значений
|
|||
|---|---|---|---|
|
#18+
1.Use seperate thread to wait for event and then PostMessage to the Main thread. React on this Event. 2. WriteFileEx/ ReadFileEx. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2005, 00:35 |
|
||
|
COM-port асинхронная работа и чтение значений
|
|||
|---|---|---|---|
|
#18+
AndreiNz1.Use seperate thread to wait for event and then PostMessage to the Main thread. React on this Event. угу, спасиб. а вот если сделать wait for event не в отдельном thread, а в Application->OnIdle запихнуть? AndreiNz2. WriteFileEx/ ReadFileEx. Я несовсем корректно выразился наверное, про эти функции я знаю спасибо. :) а кто что может сказать насчет 9 битной передачи? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2005, 10:11 |
|
||
|
|

start [/forum/topic.php?fid=57&tid=2032824]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
52ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
33ms |
get tp. blocked users: |
1ms |
| others: | 244ms |
| total: | 371ms |

| 0 / 0 |
