第6章  Visual C++串口通信程序
设计典型实例
利用Visual C++开发串口通信程序既可以使用MSComm控件也可以调用Windows API函数。不过,只要MSComm可以被选用,它几乎总是我们推荐的选择。
在本章提供的串口通信程序设计中,PC与单片机、PC与智能仪表、PC与PLC、PC与GSM短信模块等串口通信任务的实现均采用MSComm控件。
6.1  PC与PC串口通信程序设计
两台串口设备通信距离较近时,可以直接连接,最简单的情况,在通信中只需3根线(发送线、接收线、信号地线)便可实现全双工异步串行通信
本设计通过两台PC串口三线连接,介绍了利用API函数和MSComm控件设计串口通信程序的方法,包括字符与文件的发送与接收。
6.1.1  PC与PC串口通信程序设计目的
设计目的有以下两个方面。
(1)掌握PC与PC串口通信的线路连接方法。
(2)利用VisualC++ API函数和MSComm控件实现PC与PC串口通信的程序设计方法。
6.1.2  PC与PC串口通信程序设计用软、硬件
本设计用到的硬件和软件清单见表6-1。
6-1    设计用软、硬件
序    号
名    称
数    量
1
PC或IPC
1
2
串口通信线(三线制)
1
3
Visual C++ 6.0
1
6.1.3  PC与PC串口通信程序硬件线路
线路说明:在计算机通电前,如图6-1所示,将两台PC通过串口线连接起来:PC中A串口COM1端口的TXD与PC中B串口COM1端口的RXD相连;PC中A串口COM1端口的RXD与PC中B串口COM1端口的TXD相连;PC中A串口COM1端口的GND与PC中B串口COM1端口的GND相连。
6.1.4  PC与PC串口通信程序设计任务
利用Visual C++ API函数和MSComm控件编写程序实现PC与PC串口通信。
(1)两台计算机互发字符并自动接收,如一台计算机输入字符串“Please return abc123”,执行“发送字符”命令,另一台计算机若收到,就输入字符串“abc123”,执行“发送字符”命令,信息返回到第一组的计算机。实际上就是编写一个简单的双机聊天程序。
(2)将文本文件或二进制文件通过串口从一台计算机传送到另一台计算机。
图6-1  PC与PC串口通信线路
6.1.5  任务实现
6.1.5.1  利用API函数实现字符发送与接收
1.建立工程
(1)启动Visual C++6.0,执行“文件”菜单中的“新建”命令,显示新建对话框,选择“MFC AppWizard(exe)”工程类型,输入需要创建工程的名称“pc_pc_api”和目录。
图6-2  程序界面
(2)按照弹出的应用向导对话框依次填写,第1步选择基于对话框,其他均采用默认。
(3)单击“完成”,将会弹出一个关于新工程信息的对话框。单击“确定”按钮。这样MFC向导便自动生成了一个名称为pc_pc_api的工程。
2.资源创建
(1)应用程序中添加了一个对话框资源IDD_PC_ PC_API_DIALOG,打开属性对话框,将对话框标题改为“PC与PC串口通信API”。
(2)删除对话框中原来的Static文本,用面板为对话框添加如表6-2所示的控件,并按照图6-2所示放置。
6-2    对话框的控件类型、ID及相关属性
控件类型
ID    号
标    题
属    性
功    能
静态文本
默认
显示接收字符区
默认
标签
静态文本
默认
输入发送字符区
默认
标签
编辑框
IDC_receive
Horizontal scroll(√)
显示接收字符区
Mutiline(√)
编辑框
IDC_send
Horizontal scroll(√)
显示发送字符区
Mutiline(√)
按钮
IDOK
发送
默认
发送字符命令
按钮
IDCANCEL
退出程序
默认
关闭程序命令
(3)添加成员变量,在“查看”菜单中或在对话框上单击鼠标右键,打开“Class Wizard”对话框中的“Member Variables”标签,选中所需的控件ID号,双击鼠标左键或单击Add Variables按钮,依次为表6-3中所列控件增加成员变量。
6-3    成员变量
控件ID号
变 量 类 型
变  量  名
IDC_receive
CString
m_strReceive
IDC_send
CString
m_strSend
(4)切换到Class Wizard的Message Maps标签页或在对话框中双击每一个按钮,为 “发送”、“退出”按钮分别添加ON_BN_CLICKED消息响应函数OnOK(),OnCancel()。
3.程序代码设计
窗体模块程序如下:
(1)在pc_pc_apiDlg.cpp文件的开始处,增加全局变量、消息和线程函数,代码如下:
const CM_RECEIVE = WM_USER+100;    //自定义一个消息
OVERLAPPED tOverLaped=  {0};          //线程函数使用的OVERLAPPED结构
OVERLAPPED wOverLaped = {0};          //写操作使用的OVERLAPPED结构
OVERLAPPED rOverLaped = {0};          //读操作使用的OVERLAPPED结构
BOOL IsFun = True;                    //线程是否运行
BOOL IsStop = False;                    //数据是否发送完毕
DWORD ThreadFunction(LPVOID pParam)    //线程函数
{
DWORD  dwEvtMask ,dwResult;
tOverLaped.hEvent = CreateEvent(NULL,True,False,NULL);          //创建一个事件
while (IsFun)
        {
        WaitCommEvent(((CPc_pc_apiDlg*)AfxGetMainWnd())->hCom,&dwEvtMask,&tOverLaped);            //等待窗口事件
    dwResult = WaitForSingleObject(tOverLaped.hEvent,100);    //如果事件没有信号,延时0.1s
    switch (dwResult)
    {
    case WAIT_OBJECT_0:  //事件对象有信号
        switch (dwEvtMask)
        {
        case EV_RXCHAR:  //接收到数据
            {
                if (IsStop)  //发送停止
                {
                    IsStop = False;
                    //发送消息,由消息处理函数接收数据
                    ::PostMessage(AfxGetMainWnd()->m_hWnd, CM_RECEIVE,0,(LPARAM)EV_ RXCHAR);
                }
                break;
            }           
        }
        break;       
    }
}
return 0;
}
(2)在BEGIN_MESSAGE_MAP消息映射代码中,添加自定义消息映射,代码如下:
BEGIN_MESSAGE_MAP(CPc_pc_apiDlg, CDialog)
//{{AFX_MSG_MAP(CPc_pc_apiDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_MESSAGE(CM_RECEIVE,OnRecieveData)  /添加自定义消息
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
(3)设置初始化函数OnInitDialog(),添加代码实现对话框串口通信的初始化工作,如下:
BOOL CPc_pcDlg::OnInitDialog()
{  …//VC自动生成的代码
// TODO: Add extra initialization here
    CSeriesPort();   
return True;  // return True  unless you set the focus to a control
}
(4)实现发送按钮、退出按钮相应的消息响应函数OnOK(),OnCancel()。代码如下:
waitforsingleobject函数void CPc_pc_apiDlg::OnOK()
{
  // TODO: Add extra validation here 

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