串口编程(VS2010)

1.准别工作
高版本的VS没有MSComm通讯控件,需要自己下载http://download.csdn.net/detail/axiqia/9466667。

  • 解压后拷贝到:
    C:\Windows\System32(WIN7系统);
    C:\WINDOWS\system32(XP系统)。
    注意:64位win7系统还需要将mscomm32.ocx文件复制到C:\Windows\SysWOW64\目录下,否则后面注册会出错。

  • 在C:\Windows\System32里找到cmd.exe以管理员身份运行:
    Regsvr32 C:\WINDOWS\system32\MSCOMM32.OCX

  • 修改注册表:
    win+R组合键打开“运行”或者直接在开始菜单里找到“运行”;输入regedit后回车,打开注册表管理器,在其中找到HKEY_CLASSES_ROOT项下的Licenses项,添加主项命名为“4250E830-6AC2-11cf-8ADB-00AA00C00905”,并将键值修改为“kjljvjjjoquqmjjjvpqqkqmqykypoqjquoun”

2.进入正题

一、打开VS2010软件,绘制界面;

串口编程(VS2010)_第1张图片

  • 我们要用到就是对话框模块,所以选择如下图所示

串口编程(VS2010)_第2张图片

  • 点击下一步至完成。

我们可以看到就绪之后的界面如下图所示,按照步骤把原来的静态文本框和确定按钮、取消按钮删掉;

串口编程(VS2010)_第3张图片

二、为我们的对话框添加控件

  • 添加两个组合边框,并放置好位置;

串口编程(VS2010)_第4张图片

  • 修改组合边框显示的名称;

串口编程(VS2010)_第5张图片

  • 在组合边框里面添加编辑文本框;

串口编程(VS2010)_第6张图片

在这一步一定要小心选择右边的属性;

串口编程(VS2010)_第7张图片

串口编程(VS2010)_第8张图片
串口编程(VS2010)_第9张图片
串口编程(VS2010)_第10张图片
串口编程(VS2010)_第11张图片
串口编程(VS2010)_第12张图片
串口编程(VS2010)_第13张图片

二、添加控件和变量

  • 这一步是把串口控件添加到对话框中来;

串口编程(VS2010)_第14张图片
串口编程(VS2010)_第15张图片

  • 给四个控件(两个输入区域,一个选择串口,一个波特率)添加变量 控件处右键,添加变量

串口编程(VS2010)_第16张图片

  • 接受区域,变量名最好和实例一样,否则后面程序也需要修改

串口编程(VS2010)_第17张图片

  • 其他三个区域相同方法

串口编程(VS2010)_第18张图片

  • 选择串口和波特率为control

串口编程(VS2010)_第19张图片
串口编程(VS2010)_第20张图片

  • 串口控件为public

    串口编程(VS2010)_第21张图片

三、为按钮和串口控件添加程序函数

  • 双击打开串口按钮,进入相应的编程部分
void C串口v2Dlg::OnBnClickedButtonOpen()
{
    CString str, str1, n;
    GetDlgItemText(IDC_BUTTON_OPEN, str);   //str获得与对话框中的控件相关的标题或文本
    CWnd *h1;                               //窗口类的基类
    h1 = GetDlgItem(IDC_BUTTON_OPEN);       //指向控件的caption

    //串口为关闭状态
    if(!m_mscom.get_PortOpen())
    {
        m_comb2.GetLBText(m_comb2.GetCurSel(), str1);   //取得所选的字符串,并存放在str1里面
        str1 = str1+','+'n'+','+'8'+','+'1';

        m_mscom.put_CommPort(m_comb1.GetCurSel()+1);    //选择串口
        m_mscom.put_InputMode(1);           //设置输入方式为二进制方式
        m_mscom.put_Settings(str1);         //comb2选择的波特率,无校验,8数据位,1个停止位
        m_mscom.put_InputLen(1024);         //设置当前接收区数据长度为1024
        m_mscom.put_RThreshold(1);          //缓冲区一个字符引发事件
        m_mscom.put_RTSEnable(1);           //设置RT允许

        m_mscom.put_PortOpen(true);         //打开串口
        //打开成功
        if(m_mscom.get_PortOpen())
        {
            str = _T("关闭串口");
            UpdateData(true);               //把控件中的值和变量进行交换 
            h1->SetWindowText(str);         //改变按钮名称为‘’关闭串口”,提供关闭操作
        }
    }
    //串口为打开状态
    else
    {
        m_mscom.put_PortOpen(false);        //关闭串口
        //关闭成功
        if(str != _T("打开串口"))
        {
            str = _T("打开串口");
            UpdateData(true);
            h1->SetWindowText(str);         //更新数据后,提供打开操作
        }
    }
}
  • 其余三个按钮同法:
