Transcript Document

第6章串行通信上位机程序设计
宋维
串口编程
• 在Win32下,可以使用两种编程方式实现串
口通信:
• 其一是使用ActiveX控件,这种方法程序简
单,但欠灵活。
• 其二是调用Windows的API函数,这种方法
可以清楚地掌握串口通信的机制,并且自
由灵活。
• 本文介绍ActiveX串口通信部分。
主要内容
•
•
•
•
1、串行通讯的组成
2、串行通讯的分类
3、异步通讯软件开发
4、串口通讯实例编程
串行通讯的应用
•
•
•
•
数据交换
距离较远(RS232<15m,RS485<1.2km)
节省成本
速度要求不高
接口的电气特性
• RS-232-C:为负逻辑关系。即:逻 辑
“1”,-5— -15V;逻辑“0” +5— +15V 。
噪声容限为2V。即 要求接收器能识别低
至+3V的信号作为逻辑“0”,高到-3V的
信号 作为逻辑“1”。与TTL 电平不兼容 。
• RS485:逻辑“1”以两线间的电压差为+
(2—6) V表示;逻辑“0”以两线间的电
压差为-(2—6)V表示。接口信号电平
比RS-232-C降低了,就不易损坏接口电
路的芯片, 且该电平与TTL电平兼容,
可方便与TTL 电路连接。
串行通讯系统的组成
• 串行通讯系统由上位机与下位机组成
串
口
上位机
通讯线
串
口
下位机
9针串口引脚与功能
针脚
功能
流向
1
载波检测(DCD)
上<-下
2
接受数据(RXD)
上<-下
3
发出数据(TXD)
上->下
4
数据终端准备好
(DTR)
上<-下
5
信号地线(SG)
公共
6
数据准备好(DSR)
上<-下
7
请求发送(RTS)
上->下
8
允许发送(CTS)
上<-下
9
9 振铃指示(RI)
上->下
上位机与下位机的种类



