【原文】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 其他的名字会导致收不到数据
- 端口号可以放在下拉框里选择,其他很多代码放置的位置可以自己调整,比如初始化代码