多线程,多接收模式串口类LsComm之二
2010-06-23 20:40:57 来源:WEB开发网描述:一个串口通讯类
应用平台:Windows
版本:v1.2
上次我做的“多线程,多接收模式串口类LsComm”,说实在的有不少的问题。好不容易有一段空闲的时间,把以前发现的Bugs修改了一下。
一、Bugs修正
1.ERR : 修改了98下 AutoReceiveBySignal 模式不能正常执行的bug
原因: CcomPort::m_WriteOverlapped.hEvent 没有设置事件!!!!粗心,害人阿。导致在Win98下发送数据异常,不过奇怪在
Win2K正常,而且测试的时候忽略了测试环境平台的影响。
修改: 相应的代码
if(this->IsOverlapped())
{
this->m_hWriteEvent= ::CreateEvent(NULL,true,false,NULL);
if(this->m_hCloseEvent==NULL) return false;
this->m_WriteOverlapped.hEvent = this->m_hWriteEvent;
}
2.ERR : 修改了 ManualReceiveByQuery 模式下,发送会出现不动的情况。
原因: 在dwWriteBytes= this->m_pPort->Write(pBuf,Count);
前,串口已经设置中断,所以需要等待中断事件发生。
修改: 去掉中断设置的代码 this->m_pPort->GetSerialPort()->SetMask(dwStoredFlags);
3.ERR : 打开一个计算机上不存在的串口的时候没有异常捕获。
原因: 没有捕获 CserialPort 抛出的 CserialException 异常
修改: 不过对于异常的处理改为不抛出异常,不知道是否妥当?
try
{
this->m_pPort->Open(nPort,dwBaud,spParity,DataBits,spStopbits,spFC,m_IsOverlapped);
}
catch(CSerialException* pE)
{
//AfxMessageBox(pE->GetErrorMessage());
pE->Delete();
return false;
}
4.ERR : 感觉 AutoReceiveByBreak 意义不大应该去掉
原因: 全部的事件都可以用AutoReceiveBySignal方式实现
修改: 暂时保留:DWORD dwStoredFlags = EV_BREAK | EV_CTS | EV_DSR | EV_ERR | EV_RING |EV_RLSD | EV_RXCHAR | EV_RXFLAG ;
//??| EV_TXEMPTY 添加后在首次执行时总是接收不到全部数据 ,以后就正常了。现在还搞不清楚是什么原因。
5. ERR : 感觉 ManualReceiveByConst 意义不大应该去掉
原因: 实现方式不太好
修改: 暂时保留
赞助商链接