Microsoft KB Archive/175551: Difference between revisions
(stage2) |
m (Text replacement - "&" to "&") |
||
(2 intermediate revisions by the same user not shown) | |||
Line 48: | Line 48: | ||
BYTE ReadBuffer[1024]; | BYTE ReadBuffer[1024]; | ||
GetCommTimeouts (hPort, & | GetCommTimeouts (hPort, &CommTimeouts); | ||
CommTimeouts.ReadIntervalTimeout = MAXDWORD; | CommTimeouts.ReadIntervalTimeout = MAXDWORD; | ||
CommTimeouts.ReadTotalTimeoutMultiplier = 0; | CommTimeouts.ReadTotalTimeoutMultiplier = 0; | ||
CommTimeouts.ReadTotalTimeoutConstant = 0; // Read timeout at 50msec | CommTimeouts.ReadTotalTimeoutConstant = 0; // Read timeout at 50msec | ||
SetCommTimeouts (hPort, & | SetCommTimeouts (hPort, &CommTimeouts); | ||
SetCommMask (hPort, EV_RXCHAR | EV_CTS | EV_DSR | EV_RLSD | EV_RING); | SetCommMask (hPort, EV_RXCHAR | EV_CTS | EV_DSR | EV_RLSD | EV_RING); | ||
while (!v_bStopThread) { | while (!v_bStopThread) { | ||
WaitCommEvent (hPort, & | WaitCommEvent (hPort, &fdwCommMask, 0); | ||
// Reset the comm Mask | // Reset the comm Mask | ||
SetCommMask (hPort, EV_RXCHAR | EV_CTS | EV_DSR | EV_RING); | SetCommMask (hPort, EV_RXCHAR | EV_CTS | EV_DSR | EV_RING); | ||
if (fdwCommMask & | if (fdwCommMask &= EV_RXCHAR) { | ||
// Loop getting data. | // Loop getting data. | ||
Line 68: | Line 68: | ||
while (TRUE) | while (TRUE) | ||
{ | { | ||
ClearCommError( hPort,& | ClearCommError( hPort,&dwErrors,&Stat); | ||
if (!Stat.cbInQue) | if (!Stat.cbInQue) | ||
break; | break; | ||
Line 74: | Line 74: | ||
{ | { | ||
ReadFile ( hPort, | ReadFile ( hPort, | ||
& | &ReadBuffer, | ||
(Stat.cbInQue | (Stat.cbInQue>1024)?1024:Stat.cbInQue, | ||
& | &BytesTransferred, | ||
0 | 0 | ||
); | ); |
Latest revision as of 12:30, 21 July 2020
INFO: Serial Communications on Windows CE HPC devices |
Q175551
The information in this article applies to:
- Microsoft Win32 Application Programming Interface (API), included with:
- Microsoft Windows CE
SUMMARY
Unlike other Win32 platforms, the Windows CE serial driver is implemented as overlapped. This means it can handle multiple concurrent I/O requests even though file handles must be opened as non-overlapped.
MORE INFORMATION
On most Win32 platforms, the I/O manager serializes non-overlapped serial communications. This implies that if there is an I/O request that is blocked, any subsequent I/O request will also be blocked until the pending I/O request completes. This is true even if each request was made from a separate thread.
While the Windows CE API does not support overlapped I/O, the serial driver is implemented as overlapped, that is, it can handle multiple concurrent I/O requests even though file handles are opened as non-overlapped. Therefore, serial communications programs on Windows CE devices have the following implementation option, which will not work on other Win32 platforms. A reading thread may call WaitCommEvent and when a RX_CHAR event arrives then call ReadFile to read characters from the port. The exact amount of data to read can be obtained by calling ClearCommError. A separate thread may simultaneously write to the port without hanging. The following sample code demonstrates this read technique.
Sample Code
DWORD WINAPI ReadThread (LPVOID pvarg) { DWORD BytesTransferred; DWORD fdwCommMask; DWORD dwErrors; COMSTAT Stat; COMMTIMEOUTS CommTimeouts; DWORD t; BYTE ReadBuffer[1024]; GetCommTimeouts (hPort, &CommTimeouts); CommTimeouts.ReadIntervalTimeout = MAXDWORD; CommTimeouts.ReadTotalTimeoutMultiplier = 0; CommTimeouts.ReadTotalTimeoutConstant = 0; // Read timeout at 50msec SetCommTimeouts (hPort, &CommTimeouts); SetCommMask (hPort, EV_RXCHAR | EV_CTS | EV_DSR | EV_RLSD | EV_RING); while (!v_bStopThread) { WaitCommEvent (hPort, &fdwCommMask, 0); // Reset the comm Mask SetCommMask (hPort, EV_RXCHAR | EV_CTS | EV_DSR | EV_RING); if (fdwCommMask &= EV_RXCHAR) { // Loop getting data. // Need to loop because our buffer is only 1024 bytes while (TRUE) { ClearCommError( hPort,&dwErrors,&Stat); if (!Stat.cbInQue) break; else { ReadFile ( hPort, &ReadBuffer, (Stat.cbInQue>1024)?1024:Stat.cbInQue, &BytesTransferred, 0 ); // do something with data } // Loop around and check for more data // In case additional byte has arrived while reading. } } } return 0; }
Additional query words:
Keywords : kbAPI kbKernBase kbOSWinCEsearch kbComPort
Issue type : kbinfo
Technology : kbAudDeveloper kbWin32sSearch kbWin32API
Last Reviewed: January 15, 2000 |