搜索
bottom↓
回复: 19

c++MFC做的串口调试助手

[复制链接]

出0入0汤圆

发表于 2014-12-27 13:53:40 | 显示全部楼层 |阅读模式
MFC下的串口调试助手

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2014-12-27 13:54:48 | 显示全部楼层
直接点击串口调试.exe,不需要安装

出0入0汤圆

发表于 2014-12-27 15:01:43 | 显示全部楼层
没有源码,没有什么意义

出0入0汤圆

发表于 2014-12-28 05:10:41 来自手机 | 显示全部楼层
有源码可以分享吗。

出0入0汤圆

 楼主| 发表于 2014-12-28 11:50:25 | 显示全部楼层
joelin97 发表于 2014-12-28 05:10
有源码可以分享吗。

c++串口调试助手的源码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-12-28 17:28:08 | 显示全部楼层
多谢分享。我是新手以后还要跟你多学习。

出0入0汤圆

发表于 2014-12-28 18:02:06 | 显示全部楼层
楼主测试过接收数据的完整性吗?

比如说下位机0.1ms一次,每次5个字节,发50万次,上位机会不会丢数据?100万次呢?

出0入0汤圆

发表于 2014-12-28 20:02:14 | 显示全部楼层
谢谢,正好团队在学习这个呢

出0入0汤圆

发表于 2014-12-28 20:30:15 | 显示全部楼层
谢谢楼主分享!

出0入0汤圆

发表于 2014-12-28 20:43:58 | 显示全部楼层
学习                                   

出0入0汤圆

发表于 2014-12-29 02:26:41 来自手机 | 显示全部楼层
谢谢楼主的分享啊…

出0入0汤圆

发表于 2015-3-17 10:44:23 | 显示全部楼层
谢谢楼主

出0入0汤圆

发表于 2015-6-14 09:10:05 | 显示全部楼层
刚学VC不久,楼主能讲一下做这个串口助手的流程吗?比如用到那些控制之类的,我想学习一下

出0入37汤圆

发表于 2015-6-14 10:42:44 | 显示全部楼层
本帖最后由 下一页 于 2015-6-14 10:45 编辑

这个光靠mfc解决不了问题,需要调用activx。

1.建立项目  
2.在项目中插入MSComm控件
3.利用ClassWizard定义CMSComm类控制变量
4.在对话框中添加控件  
5.添加串口事件消息处理函数OnComm()
6.打开和设置串口参数
7.发送数据




开始吧:

1.建立项目:打开VC++6.0,建立一个基于对话框的MFC应用程序SCommTest(与我源代码一致,等会你会方便一点);



2.在项目中插入MSComm控件    选择Project菜单下Add To Project子菜单中的 Components and Controls…选项,在弹出的对话框中双击Registered ActiveX Controls项(稍等一会,这个过程较慢),则所有注册过的ActiveX控件出现在列表框中。 选择Microsoft Communications Control, version 6.0,,单击Insert按钮将它插入到我们的Project中来,接受缺省的选项。(如果你在控件列表中看不到Microsoft Communications Control, version 6.0,那可能是你在安装VC6时没有把ActiveX一项选上,重新安装VC6,选上ActiveX就可以了),

这时在ClassView视窗中就可以看到CMSComm类了,(注意:此类在ClassWizard中看不到,重构clw文件也一样),并且在控件工具栏Controls中出现了电话图标(如图1所示),现在要做的是用鼠标将此图标拖到对话框中,程序运行后,这个图标是看不到的。



3.利用ClassWizard定义CMSComm类控制对象   打开ClassWizard->Member Viariables选项卡,选择CSCommTestDlg类,为IDC_MSCOMM1添加控制变量:m_ctrlComm,这时你可以看一看,在对话框头文件中自动加入了//{{AFX_INCLUDES()   #include "mscomm.h"   //}}AFX_INCLUDES (这时运行程序,如果有错,那就再从头开始)。



4.在对话框中添加控件   向主对话框中添加两个编辑框,一个用于接收显示数据ID为IDC_EDIT_RXDATA,另一个用于输入发送数据,ID为IDC_EDIT_TXDATA,再添加一个按钮,功能是按一次就把发送编辑框中的内容发送一次,将其ID设为IDC_BUTTON_MANUALSEND。别忘记了将接收编辑框的Properties->Styles中把Miltiline和Vertical Scroll属性选上,发送编辑框若你想输入多行文字,也可选上Miltiline。