•
•
上位机与下位机是相对而言的
上位机:PC机,微处理器,智能仪表
下位机:PC机,微处理器,智能仪表
同种类:具有相同的电气特性接口
不同种类:不具有相同电气特性接口
RS232/RS485最简接线
上位机与下位机同种类时的连接
Tx
Rx
SG
上位机
Tx
Rx
SG
下位机
RS232/RS485最简接线
• 上位机与下位机不同种类时的连接
Tx
Tx
Rx
GND
转换芯片
例如:
MAX232
MAX485
Rx
GND
上位机
需确保Tx对应Rx
下位机
串行通讯的方法
• 同步通讯:
• 通信双方必须先建立同步,即双方的时钟
要调整到同一个频率。收发双方不停地发
送和接收连续的同步比特流。但这时还有
两种不同的同步方式。一 种是使用全网同
步,用一个非常精确的主时钟对全网所有
结点上的时钟进行同步。另一种是使用准
同步,各结点的时钟之间允许有微小的误
差,然后采用其他措施实 现同步传输。
串行通讯的方法
• 异步通讯
• 是一种很常用的通信方式。异步通信在发送
字符时,所发送的字符之间的时间间隔可以
是任意的。当然,接收端必须时刻做好接收
的准备。发送端可以在任意时刻开始发送字
符,因此必须在每一个字符的开始和结束的
地方加上标 志,即加上开始位和停止位,以
便使接收端能够正确地将每一个字符接收下
来。异步通信的好处是通信设备简单、便宜,
但传输效率较低(因为开始位和停止位的开
销所占比例较大)
异步通讯的主要参数
•
•
•
•
波特率
停止位
奇偶校验
握手方式
基于VC6.0的串口软件开发
•
•
•
•
•
确定串行通讯的组成
确定串行通讯的方式:同步/异步
确定通讯协议
确定通讯参数(格式):波特率等
确定操作界面
基于VC6.0的串行异步通讯
软件开发
•
•
•
•
•
软件设计步骤:
1、建立工程
2、设计界面
3、编写通讯程序
4、调试
建立工程步骤
• 1、打开VC6.0
• 2、新建工程(Project): 输入工程名
并选择工程类型为(.exe)
• 3、选择程序窗口类型:(文档、对话框)
• 4、选择窗口特性
• Finish
(下面以最简单的对话框为例子)
对话框的设计
•
•
•
•
•
设计画面布置
调整对话框大小
修改或设置对话框属性
插入控件
编写命令程序
MSCOMM控件简介
• Microsoft提供的串行通信ActiveX控件的使用方法。
该控件的相应文件是MSCOMM32.OCX,以下简
称为MSCOMM控件。一、MSCOMM控件
MSCOMM控件,即Microsoft Communication
Control,是Microsoft为简化Windows下串行通信
编程而提供的ActiveX控件。它提供了一系列标准
通信命令的使用接口,利用它可以建立与串口的
连接,并可以通过串口连接到其他通信设备(如
调制解调器),发出命令,交换数据以及监视和
响应串行连接中发生的事件和错误。MSCOMM
控件可用于创建电话拨号程序、串口通信程序和
功能完备的终端程序。
• MSCOMM控件提供了两种处理通信的方式:(1)
事件驱动方式。当通信事件发生时,MSCOMM
控件会触发OnComm事件,调用者可以捕获该事
件,通过检查其CommEvent属性便可确认发生的
是哪种事件或错误,从而进行相应的处理。这种
方法的优点是响应及时、可靠性高。(2)查询方
式。在程序的每个关键功能之后,可以通过检查
CommEvent属性的值来查询事件和错误。如果应
用程序较小,这种方法可能更可取。
CMSComm的方法成员
• 在使用MSCOMM控件时,1个MSCOMM控件只
能同时对应1个串口。如果应用程序需要访问和控
件多个串口,那么必须使用多个MSCOMM控件。
在VC++中,MSCOMM控件只对应着1个C++类-CMSComm。由于MSCOMM控件本身没有提供
方法,所以CMSComm类除了Create ()成员函
数外,其他的函数都是Get t函数对,用来获取或
设置控件的属性。MSCOMM控件也只有1个
OnComm事件,用来向调用者通知有通信事件发
生。
• MSCOMM控件有许多很重要的属性,下面给出
几个较为重要和常用的属性
• MSCOMM控件的重要属性:属 性 说 明
CommPort
通信端口号
Settings 以字符串形式表示的波特率、奇偶校验、
数据位
PortOpen
通信端口的状态,打开或是关闭
Input
接收数据
Output 发送数据
InputMode 接收数据的类型:0为文本;1为二进
制二、编程实现。MSCOMM可以两种不同的形
式接收数据,即以文本形式和以二进制形式。
MSCOMM与单片机通信的注意事项
• 在Microsoft的MSDN中可以找到用MSCOMM控
件进行字符数据传输的例子VCTERM。
• 几乎所有以单片机为核心的测量系统所得到的原
始数据都是二进制形式的,所以,以二进制形式
传输数据将是最为直接而又简洁的办法。
• 由于MSCOMM控件在文本形式下,其传输的是
宽字符格式的字符,要想得到有用信息,还要额
外处理。
MSCOMM控件的插入
• 主菜单Poject->Add to Project ->
Components and Controls->wait…->
Registered ActiveX Controls->
Microsoft Communication
Control,Version 6.0
• 点击 insert ->OK(在控件工具里会出现一个新的
图标))
• 不点击Close 而点击More ,可看到关于
MSCOMM的详细帮助说明,再点击Close
• 待续…
MSCOMM控件的插入
• 点击“控件工具箱”中的MSCOMM控件
• 在对话框合适的地方点击右键(MScomm
控件插入完成)
• 按住左键拖动Mscomm控件到合适的地方
(不妨碍其他控件的显示即可)
• 试运行程序发现程序窗口中没有显示
Mscomm控件(因为该控件的属性默认为
隐藏)
MSCOMM控件的插入
• 为mscomm建立变量:主菜单->View>Classwizard->选择Member Variables属
性页->双击MScomm1->输入变量名(例
如m_Comm)->OK->OK
串口软件编写
• 添加命令按钮->修改属性:ID号以及显示字
符
• 添加对应命令程序:双击该按钮,并修改
命令函数名->OK->自动进入该函数编辑处
(此处一般添加有串口设置,打开串口,关闭
串口等按钮)
串口初始化程序
• 包括:
1 串口参数:波特率,奇偶校验,字节数,
停止位(例如:“9600,N,8,1”)
2 发送与接受数据类型(字符/二进制)
3 发送与接受缓冲器字节大小
4 发送多少个字节与接受多少个字节引起
中断(Windows不称为中断而称为:事件)
5 端口(com1.com2,….)……等等
数据的发送与接收
• 回到对话框 ->双击MSCOMM控件->修改函
数名(此为串口事件处理子程序)
• 发送字符串:在要发送的地方使用
m_mscomm.SetOutput(COleVariant(“字符
串”));
• 接收字符串:在事件处理函数中较为方便
• 难点:对VARIANT的使用
VC中的VARIANT数据
VARIANT 数据为枚举类型
enum VARENUM
{ VT_EMPTY
= 0,
VT_NULL
= 1,
VT_I2
= 2,
VT_I4
= 3,
VT_R4
= 4,
VT_R8
= 5,
VT_CY
= 6,
VT_DATE
= 7,
VT_BSTR
= 8,
VT_DISPATCH = 9,
VT_ERROR
= 10,
…
}
对VARIANT的使用:
VARIANT m_input; //定义m_input
::VariantInit(&m_input);// 初始化( 清零)
m_input.vt =VT_BSTR; //指定具体数据类型
数据传递格式
datain=m_input.bstrVal; //“=”两边数据类型要求一致
接收数据程序
•
•
•
•
•
•
•
•
•
•
•
VARIANT m_input;
::VariantInit(&m_input);
m_input.vt =VT_BSTR;
CString str;
unsigned int flag=m_mscomm.GetCommEvent();//comEvReceive有数据事件发
生
if(flag==2)
//1-发送了指定个数的数据,2-接收到指定个数的数据
{
m_input=m_mscomm.GetInput();//接收数据
str=m_input.bstrVal;
AfxMessageBox(str); //此处为数据处理
}
结论
• 串行通讯虽然有其技术的局限性,但目前
在许多场合依然得到广泛应用,作为控制
系统应用的设计者,必须熟练掌握串口通
讯的硬软件的设计与开发。
串口操作四个步骤
• 无论那种操作方式,一般都通过四个步骤
来完成:
(1) 打开串口
(2) 配置串口
(3) 读写串口
(4) 关闭串口