6.11.2007

Event Communication on Comm Port : CE

由於ReadFile( )有很奇怪的特性,在Timeout的waiting period中,會block整個process (不是thread喔)。所以會導致整個AP沒反應。
所以在Read 的動作要使用event driven。
ref MSDN : Using Communication Event

// Specify a set of events to be monitored for the port.
SetCommMask (hPort, EV_RXCHAR);

while (1)
{
DWORD EvtMask;

WaitCommEvent (hPort, &EvtMask, 0);
SetCommMask (hPort, EV_RXCHAR);

while(1)
{
BYTE Byte;
DWORD BytesReaded;

ReadFile (hPort, &Byte, 1, &BytesReaded, 0);

if (BytesReaded == 1)
ProcessChar (Byte);
else
break;

}
}
也就是用 WaitCommEvent() C和 SetCommEventMask( )。
其中要注意的是每次WaitCommEvent( )前要重新設一次EventMask( )。

雖然不錯,但是還是有點缺陷呀...

可以Set的Event只有RX, TX, CTS, ..RING..etc。沒有timeout。
所以沒有辦法做到..."如果10sec內都沒有char送到,就return"的動作。

真可惜,在實際通訊時,這種功能是很實用的,可以用來取代一個 housekeeping thread,常常來monitor 通訊對方是不是還活著..

沒有留言: