• VS2008基于对话框的MFC上位机串口通信(C++实现)简单例程


    首先,在 vs2008 环境下创建 MFC 运用程序
    VS2008基于对话框的MFC上位机串口通信(C++实现)简单例程
    设置项目名称为 ComTest(这个地方随意命名,根据个人习惯),点击确定后,点击下一步
    出现如下界面
    VS2008基于对话框的MFC上位机串口通信(C++实现)简单例程
    选择“基于对话框”模式然后直接点击完成即可(其他选项按默认方式),点击完成后出现如下界面
    VS2008基于对话框的MFC上位机串口通信(C++实现)简单例程
    解决资源管理器中自动给你生成好代码目录(可点击菜单栏“视图”选项打开解决方案资源管理器),如下图所示
    VS2008基于对话框的MFC上位机串口通信(C++实现)简单例程
    我们再次回到对话框编辑窗口,删除自动生产的控件(静态文本控件、确定和取消按钮控件),并在工具箱里添加两个button按钮和编辑框,之后的界面如下图所示:
    VS2008基于对话框的MFC上位机串口通信(C++实现)简单例程
    然后把最重要的串口通信控件加入到工具箱中,因为默认的工具箱是不带 MS 串口通信控件的。添加方法如下:在工具箱界面点击鼠标右键出现如下界面:
    VS2008基于对话框的MFC上位机串口通信(C++实现)简单例程
    然后点击选择项出现如下界面,然后选择“COM 组件”
    VS2008基于对话框的MFC上位机串口通信(C++实现)简单例程
    找到并选中该项
    VS2008基于对话框的MFC上位机串口通信(C++实现)简单例程
    最后点击确定键,就成功添加 MS 串口通讯控件了,工具箱中就会出现串口控件图标了
    VS2008基于对话框的MFC上位机串口通信(C++实现)简单例程
    我们吧串口控件添加到对话框里,位置随意,运行的时候是看不见的,所以最终界面是这样子的
    VS2008基于对话框的MFC上位机串口通信(C++实现)简单例程

    下面开始添加变量,首先IDC_MSCOMM1添加控制变量:m_ctrlComm,在串口通信图标上右键点击选择添加变量,如图:
    VS2008基于对话框的MFC上位机串口通信(C++实现)简单例程
    完成就可以了,控件ID和类别是可以选的,下面为按钮和编辑框添加变量时选不同的就行了。
    两个编辑框,一个用于接收显示数据ID设置IDC_EDIT_RXDATA(在控件属性框里设置),另一个用于输入发送数据,ID设置IDC_EDIT_TXDATA,两岸按钮,一个用于发送数据,将其ID设为IDC_BUTTON_MANUALSEND,另一个用于清空接收的编辑框,ID默认就行,不再赘述。

     接着添加变量,为IDC_EDIT_RXDATA添加CString变量m_strRXData, 为IDC_EDIT_TXDATA添加CString变量m_strTXData。说 明: m_strRXData和m_strTXData分别用来放入接收和发送的字符数据。方法同上面添加串口控制变量一样,选择控件ID和类型即可,如图:
    VS2008基于对话框的MFC上位机串口通信(C++实现)简单例程
    添加串口事件消息处理函数OnComm()
    回到对话框编辑界面,鼠标左键点击串口控件按钮,然后在对应的属性栏,点击闪电按钮(控件事件)
    VS2008基于对话框的MFC上位机串口通信(C++实现)简单例程

    VS2008基于对话框的MFC上位机串口通信(C++实现)简单例程
    添加串口事件消息处理函数,并将函数名改为OnComm,在上图中所示位置改就行。
    我们在OnComm()函数加入相 应的处理代码就能实现自已想要的功能了。请你在函数中加入如下代码:

    void CSCommDlg::OnComm()
    {
    // TODO: 在此处添加消息处理程序代码
    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.get_CommEvent()==2) //事件值为2表示接收缓冲区内有字符     
    {            
     ////////以下你可以根据自己的通信协议加入处理代码 
            variant_inp=m_ctrlComm.get_Input(); //读缓冲区  
            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); //更新编辑框内容 
    }


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

    // TODO: 在此添加额外的初始化代码
    m_ctrlComm.put_CommPort(5);
    //选择串口号5(笔记本没有串口,用的虚拟串口,可以使用软件vspd创建)
    m_ctrlComm.put_PortOpen(TRUE);
    //打开串口
    m_ctrlComm.put_RThreshold(2);
    //收到两个字节引发OnComm事件
    m_ctrlComm.put_InputMode(1);
    //输入模式选为二进制
    m_ctrlComm.put_Settings(_T("9600,n,8,1"));
    //设置串口参数,波特率,无奇偶校验,位停止位,位数据位
    m_ctrlComm.put_InputMode(1);  // 以二进制方式检取数据 
    m_ctrlComm.put_RThreshold(1); //参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件 
    m_ctrlComm.put_InputLen(0); //设置当前接收区数据长度为0 
    m_ctrlComm.get_Input();//先预读缓冲区以清除残留数据  

    发送数据
    先为发送按钮添加一个单击消息即BN_CLICKED处理函数,方法和串口事件控制函数的添加方法一样(只不过是在实践中的OnBnClickedButtonManualsend里添加),不再赘述,在函数中添加如下代码:

    // TODO: 在此添加控件通知处理程序代码
    UpdateData(TRUE);  //读取编辑框内容
    m_ctrlComm.put_Output(COleVariant(m_strTXData)); //发送数据

    运行程序,在发送编辑框中随意输入点什么,单击发送按钮,这时候在另一端的串口调试助手(或别的调试工具)接收框里就会有数据出现啦。

    最后那个“清除接收框”的按钮还没有用到,为它添加点击触发时间,在函数里添加如下代码即可:
    void CSCommDlg::OnBnClickedButton1()
    {
    // TODO: 在此添加控件通知处理程序代码
    m_strRXData="";
    UpdateData(FALSE);
    }
    这样简单的串口通信就基本完成了。
  • 相关阅读:
    2014-9-思杨的缺点
    2014-8-9月杂记
    2014-7-31 思杨在老家想我们
    生日。金鼎轩吃饭;亿旺中影看《后会无期》。
    2014-7-5~6 秦皇岛之旅,带思杨看大海
    2014-6-23 去未来幼儿园玩————————
    2014-6-15 思杨的成长是全家人的责任。
    2014-6-14 思杨跳抓钱舞---疾驰的扭扭车和思杨司机
    2014-6-7 带思杨去西三旗儿童乐园玩-----思杨晕车了
    springboot学习之一
  • 原文地址:https://www.cnblogs.com/jinsedemaitian/p/5589050.html
Copyright © 2020-2023  润新知