WEB开发网
开发学院软件开发VC 多线程,多接收模式串口类LsComm之二 阅读

多线程,多接收模式串口类LsComm之二

 2010-06-23 20:40:57 来源:WEB开发网   
核心提示:描述:一个串口通讯类应用平台:Windows版本:v1.2上次我做的“多线程,多接收模式串口类LsComm”,多线程,多接收模式串口类LsComm之二,说实在的有不少的问题,好不容易有一段空闲的时间,m_IsOverlapped);}catch(CSerialException* pE){ //

描述:一个串口通讯类

应用平台: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 意义不大应该去掉

原因: 实现方式不太好

修改: 暂时保留

1 2 3 4  下一页

Tags:线程 接收 模式

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接