void C串口v2Dlg::OnBnClickedButtonSend()
{
    UpdateData(true);                       //更新控件数据
    m_mscom.put_Output(COleVariant(m_EditSend));//把发送编辑框的数据发送出去

}


void C串口v2Dlg::OnBnClickedButtonClean()
{
    m_EditReceive = _T("");                 //给接收编辑框发送空格符
    UpdateData(false);                      //根据数据状态反馈给控件
}


void C串口v2Dlg::OnBnClickedButtonClose()
{
    //若当前串口为打开
    if(m_mscom.get_PortOpen())
        m_mscom.put_PortOpen(false);        //置为关闭
    CDialogEx::OnCancel();
}
  • 添加事件处理程序

串口编程(VS2010)_第22张图片

void C串口v2Dlg::OnCommMscomm1()
{
    //接收缓冲区有数据
    if(m_mscom.get_CommEvent() == 2)
    {
        char str[1024] = {0};           //缓冲区最大为1024
        long k;
        VARIANT InputData = m_mscom.get_Input();    //读入缓冲区
        COleSafeArray fs;
        fs = InputData;                 //VARIANT型变À量转换为COleSafeArray型变量
        for(k = 0; k < fs.GetOneDimSize(); k++)
        {
            fs.GetElement(&k, str+k);   //转换为BYTE型数组
        }

        m_EditReceive += str;           //接收到编辑框里面
        //SetTimer(1, 10, NULL);        //延时10ms
        UpdateData(false);              //将数据在屏幕中对应控件中显示出来。
    }
}
  • 最后

在对话框初始部分BOOL C串口v2Dlg::OnInitDialog(),将对话框代码完善,添加代码的作用是增加串口选择,和波特率选择:

// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
    //  执行此操作
    SetIcon(m_hIcon, TRUE);         // 设置大图标
    SetIcon(m_hIcon, FALSE);        // 设置小图标

    // TODO: 在此添加额外的初始化代码

    // 串口选择组合框
    CString str;
    int i;
    for(i = 0; i < 15; i++)
    {
        str.Format(_T("COM %d"), i+1);
        m_comb1.InsertString(i, str);       //将COM 1-15填入comb1
    }
    m_comb1.SetCurSel(0);                   //预置为COM 1

    //波特率选择组合框
    CString str1[]={_T("300"),_T("600"),_T("1200"),_T("2400"),_T("4800"),_T("9600"),
                    _T("19200"),_T("38400"),_T("43000"),_T("56000"),_T("57600"),_T("115200")};
    for(i = 0; i < 12; i++)
    {
        int judge_tf = m_comb2.AddString(str1[i]);
        if((judge_tf == CB_ERR) || (judge_tf == CB_ERRSPACE))
            MessageBox(_T("Build baud error!"));
    }
    m_comb2.SetCurSel(5);                   //预置波特率为9600

    return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
  • 程序完毕

编译成功后,在保存目录下的Debug目录下,找到可执行文件。进入测试。
效果图
串口编程(VS2010)_第23张图片
四、测试

  • 下载虚拟串口工具Virtual Serial Port Driver(VSPD)

http://download.csdn.net/detail/axiqia/9466672,安装成功后:

  • 添加两个匹配的虚拟串口:

串口编程(VS2010)_第24张图片

  • 打开两个串口程序

在同波特率下,一个选择串口1, 一个选择串口2, 测试结果如下。
串口编程(VS2010)_第25张图片

你可能感兴趣的:(随笔记)