MSComm控件需要注意事项

来源:互联网 发布:梅西和大罗谁厉害知乎 编辑:程序博客网 时间:2024/06/06 16:25

在工业项目中,涉及到电脑与设备之间通信,不可避免的会用到串口。利用VC++开发这种可视化的上位机软件,可以利用Win API、第三方函数库以及MFC提供的串口控件MSComm。其中最简单的方法要数MSComm控件了,因为网上关于它的用法太多了,这里就不讲了,只是总结一下我自己在实际开发项目中遇到的问题并给出解决办法,希望能让各位网友少走弯路。

遇到的问题大致是这样的,项目中要实现这样一个功能,一台机器利用串口向另一台机器发送一条指令,这个指令是处理接收机器上的某个存储的文件。开发前期在公司利用串口助手和虚拟串口进行测试,一切功能正常,即可以处理指定文件。后,带打包好的软件去现场做进一步测试,发现总是报错打不开文件(这里要给个小建议,就是写的报错信息尽量要全,比如说这里打不开文件,若如是指明什么路径下某文件打不开,就可以为我们节省测试时间,哈哈哈,这个建议是我的PM给的),通过debug,在源码中找到了报错点,但是在公司测试没问题,于是与现场的实施联系,让其用串口助手接收一下机器发送的串口信息,比对之后,一切正常,仍旧没找问题所在。仔细一想,无论在前期开发测试还是现场让实施接收数据,全部都是利用串口助手,而串口助手与发送数据的软件在一台机器上,所以推测有没有可能是因为传输速度较慢导致串口数据接收并不完整,进一步引发找不到文件的报错。有了这样的一个推测后,将我在收到串口数据和读取串口数据之间添加了一个延时。代码如下:

void CSCommTestDlg::OnComm() {    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表示接收缓冲区内有字符    {                    Sleep(1000);        variant_inp=m_ctrlComm.GetInput(); //读缓冲区    //将缓冲区的数据变成字符串    }    UpdateData(FALSE); //更新编辑框内容}
这里需要说明一下,在Windows系统中Sleep函数后面的数字表示的是毫秒级别的,而sleep函数中数字表示的是秒级别的,举个例子Sleep(1000)和sleep(1)表示同一个意思,即延时1秒。

以上。

原创粉丝点击