网络编程与实践实验报告
实验内容:串口通信编程
学号:S201502189
姓名:职荣豪
日期2015-9-28

一、 实验要求
使用VS2010编写基于对话框的MFC应用程序,两个窗口分别使用两个串口,使得这两个窗口可以进行通信,包括数据的发送与接收。
二、 实验原理
本实验使用Microsoft Communications Control控件,利用这个ActiveX控件,只需要编写少
量代码即可轻松进行通信。
该控件相关的函数如下:
put__CommPort:设置串口号
put_Settings:以字符串的形式设置波特率、奇偶校验位(n-无校验,e-偶校验,o-奇校验)、数据位数、停止位数
put_InputMode:设置接收数据的类型(0-文本类型,1-二进制类型)
put_InputLen:设置从接收缓冲区读取的字节数,0表示全部读取
put_InBufferSize:设置接收缓冲区大小
put_OutBufferSize:设置发送缓冲区大小
put_RThreshold:设定当接收几个字符时触发OnComm事件,0表示不产生事件,1表示每接收一个字符就产生一个事件
put_SThreshold:设定在触发OnComm事件前,发送缓冲区内所允许的最少的字符数,0表示发送数据时不产生事件,1表示当发送缓冲区空时产生OnComm事件
    put_PortOpen:打开或关闭串口,传入参数为true时打开串口,传入参数为false时关闭串口
    get_CommEvent:获得串口上刚发生的事件,事件值为2表示接收到数据
    get_InBufferCount:获得缓冲区中的数据位数
    get_Input获取缓冲区数据返回类型为VARIANT
    put_Output:发送数据
三、 设计思路
需要添加一个Microsoft Communications Control控件,用于进行串口通信。
由于要求同一程序运行两个窗口进行相互通信,需要两个窗口开启两个不同串口,故需
添加一个Edit Control控件用于输入口号,并添加打开串口按钮,在点击按钮时串口控件的参数进行设置开启串口。同时添加关闭串口按钮点击后关闭串口并可以对串口号进行修改。
需要添加两个Edit Control 分别用于显示接收到的数据以及输入要发送的数据。
需要添加一个发送按钮点击发送输入的数据。
四、 实验步骤
1. 建立基于对话框的MFC应用程序
2. 添加界面控件并设置IDCaption
添加Microsoft Communications Control控件,用于进行串口通信
添加一个Edit Control控件,用于输入串口号,ID设置为IDC_PORT
添加一个Static Text控件,用于标注端口号,将Caption设置为“串口号:”
添加两个按钮,分别用于打开串口、关闭串口。IDC分别设置为IDC_BTN_OPEN、IDC_BTN_CLOSE,Caption分别设置为“打开”、“关闭”
添加两个Edit Control,分别用于显示接收到的数据以及输入要发送的数据ID分别设置为IDC_RECEIVEIDC_SEND
添加两个Static Text控件,用于标注接收区与发送区,Caption分别设置为“接收区”、“发送区”
    添加一个按钮用于发送数据,ID设置为IDC_BTN_SEND,Caption设置为“发送
    调整控件的大小与位置。
完成后如图:
3. 控件绑定变量
右键单击Microsoft Communications Control控件,选择“添加变量”,变量名为m_com
打开类向导给控件添加变量:
给IDC_PORT绑定变量,用于存放输入的端口号,数据类型为int,变量名为m_port
给IDC_RECEIVE绑定变量,用于存放接收到的数据,数据类型为CString,变量名为m_strReceive
给IDC_SEND绑定变量,用于存放输入的待发送的数据,数据类型为CString,变量名为m_strSend
4. 给控件添加事件响应函数
右键单击Microsoft Communications Control控件,选择“添加事件处理程序”,点击“添加编辑”,生成响应函数,此函数用于接收数据。
在函数中添加以下代码:
    UpdateData(TRUE);    //更新m_strReceive的值
    int nEvent = m_com.get_CommEvent();        //获取事件值
    if(nEvent == 2) {        //时间值为2,此时为收到数据
        int k = m_com.get_InBufferCount();        //获取缓冲区位数
        if(k <= 0)    //位数小于等于0时则返回
            return;
        char* str = (char*)m_com.get_Input().parray->pvData;    //获取接收到数据的字符数组的首地址
        *(str + k) = '\0';activex 控件//字符数组最后一位的下一位设置为'\0',为字符串的结尾标志
        m_strReceive += (const char *) str;    //在用于显示的字符串末尾添加刚接收到的字符
    }
    UpdateData(FALSE);    //将m_strReceive的值显示到控件中
双击IDC_BTN_OPEN控件,即“打开”按钮,生成响应函数,此函数用于设置串口参数并打开串口。
在函数中添加以下代码:
UpdateData(TRUE);    //更新m_port的值
    if(m_port <= 0)        //端口号不小于等于0
    {
        AfxMessageBox("请输入正确的串口号!");
        return;
    }
    m_com.put__CommPort(m_port);    //设定串口为m_port的值
    m_com.put_Settings("9600,n,8,1");    //设定波特率9600,无奇偶校验位,8作为数据位,1作为停止位
    m_com.put_InputMode(1);    //设定数据接收模式,1为二进制方式
    m_com.put_InputLen(0);    //设置从接收缓冲区读取的字节数,0表示全部读取
    m_com.put_InBufferSize(1024);    //设置输入缓冲区大小为1024byte

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。