VC++用第三方类实现串口通信

来源:互联网 发布:天津大学网络远程教育 编辑:程序博客网 时间:2024/06/05 19:47

【原文】http://dev.yesky.com/29/2310029.shtml


与通过WIN32 API进行串口访问相比,通过MScomm这个Activex控件进行串口访问要来的方便许多,它基本上可以向用户屏蔽多线程的细节,以事件(发出OnComm消息)方式实现串口的异步访问。尽管如此,MScomm控件的使用仍有诸多不便,譬如其发送和接收数据都要进行VARIANT类型对象与字符串的转化等。因此,国内外许多优秀的程序员自己编写了一些串口类,使用这些类,我们将可以更方便的操作串口。本文将向您展示由程序员llbird编写的cnComm(中国串口?)串口类。

llbird是一位优秀的程序员,他的代码风格简洁而紧凑,类的声明和实现都被定义在一个头文件中,使用这个类的朋友只需要在工程中包含这CnComm.h一头文件即可。网上一搜就可下载,这里就不贴了。

1,新建mfc对话框程序,界面布局如图


2,在App类头文件中包含CnComm.h

3,为接收框,发送框分别绑定CString类型的变量 m_receive  和 m_send,位各个按钮添加消息响应函数。

4,Dlg类头文件中添加CnComm com;成员变量。位Dlg类添加自定义消息

ON_MESSAGE(ON_COM_RECEIVE, &CSerialPortDlg::OnComReceive)

这个消息是固定宏,不必定义ID

afx_msg LRESULT OnComReceive(WPARAM wParam, LPARAM lParam);  

5,在 打开串口 按钮中添加初始化代码

void CSerialPortDlg::OnBnClickedButtonOpen(){// TODO: Add your control notification handler code here   if(com.IsOpen())   //如果已经打开,则直接返回      return;   com.Open(3,115200,NOPARITY,8,ONESTOPBIT); //打开串口3,波特率9600,无奇偶校验,字节8位,1个停止位。这个函数有四个重载以及很多缺省值   com.SetWnd(AfxGetMainWnd()->m_hWnd); //设置消息处理窗口,关联消息处理句柄,也可以写成com.SetWnd(m_hWnd)   总之,对应需要处理的窗口句柄即可}

6,在 发送 按钮中添加发送数据代码

void CSerialPortDlg::OnBnClickedButtonSend(){// TODO: Add your control notification handler code here   UpdateData(true);   char buf[1024];   buf[wcstombs(buf, m_send, 1023)] = 0;   DWORD dwSend = com.Write(buf);}
7,清屏

void CSerialPortDlg::OnBnClickedButtonClear(){   //TODO: Add your control notification handler code here   m_receive=L"";   UpdateData(false);}
8,接收数据的代码

afx_msg LRESULT CSerialPortDlg::OnComReceive(WPARAM wParam, LPARAM lParam){UpdateData(true);   ////读取串口上的字符   char str[1024];   com.ReadString(str, 1024);  //ReadString适合读一般字符串,Read函数适合读取任意数据   m_receive += str;   UpdateData(false);   return 0;}
9,关闭串口

void CSerialPortDlg::OnBnClickedButtonClose(){// TODO: Add your control notification handler code here   if(com.IsOpen())  //只有在打开的情况下才关闭   com.Close();}


注意事项:

  • 通信双方的波特率,奇偶校验,停止位等参数一定要一致。
  • 自定义的消息宏名称一定要是   ON_COM_RECEIVE  其他的名字会导致收不到数据
  • 端口号可以放在下拉框里选择,其他很多代码放置的位置可以自己调整,比如初始化代码




0 0
原创粉丝点击