最近有点时间,所以学习一下基于VC的串口通讯。

在VC下实现串口通讯有两种方法:

一种是直接使用 MSComm32 控件,这种方法比较简单,只需要之直接调用相应的控件类的接口就可以对串口进行操作。

另一种方法就是使用Windows的API接口,相对比较复杂。

再次就先介绍第一种方法,第二种方法等下次总结的时候在将它记下来。

NOTE:读者若需要完整的实例,可以到以下链接下载,里面含有具体的实例,以及实现所需功能要用到的几个文件

MSComm32.ocx、mscomm.cpp、mscomm.h

http://download.csdn.net/detail/xbmoxia/7096493

本人使用的开发环境是VC2010,若是其它平台,只要对配置做一下更改就可以。

一、先创建一个工程,如“MSCommTest”

二、加载MSComm32控件

依次选择“工具—选择工具箱项”,出现以下界面,然后依次勾选红色方框的内容并按“确定”。

若是读者没有找到“Microsoft Communications Control,version 6.0”,那可能是因为你的电脑里面系统路径里面没有“MSComm32.ocx”文件,且没有注册MSCom32控件。读者可以到以上链接下载需要的几个文件,然后将“MSComm32.ocx”拷贝到“C:\WINDOWS\system32”路径下面,然后点击桌面“开始——运行”,在里面输入:

“regsvr32 C:\WINDOWS\system32\MSComm32.OCX”,然后回车确认进行该控件的注册。

三、回到刚才创建的工程,然后将“mscomm.h”和“mscomm.cpp”添加到工程里面,并在“stdafx.h”里面添加#include "mscomm.h"   这句话。

四、添加 MSComm32 控件,以及其它必要的控件到对话框资源(当你成功做完第二步后,会在你的控件栏里出现一个MSComm32控件,如下画红色方框的控件),如图

五、为你刚才添加的控件添加相应的控件关联变量

CButton m_ctrlHexSend;
    CButton m_ctrlHexDiaplay;
    BOOL m_bAutoSend;
    CString m_strRXData;
    CString m_strTXData;
 
    CMSComm    m_ctrlComm;
        其中控关联变量“CMSComm m_ctrlComm;”需要你自己为它添加相应的响应代码

void CMSCommTestDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_CHECK_HEX, m_ctrlHexSend);
    DDX_Control(pDX, IDC_CHECK_HEXDISPLAY, m_ctrlHexDiaplay);
    DDX_Check(pDX, IDC_CHECK_AUTOSEND, m_bAutoSend);
    DDX_Text(pDX, IDC_EDIT_RXDATA, m_strRXData);
    DDX_Text(pDX, IDC_EDIT_TXDATA, m_strTXData);
    DDX_Control(pDX, IDC_MSCOMM1, m_ctrlComm);
}
         以上就是前期准备,现在可以开始编写控件初始化代码以及相应的发送和接收功能函数了。
              六、初始化COM口

1.在***Dlg.h 里面添加爱函数声明“void InitComm();”

2.在***Dlg.cpp里面定义函数

void CMSCommTestDlg::InitComm()
{
    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); //1:表示以二进制方式检取数据
    m_ctrlComm.SetRThreshold(1); //串口接收缓冲区中有1个字符就引发接收OnComm事件
    m_ctrlComm.SetInputLen(0); //设置当前接收区数据长度为0
    m_ctrlComm.GetInput();//先预读缓冲区以清除残留数据
 
}

七、添加发送 和 接受串口数据的功能代码

1.分别为“发送按钮”和“接受按钮”添加单击响应函数,在“资源视图”里面分别单击那两个按钮就可以了。

2.定义这两个函数,如下

void CMSCommTestDlg::OnBnClickedBtnRxdata()
{
    // 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.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); //字符型
            if(m_ctrlHexDiaplay.GetCheck())
            strtemp.Format("%02X ",bt); //以十六进制方式送入临时变量strtemp存放
            else 
            strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放
            m_strRXData+=strtemp; //加入接收编辑框对应字符串 
        }
    }
    UpdateData(FALSE); //更新编辑框内容
}
void CMSCommTestDlg::OnBnClickedBtnTxdata()
{
    // TODO: 在此添加控件通知处理程序代码
    UpdateData(TRUE); //读取编辑框内容
    if(m_ctrlHexSend.GetCheck())
    {
        //CByteArray hexdata;
        //int len=String2Hex(m_strTXData,hexdata); // len可以用于计算发送了多少个十六进制数
        m_ctrlComm.SetOutput(COleVariant(hexdata)); //发送十六进制数据
    }
    else 
        m_ctrlComm.SetOutput(COleVariant(m_strTXData));//发送ASCII字符数据
}
以上步骤都做完后就差不多了,不过差一点,就是需要为MSCom32控件添加相应的“触发事件”。

方法如下图所示:

