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

描述:一个串口通讯类

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

原因: 实现方式不太好

修改: 暂时保留

时间: 2024-08-01 09:23:20

多线程,多接收模式串口类LsComm之二的相关文章

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

描述:一个串口通讯类 应用平台:Windows 版本: v1.0 主要功能:设计了一个简洁易用的多线程串行通讯接口,可以切换查询和自动接收模式,进行对串口数据收发的类 接触VC,很不习惯mscomm等Active控件老让人去注册的方式,所以参照Delphi中的SpComm设计了一个类CComPort,对PJ Naughter 的CSerialPort进行了2次封装,主要目的是简化串口的使用.使其用简单的代码就可以完成串口通讯的过程.做了一个Demo程序演示了CComPort的使用,附图如下: 下

串口接收数据调用类的方法跟直接在主程序里写方法有什么区别?求大神指教,刚用这个提问,没分了。

问题描述 串口接收数据调用类的方法跟直接在主程序里写方法有什么区别?求大神指教,刚用这个提问,没分了. 为什么我直接在主程序里写的时候没问题,调用类里的方法就获取不到数据 解决方案 要看你的代码,比如有没有用到全局变量之类的. 解决方案二: 我分步调试的时候是能拿到数据的,但是直接运行的时候就获取不到. 解决方案三: 分布调试用的时间多,调用接受类的时候数据已经过来了.直接运行数据没过来,估计是数据同步的问题

串口类。自动接收到的数据。 怎么传到窗口上啊

问题描述 .NET里面有个串口控件.我没有使用...自已定义了一个类.因为要和多串口通信.用很多那个控件感觉不好.所以...问题是这样的.串口类里面接收到数据了.怎么在把这个数据反回给窗口呢..!以前我用VB写过思路是在类中定义一个事件然后串口接收事件收到数据后引发定义的事件,并把收到的数据传到定义的事件的参数里面然后.在窗口中调用此类时.就有自定义的那个事件.就是收到数据自已发生事件///////////////////////////////////////////////////////现

如何将多线程中接收数据处理的方法通过委托事件共用户使用呀!

问题描述 如何将多线程中接收数据处理的方法通过委托事件共用户使用呀!具体描述:一个TcpServer类主要是任务有启动服务.停止服务.接收连接的Socket(每接收一个Socket的建立一个线程对该Socket进行管理.线程调用的是Socket中的一个方法)Socket类:接收数据.发送数据等.注:将接收到的数据通过事件的方式委托到外面进行操作.如何做呀!还是这样的设计细路就有问题呀!!该如何设计呢!!! 解决方案 解决方案二:参考:http://blog.csdn.net/zhiang75/a

串口通信-请高手帮忙回答,在龚建伟老师的串口调试中遇到了Serial串口类的问题

问题描述 请高手帮忙回答,在龚建伟老师的串口调试中遇到了Serial串口类的问题 点击打开串口按钮时,就会弹出以上图片的错误, 代码如下 // SerialPortTestDlg.h : header file // #include"SerialPort.h" #if !defined(AFX_SERIALPORTTESTDLG_H__37F6643D_1905_4655_883E_24AD7F141ED0__INCLUDED_) #define AFX_SERIALPORTTEST

mfc-MFC如何将不停接收的串口数据绘制成动态波形图,求绘制代码

问题描述 MFC如何将不停接收的串口数据绘制成动态波形图,求绘制代码 怎么处理数据,绘制区才能动态绘制,没有重影呢,求数据处理代码,急死我了,拜托了 解决方案 这种直接用图形控件,或用c# 解决方案二: 用GDI+来做就可以.然后使用双缓冲绘图,可避免重影 解决方案三: 你说的重影是闪烁么,可以用双缓冲绘图来解决

接收 发送 串口-无线传输nrf24l01收发模式切换怎么实现

问题描述 无线传输nrf24l01收发模式切换怎么实现 2个STC单片机连接2个nrf24l01,一开始上位机处于接收状态,下位机处于发送状态,上位机接收下位机发送的数据.上位机与PC相连接,上位机将接收到的数据发送给PC.当PC发送一串数据给上位机时,上位机转为发送模式,下位机转为接收模式接收上位机发送的数据.但我的上位机发送数据后下位机还是一直处于发送状态接收不到上位机发送的数据,而且上位机发送数据后再转为接收状态时接收不到数据了,这是怎么回事?

wcf使用单利模式创建类发生异常

问题描述 wcf使用单利模式创建类发生异常 我在wcf服务中.自定义一个类目的是连接数据库,这个类是通过单利模式创建的.但是在客户端调用的时候,这个类竟然无法创建对象.请wcf高手看看. public class TestSer : ITestSer { ... public LoginParam GetLoginObj() { LoginParam loginobj = null; MySQLHelper sqlhelper = MySQLHelper.CreatInstance();//自定

使用.Net代理模式做类的增强

我们已经实现了用户注册功能,现在想增加日志记录功能.具体来讲就是在用户注册前后,分别输出一条日志.我们当然可以修改原有的业务代码. 现在换个角度来问两个问题: 1. 团队开发中,我们很可能根本拿不到源代码,那又怎么去增加这个功能呢? 2. 这次需求是增加日志,以后再增加其他需求(比如异常处理),是不是仍然要改业务类呢? 总结一下: 我们要在不修改原有类业务代码的前提下,去做类的增强.我们的设计要符合面向对象的原则:对扩展开放,对修改封闭! 都有哪些办法呢?我们尝试以下几种方法: 使用装饰器模式做