最近在学习MFC编写串口,首先使用了MSCOMM控件来编写,简单好用,但是它有一个缺点就是当它发布的时候,需要相应的计算机也要进行MSCOMM的注册,串口助手是一个小软件,使用前还要注册,这对于用户来说是非常麻烦的。所以放弃了MSCOMM控件;接着又使用CSerialPort这个串口类来编写,移植完了之后发现一个奇怪的问题,我使用单片机通过CP2102跟电脑通信,这个类做出来的串口助手竟然不能发送和接收数据!!!使用其他串口助手却没有这个问题,这让我很困惑,以为是我移植出错了,但是我下载别人使用这个CSerialPort这个类写出来的串口助手,也真的发送和接收不了我板子上面CP2102的数据。最后我只能放弃这个很经典的类。
接下来我就找到了CnComm这个类,虽然这个类提供了历程,但是对于刚刚学习它的我来说,还是很难找到移植参考,而在网上找了很多移植资料,都是不完整的,会出现问题的。所以这里自己整理了一下移植方式,给大家做个参考,同时也整理一下自己学习到的知识。
步骤1:
添加CnComm.h到工程目录中。然后声明一个串口对象为主窗口类的成员(私有成员和共有成员),添加代码如下:
CnComm m_Cncomm; //串口声明
其中成员名字随便取。
步骤2:
在主窗口类的构造函数中设置Cncomm类的使用模式,在主窗口类的构造函数中添加代码如下:
m_Cncomm.SetOption(m_Cncomm.GetOption() |CnComm::EN_RX_BUFFER); //设置模式
步骤3:
将主窗口句柄给串口类,因为串口需要发送到主窗口中显示需要句柄。在主窗口类的OnInitDialog()中添加代码如下:
m_Cncomm.SetWnd(this->m_hWnd);
步骤4:
在主窗口类中添加串口设置成员函数。(这个步骤也可以省略,省略的话,在使用CnComm类的Open()函数的时候,就默认设置为波特率9600,1位停止位,8位数据位,无检验位)。成员函数的代码参考如下:
BOOL CcommDlg::CommSetState()
其中m_portBaund,m_portByteSize,m_portStopByte,m_portParity就是你要设置的值。
步骤5:
在主窗口类中添加串口接收消息映射。
1) 首先窗口类中添加消息函数声明,代码如下:
afx_msg LRESULT OnCommRxchar(WPARAM wParam,LPARAM lParam);