【原文】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(); }
注意事项: