多线程,多接收模式串口类LsComm之二
2010-06-23 20:40:57 来源:WEB开发网5. Sander:当用 ExecuteByAutoSignalRecvMode,
BOOL bSuccess = ReadFile(m_hComm, lpBuf, dwCount, &dwBytesRead, &overlapped);
dwSignaledHandle=::WaitForMultipleObjects(3,WaitHandles,false,INFINITE);
或
this->m_pPort->GetSerialPort()->GetOverlappedResult(overlapped,this->m_InBufferCount,false)
这个两个函数
WaitForMultipleObject
或
GetOverlappedResult)
它会以 COMMTIMEOUTS 中设置的 timeout 来返回吗?也就是说 Overlapped 中的 Event 是在什么时候激活的?
答:这个问题我以前没有仔细考虑,真是不好意思。好像 COMMTIMEOUTS的TimeOut 仅对 ReadFile,WriteFile 起作用,具体可以看 MSDN 中 COMMTIMEOUTS 的描述。
WaitForSingleObject(m_ReadOverlapped.hEvent,dwMilliseconds)==WAIT_OBJECT_0)
会等待 m_ReadOverlapped.hEvent 事件置信号标志的时候返回。那么读取 时间什么时候返回呢,找了下面的一段话:
When reading from a communications device, the behavior of ReadFile is governed by the current
communication time-outs as set and retrieved using the SetCommTimeouts and GetCommTimeouts
functions. Unpredictable results can occur if you fail to set the time-out values. For more
information about communication time-outs, see COMMTIMEOUTS.
可见 SetCommTimeouts 对这 ReadFile 起作用,也就是对 m_ReadOverlapped.hEvent 起作用。因此定时间接收模式在 COMMTIMEOUTS 时也会置读事件的 hEvent,所以等待 时间的限制就有可能不太准确。
6. Hi_nihaoma:为什么我使用重叠方式打开串口,根据示例:
for(int j= 0; j< 10; j++)
{
if (!port2.Write(pBuf, 10000, overlapped))
{
DWORD dwBytesWritten;
WaitForSingleObject(event, INFINITE);
port2.GetOverlappedResult(overlapped, dwBytesWritten, TRUE);
}
if (!port2.Read(pBuf, 10, overlapped))
{
DWORD dwBytesRead;
if (WaitForSingleObject(event,1000) == WAIT_OBJECT_0)
{
TRACE(_T("Data was read from the serial port\n"));
port2.GetOverlappedResult(overlapped,dwBytesRead,FALSE);
}
else
TRACE(_T("No data was read from the serial port\n"));
}
port2.SetMask(EV_TXEMPTY);
port2.WaitEvent(dwMask,overlapped);
}
port2.GetOverlappedResult(overlapped,dwBytesRead,FALSE);
dwByteRead= 4啊???急急急!!!
答:感觉可能是接收的问题,不能所有容纳发送的全部数据,而引发异常吧。看你这行port2.Write(pBuf, 10000, overlapped);一次发送这么大的数据量 ,是不是这的问题, 我的计算机上只有一个串口,把2,3口连接后收发数据测试了一下。一次发送超过100个就会发生读地址错误,但是低于这个速率就没问题。可能是接收的速度跟不上吧 。具体问题正在找。
结束语:
本来早就想要改一下,可实在是没有时间,不是开玩笑,大概3个月没有时间上网看看新闻了。写程序,就是要认真仔细的面对自己写的每一行代码 ,不放过自己的每一个Bug。谁都希望自己的程序不出一个Bug,可这实在是说起来容易做起来难。希望大家看到Bugs要贴在下面,有时间我会努力改的。上面的一些问题自己的水平实在是太有限了 ,搞得还不是太清楚,希望如果谁知道,就告诉偶。有些问题就得摆出来,然后再一点点搞清楚才会有提高。如果只是默许的认为简单,容易,不求甚解,相反会害了自己。
本文配套源码
更多精彩
赞助商链接