在vs2010中实现串口通信(基于MSComm控件)

2011年12月02日 分类:学习笔记C++

网上关于vc串口通信的教程都是关于vc6的,现在都vs2010了,vc6真的有点老了。 找了很久大部分都是编译通不过的,通过了也出不了数据。哎,慢慢改吧,谁叫咱是初学者呢。

首先添加mscomm控件,方法有两种,这个网上说了很多我就不讲了。 com 添加之后对话框(基于对话框程序)会出现一个电话机的图标,双击后在右侧可以看到控件的属性。 MSCOMM

根据自己的需要修改相应的参数。 然后是最重要的串口响应函数:

VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
CString strtemp;
if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{             ////////以下你可以根据自己的通信协议加入处理代码
    variant_inp=m_ctrlComm.GetInput(); //读缓冲区
    safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
    len=safearray_inp.GetOneDimSize(); //得到有效数据长度
    for(k=0;k<len;k++)
        safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
    for(k=0;k<len;k++) //将数组转换为Cstring型变量
    {
        BYTE bt=*(char*)(rxdata+k); //字符型
        strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放
        m_strRXData+=strtemp; //加入接收编辑框对应字符串
    }
}
UpdateData(FALSE); //更新编辑框内容

代码中有一行是 strtemp.Format(“%c”,bt); //将字符送入临时变量strtemp存放 其中的%C是一个字符型变量,我们要的是显示16进制的数据,所以改为 strtemp.Format(“02X “,bt); //将字符送入临时变量strtemp存放 其他的就不用改动了。

然后是串口发送函数:

CByteArray hexdata;
String2Hex(m_send,hexdata); //此处返回的len可以用于计算发送了多少个十六进制数
m_com.put_Output(COleVariant(hexdata)); //发送十六进制数据

这个就相对简单多了。m_send是文本框的数据。

关于调试的话,如果没有硬件条件,可以使用虚拟串口。

在xp上虚拟串口有很多软件都行,但我自己的电脑是win7的系统,xp可以的在我电脑上就不兼容了。

哎,没办法,继续找。最后找到一个很不错的虚拟串口软件,我放在另一篇文章中,欢迎使用。

下载地址:http://115.com/file/bel5vqxp#

github地址:https://github.com/wuyuans/COMM

作者:wuyuan 本文来自Wuyuan's Blog 转载请注明,谢谢! 文章地址: https://wuyuans.com/2011/12/serial-communication-and-mscomm-control