再打开ClassWizard->Member Viariables选项卡,选择CSCommTestDlg类, 为IDC_EDIT_RXDATA添加CString变量m_strRXData, 为IDC_EDIT_TXDATA添加CString变量m_strTXData。说明: m_strRXData和m_strTXData分别用来放入接收和发送的字符数据。

      

5.添加串口事件消息处理函数OnComm() 打开ClassWizard->Message Maps,选择类CSCommTestDlg,选择IDC_MSCOMM1,双击消息OnComm,将弹出的对话框中将函数名改为OnComm,(好记而已)OK。

这个函数是用来处理串口消息事件的,如每当串口接收到数据,就会产生一个串口接收数据缓冲区中有字符的消息事件,我们刚才添加的函数就会执行,我们在OnComm()函数加入相应的处理代码就能实现自已想要的功能了。请你在函数中加入如下代码:

void CSCommTestDlg::OnComm()
{
     // TODO: Add your control notification handler code here
     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); //更新编辑框内容
}

到目前为止还不能在接收编辑框中看到数据,因为我们还没有打开串口,但运行程序不应该有任何错误,不然,你肯定哪儿没看仔细,因为我是打开VC6对照着做一步写一行的,运行试试。没错吧?那么做下一步:



6.打开串口和设置串口参数   你可以在你需要的时候打开串口,例如在程序中做一个开始按钮,在该按钮的处理函数中打开串口。现在我们在主对话框的CSCommTestDlg::OnInitDialog()打开串口,加入如下代码:

// TODO: Add extra initialization here
if(m_ctrlComm.GetPortOpen())
m_ctrlComm.SetPortOpen(FALSE);

m_ctrlComm.SetCommPort(1); //选择com1
if( !m_ctrlComm.GetPortOpen())
m_ctrlComm.SetPortOpen(TRUE);//打开串口
else
AfxMessageBox("cannot open serial port");

m_ctrlComm.SetSettings("9600,n,8,1"); //波特率9600,无校验,8个数据位,1个停止位

m_ctrlComm.SetInputMode(1);   // 以二进制方式检取数据
m_ctrlComm.SetRThreshold(1);
//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
m_ctrlComm.SetInputLen(0); //设置当前接收区数据长度为0
m_ctrlComm.GetInput();//先预读缓冲区以清除残留数据



现在你可以试试程序了,将串口线接好后,打开串口调试助手,并将串口设在com2,选上自动发送,也可以等会手动发送。再执行你编写的程序,接收框里应该有数据显示了。

7.发送数据   先为发送按钮添加一个单击消息即BN_CLICKED处理函数,打开ClassWizard->Message Maps,选择类CSCommTestDlg,选择IDC_BUTTON_MANUALSEND,双击BN_CLICKED添加OnButtonManualsend()函数,并在函数中添加如下代码:

void CSCommTestDlg::OnButtonManualsend()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE); //读取编辑框内容
m_ctrlComm.SetOutput(COleVariant(m_strTXData));//发送数据
}

运行程序,在发送编辑框中随意输入点什么,单击发送按钮,啊!看看,在另一端的串口调试助手(或别的调试工具)接收框里出现了什么。

如果你真是初次涉猎串口编程,又一次成功,那该说声谢谢我了,因为我第一次做串口程序时可费劲了,那时网上的资料也不好找。开开玩笑,谢谢你的支持,有什么好东西别忘了给我寄一份。

最后说明一下,由于用到VC控件,在没有安装VC的计算机上运行时要从VC中把mscomm32.ocx、msvcrt.dll、mfc42.dll拷到Windows目录下的System子目录中(win2000为System32)

出0入0汤圆

发表于 2015-7-4 00:58:54 | 显示全部楼层
感觉用控件别扭,不如用个串口类来的爽

出0入0汤圆

发表于 2018-7-10 00:02:59 | 显示全部楼层

谢谢楼主分享!

出0入0汤圆

发表于 2018-7-10 00:39:01 | 显示全部楼层
>variant_inp=m_ctrlComm.GetInput(); //读缓冲区
         safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
         len=safearray_inp.GetOneDimSize(); //得到有效数据长度

Have you verified that above code will have memory leak issue?

出0入26汤圆

发表于 2018-7-10 18:21:31 | 显示全部楼层
看看。经典程序。

出0入0汤圆

发表于 2018-7-10 18:44:54 | 显示全部楼层
分享源码很难得

出0入0汤圆

发表于 2018-12-19 16:15:56 | 显示全部楼层
谢谢楼主
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 02:15

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表