以上操作都完成后就可以正常实现串口的首发功能了,不过读者应先使用“杜邦导线”把电脑的“COM1”串口的 TXD 和 RXD 引脚连接起来,这样就可以实现自发自收了。

在VC下实现串口通讯相关推荐

  1. 中断方式下进行串口通讯的正确方法

    转载:http://bbs.ednchina.com/BLOG_ARTICLE_277752.HTM 中断方式下进行串口通讯的正确方法 一般普遍的把串口通讯分为查询方式和中断方式.查询方式比较容易理解 ...

  2. 关于嵌入式linux下的串口通讯问题---回车、换行、缓冲

    嵌入式Linux串口通讯测试问题:   经过实验,从Linux(PC)通过串口向嵌入式Linux开发板发送数据时,串口初始化完毕后遇到回车(0x0d)或换行(0x0a)才开始从串口接收数据,回车或换行 ...

  3. linux下实现串口通讯

    1.关键结构体 (1)struct termios                 { unsigned short c_iflag;             /* 输入模式标志*/          ...

  4. ROS下进行串口通讯

    文章目录 前言 一.安装串口功能包 二.串口接受程序 三 .查看串口号 前言 在使用工控机时,经常需要和其他主控进行信息交流,串口通讯作为使用最为广泛的形式,因此,了解如何在ros下进行串口的接发数据 ...

  5. ROS环境下的串口通讯

    目录 1.前言 2.内容 2.1 准备工作 2.1.1 连接外部USB设备 2.1.2 串口调试工具的下载 2.1.3 serial库的安装 2.2 代码部分 2.2.1 编写发布节点 2.2.2 编 ...

  6. Cypress EZ-USB FX3 DMA模式下的串口通讯

    由于公司设备升级后出了问题,需要对USB驱动进行修改,原本使用的是寄存器模式进行UART传输,但是由于FX3寄存器模式会出现长时间延时等待的问题,不得不对其传输模式进行修改.虽然赛普拉斯的EZ-USB ...

  7. linux 串口 换行十六制,关于嵌入式linux下的串口通讯问题---需增加回车/换行才能接收...

    问题:在Linux应用层,直接从/dev/tty***使用read()函数读数据,无法读到,只有在数据末尾加上0a/0d才可以读到数据(这里是发送十六进制的数据,ASCLL码同理,增加回车才可以读到数 ...

  8. C——Linux下的串口编程

    原 C--Linux下的串口编程 2017年06月06日 19:30:50 C_Aya 阅读数:11537 <span class="tags-box artic-tag-box&qu ...

  9. 乐鑫esp8266的串口通讯驱动源文件,nonos和rtos版本

    代码地址如下: http://www.demodashi.com/demo/13650.html 文章目录 一.前言: 二.`esp8266`的串口分布情况: 三.`esp8266`的串口通讯时候,应 ...

  10. linux 测试串口命令,Linux 下测试串口的命令microcom

    昨天应为要测试主板上的串口,查了一下,可以使用microcom 这条命令进行测试. 命令使用方法很简单: Usage: microcom [-d DELAY] [-t TIMEOUT] [-s SPE ...

最新文章

  1. 修改用友服务器ip地址,用友服务器ip地址更换
  2. 下一代 MES,智能制造的骨架
  3. 在php中存redis数据,redis缓存都存哪些数据
  4. Pandas数据探索分析,分享两个神器!
  5. eclipse配置代码提示
  6. [webrtc] rtcp模块中rtt时间计算
  7. Excel 2016新增函数之IFS
  8. JSON Stringify示例–如何使用JS解析JSON对象
  9. 基于OpencCV的彩色图像的分离与合并
  10. linux 关闭redis 命令_面试必问的 Redis:RDB、AOF、混合持久化
  11. 在kali下对Windows 卷没有写权限的解决办法
  12. 可重定位的ELF文件
  13. java 使用socks代理
  14. [生存志] 第14节 历代大事件概览 西汉
  15. Java实现拼图小游戏(3)—— 添加图片(含JFrame源码阅读)
  16. [项目管理] 项目管理之配置管理
  17. linux客户端交互,客户端交互性
  18. XAML开发入门之创建XAML应用程序
  19. 随机生成邀请码、随机生成10位数字、随机生成英文字母+数字
  20. new指针后,地址相同

热门文章

  1. SAP HR工资核算基础(转)
  2. Access数据库学习
  3. visio2007安装教程_电脑安装Visio 2007的详细方法
  4. 相亲中的最优停止理论-相亲中的数学
  5. hibernate详细教程(入门到熟练)
  6. Ghost4J库安装,找不到gsdll64.dll或libgs.so报错
  7. 前方高能!java并发编程实战百度网盘
  8. Oozie 集成 Ssh
  9. HTML特殊字符转义
  10. SQL数据库的创建及其详细操作(作业)