调用winapi32函数读取串口疑问?
创建了一个工作线程用于监视串口
hCommWatchThread= CreateThread( (LPSECURITY_ATTRIBUTES) NULL, //安全属性
0,//初始化线程栈的大小,缺省为与主线程大小相同
(LPTHREAD_START_ROUTINE)CommWatchProc, //线程的全局函数
GetSafeHwnd(), //此处传入了主框架的句柄
0, &dwThreadID );
ASSERT(hCommWatchThread!=NULL);
//线程的全局函数
UINT CommWatchProc(HWND hSendWnd){
DWORD dwEvtMask=0 ;
SetCommMask( hCom, EV_RXCHAR|EV_TXEMPTY );//有哪些串口事件需要监视?
WaitCommEvent( hCom, &dwEvtMask, os );// 等待串口通信事件的发生 ,检测返回的dwEvtMask,知道发生了什么串口事件:
if ((dwEvtMask & EV_RXCHAR) == EV_RXCHAR)// 缓冲区中有数据到达
{
COMSTAT ComStat ;
DWORD dwLength;
ClearCommError(hCom, &dwErrorFlags, &ComStat ) ;
dwLength = ComStat.cbInQue ; //输入缓冲区有多少数据?
if (dwLength > 0)
{
BOOL fReadStat ;
fReadStat = ReadFile( hCom, lpBuffer,dwLength&dwBytesRead,&READ_OS( npTTYInfo ) );
if (!fReadStat)
{
if (GetLastError() == ERROR_IO_PENDING)
{
while(!GetOverlappedResult(hCom,&READ_OS( npTTYInfo ), & dwBytesRead, TRUE ))
{
dwError = GetLastError();
if(dwError == ERROR_IO_INCOMPLETE) continue;//缓冲区数据没有读完,继续
…… ……
::PostMessage((HWND)hSendWnd,WM_NOTIFYPROCESS,0,0);//通知主线程,串口收到数据
}
我的问题是:一旦缓冲区中有数据到达,我调用readfile函数读取指定数量数据,在本例子中readfile立即返回,此时调用GetLastError函数获取是否为ERROR_IO_PENDING
状态,再调用GetOverlappedResult函数(最后一个参数为true)判断如果没有读完,就继续读,但是我如何得到已经读到的数据呢?还有,串口不是传输慢,线程运行快吗?程序运行的时候,缓冲区中有数据到达标志,立刻就进行了读取,这个时候,串口的数据还没有完全到达呢,问题不是出现了吗?再说了,我还想得到我指定数目的数据不就不完整了吗?
请指教!!