||
多点温度监控系统下位机将温度转换并将温度值存储到单片机的RAM里,本章主要讨论采用比较廉价的通信方式—RS232来实现多点温度监控系统的上位机(PC机)向下位机(单片机)发送信息以及上位机接收下位机的温度信息并加以处理。
1.1 串行通信及RS—232总线
多点温度监控系统下位机采集到的大量温度信息,需要传送至上位机,为接下来的温度分析处理提供数据。下位机只有一个单片机与PC机通信且两者之间的距离不是很长,因此我们采用异步串行通信中应用最广的RS-232标准总线实现两者之间的信息传递。本节将主要介绍串行通信的基本概念,数据传送方式,RS-232总线标准等。
随着计算机系统的应用和微机网络的发展,计算机的通信功能显得尤为重要。从广义上讲,计算机通信可以分为并行通信和串行通信。并行通信速度快、实时性好,但占用的口线多、成本高、通信距离短,不适用于小型化产品。串行通信只需一根传输线即可完成通信功能,成本低,在通信中得到了广泛应用。计算机与外界的数据传送大多数都是串行的,通常把计算机与外界的数据传送称之为通信,因此提到的通信大多数都是指串行通信。
1、串行通信的概念
串行通信是计算机与外部设备进行信息交换的一种方式,是指数据一位一位地按顺序在一根信号线上进行传输的通信方式。串行通信有两种基本工作方式:异步传送和同步传送。在单片机中使用的串行通信都是异步方式,因此本系统采用异步串行通信方式来实现上位机与下位机之间的通信。
异步串行通信是以字符为单位组成的祯传送的,即一祯一祯地传送。祯由发送端一祯一祯地发送,通过传输线被接收一祯一祯地接收。发送端何时开始发送以及何时结束发送是由祯格式规定的。通信线上没有数据传送时为逻辑高电平,每当接收端检测到传输线上发送来的逻辑低电平(祯起始位)时就知道发送端已开始发送,每当接收端接收到祯的停止位时就知道一祯字符信息已发送完毕。
祯是一个字符的完整通信格式,由起始位、数据位、奇偶校验位和停止位等四部分组成。字符传送的祯格式如图3.1所示:
图3.1 异步通信的祯格式
祯中各部分结构和功能如下:
1)起始位:位于字符祯开头,始终为逻辑“0”低电平。用于向接收设备表示发送端开始发送一祯信息。
2)数据位:紧跟起始位之后,数据位的个数可以是5、6、7、8或9位。PC机中经常采用7位或8位数据传送,8051串行口采用8位或9位数据传送。传送时,数据位从最低有效位开始发送,依次在接收设备中被转换为并行数据。
3)奇偶校验位:位于数据位后,用于对字符传送作正确性检查,因此奇偶校验位是可选择的,共有3种可能,即奇校验、偶校验和无校验,由用户根据需要选定。
4)停止位:位于字符祯末尾,为逻辑“1”高电平,用于标志一个字符传送的结束。可取1、1.5或2位。
2、串行通信的数据传送方式
在串行通信中,数据通常是在发送端和接收端之间进行传送,根据数据传送的方向,可分成三种基本的传送形式:单工、全双工和半双工。
单工形式的数据传送是单向的,只需要一根数据线,通信线的一端固定为发送端,另一端固定为接收端。半双工形式的数据传送是双向的,但任何时刻只能由其中的一方发送数据,另一方接收数据。虽然半双工形式比单工形式灵活,但它的效率依然较低,从发送方式转换到接收方式所需要的时间大约为数个毫秒,这个时间延迟在时间较为敏感的系统是无法忍受的。全双工形式下,采用了信道划分技术,避免了半双工形式的缺点,数据传送是双向的,且可以同时发送和接收数据。本系统采用了效率较高的全双工通信形式。
3、串行通信的传送速率
在串行通信中,用“波特率”来描述数据的传输速率。所谓波特率,即每秒钟传送的二进制位数,其单位为bps。它是衡量串行数据传输快慢的重要指标。接收方的波特率和发送方的波特率可以分别设置,但接收方的波特率必须与发送方的波特率相同。
1.1.2 RS-232总线标准
在串行通信时,要求双方都采用一个标准接口,使不同的设备可以方便地连接起来进行通信。RS-232C是美国电子工业协会 EIA公布的串行通信标准,RS是Recommended Standard的字头缩写,代表推荐,232是标识号,C表示修改的次数。RS-232C适用于短距离或带调制解调器的通信场合,目前已广泛应用于计算机与外围设备的串行异步通信接口中。
1、机械特性
RS-232C的机械特性主要指两个通信装置如何实现机械对接。RS-232C是数据终端设备DTE与数据通讯设备DCE之间的接口,RS-232C的机械标准规定DTE应配置DB25插头,即25针连接器,DEC应配置DB25的插座,即25孔连接器。
表3.1 计算机DB-9连接器引脚信号功能
引脚号 |
信号名称 |
方向 |
信号功能 |
1 |
DCD |
PC机←对方 |
PC机收到远程信号(载波检测) |
2 |
RXD |
PC机←对方 |
PC机接收数据 |
3 |
TXD |
PC机→对方 |
PC机发送数据 |
4 |
DTR |
PC机→对方 |
PC机准备就绪 |
5 |
GND |
—— |
信号地 |
6 |
DSR |
PC机←对方 |
对方准备就绪 |
7 |
RTS |
PC机→对方 |
PC机请求发送数据 |
8 |
CTS |
PC机←对方 |
对方已切换到接收状态(清除发送) |
9 |
RI |
PC机←对方 |
通知PC机,线路正常(振铃指示) |
实际应用中,DB-25型连接器中的许多信号用不上,对于一般的双工通信,仅需几条信号线就可实现,包括一条发送线、一条接收线和一条地线。因此普遍采用DB9插头,即9针连接器。表3.1给出了DB9连接器的信号引脚功能。
本系统采用DB9型连接器,通过三根线实现系统连接,即接收数据引脚与发送数据引脚彼此交叉相连,信号地对应相接。这是最常用的全双工最简单系统连接法。
2、电气特性
RS-232标准的电气特性如表3.2所示。
表3.2 RS-232标准的电气特性
不带负载时驱动器输出电平 |
-25V~25V |
负载电阻范围 |
3~7k欧 |
驱动器输出电阻 |
<300欧 |
负载电容(包括线间电容) |
<2500pF |
逻辑“0”时驱动器输出电平 |
5~15V |
逻辑“0”时负载端接收电平 |
>+3V |
逻辑“1”时驱动器输出电平 |
-15~-5V |
逻辑“1”时负载端接收电平 |
<-3V |
输出短路电流 |
<500mA |
驱动器转换速率 |
<30 |
由表4.2可以看出RS-232C电平采用负逻辑,逻辑“0”:+5~+15V,逻辑“1”:-5~-15V。在计算机和智能仪器内,通用的信号是正逻辑的TTL电平。而RS-232C电平是负逻辑的,与TTL电平不兼容,必须进行电平转换。电平转换通常可以使用MC1488、MC1489、MAX232等芯片来实现。本系统是采用MAX232芯片实现电平转换的。
RS-232标准规定的波特率为:50、75、100、150、300、600、1200、4800、9600和19200bps。本系统波特率采用9600bps。
1.2 Visual Basic6.0中的串行通信控件MSComm
Visual Basic是一种可视化的编程语言,利用可视化技术进行编程,可使应用程序的开发简单、快捷,可编写出界面友好、功能强大的应用程序。MSComm控件全称为Microsoft Communications Control,是Microsoft公司提供的ActiveX控件,目的是为了简化Windows下串行通信编程,它既可以用来提供简单的串口端口通信功能,也可以用来创建功能完备的、事件驱动的高级通信工具。
MSComm控件在串口编程时非常方便,程序员不必花时间去了解较为复杂的API函数,而且在Visual Basic、Visual C++、Delphi等语言中均可以使用。使用它可以建立与串行端口的连接,通过串行端口连接到其它通信设备(如调制解调器),发出命令,交换数据,以及监视和响应串行连接中发生的事件和错误。
1.2.1 MSComm控件处理通信的方式
MSComm控件通过串行端口传输和接收数据,为应用程序提供串行通信功能。
它提供下列两种处理通信的方式。
1、事件驱动方式
事件驱动通信是处理串行端口交互作用的一种非常有效的方法。在许多情况下,在事件发生时程序得到通知,例如,在串口接收缓冲区中有一个字符到达或一个变化发生时,程序都可以利用MSComm控件的OnComm事件捕获并处理这些通信事件,OnComm事件还可以检查和处理通信错误。在程序设计中,可以在OnComm事件处理函数中加入自己的处理代码,一旦事件发生即可自动执行该段程序。这种方法的优点是程序响应及时,可靠性高。
2、查询方式
在程序的每个关键功能完成之后,可以通过检查CommEvent属性的值来查询事件和错误。适用于自保持的应用程序较小的编程。查询方式的编程可用计时器或Do…Loop程序实现。其实,查询方式实质上还是事件驱动,但在有些情况下,这种方式显得更为便捷。
1.2.2 MSComm控件的常用属性
对控件编程首先需要了解它的属性和事件。下面介绍MSComm控件的一些主要属性,如表3.3所示。
表3.3 MSComm控件的主要属性
属性 |
描述 |
Commport |
设置并返回通信串口号 |
Settings |
以字符串的形式设置并返回串口波特率、奇偶校验、数据位、停止位。格式为:MSComm1.Settings=”BBBB,P,D,S” |
Portopen |
设置并返回串口状态,也可以打开和关闭串口 |
Input |
从接收缓冲区中读取数据并清空缓冲区 |
Inputlen |
设置并返回一次从接收缓冲区中读取字节数 |
InBufferSize |
设置并返回接收缓冲区的大小,缺省值为1024字节 |
InBufferCount |
设置并返回接收缓冲区中等待接收的字符数 |
InputMode |
设置并返回接收数据的类型。其值为0和1时,分别表示通过Input属性以文本方式和二进制方式取回数据 |
OutBufferSize |
设置并返回发送缓冲区的大小,缺省值为512字节 |
OutBufferCount |
设置并返回发送缓冲区中等待计算机发送的字符数 |
Output |
向发送缓冲区发送数据,该属性设计时无效,运行时只读 |
Rthreshold |
在MSComm控件设置ConunEvent属性为comEvReceive并产生OnComm之前,设置并返回要接收的字符数 |
其中CommEvent属性是一个非常重要的属性。一旦串口发生通信事件或产生错误,依据产生的事件和错误,MSComm控件为CommEvent属性赋以不同的代码,同时产生OnComm事件。用户程序就可在OnComm事件处理程序中针对不同的代码,进行相应的处理。CommEvent属性的事件代码、常数以及含义参见表3.4和表3.5。
表3.4 CommEvent通信事件代码、常数及含义表
事件代码 |
常值 |
含义 |
1 |
ComEvRecive |
接收到Rthreshold个字符。该事件将连续产生,直到用Input属性从接收缓冲区中读取并删除字符 |
2 |
ComEvSend |
发送缓冲区中数据少于Sthreshold个,说明串口已经发送了一些数据,程序可以用Output属性继续发送数据 |
3 |
ComEvCTS |
Clear To Send信号线的状态发生变化 |
4 |
ComEvDSR |
Data Set Ready信号线从1变到0 |
5 |
ComEvCD |
Carrier Detect信号线的状态发生变化 |
6 |
ComEvRing |
检测到振铃信号 |
7 |
ComEvEOF |
接收到文件结束符 |
表3.5 ComEventnt通信错误代码、常数及含义表
事件代码 |
常数 |
含义 |
1001 |
ComEvntBreak |
接收到一个中断信号 |
1002 |
ComEvntCTSTO |
Clear To Send信号超时 |
1003 |
ComEvntDSRTO |
Data Set Ready信号超时 |
1004 |
ComEvntFrame |
祯错误 |
1006 |
ComEvntOverrun |
串口超速 |
1007 |
ComEvntCDTO |
载波检测超时 |
1008 |
ComEvntRxOver |
接收缓冲区溢出,缓冲区中已没有空间 |
1009 |
ComEvntRxParity |
奇偶校验错 |
1010 |
ComEvntTxFull |
发送缓冲区溢出,缓冲区中已没有空间 |
1011 |
ComEvntDCB |
检测串口的设备控制块时发生错误 |
1.2.3 MSComm控件的使用
MSComm控件通信的流程图如图3.2所示。编写程序时,只需要按照下面流程图,即可实现通信功能。
图3.2 MSComm控件通信的流程图
1.3 PC机与AT89S51单片机的通信
PC机与单片机之间的串行通信主要实现下位机的温度数据的采集和传输。下位机程序用汇编语言编写,固化在AT89SC51单片机中。单片机是测量系统的数据采集端,它主要完成对多个测温传感器DS18B20的控制和温度数据的读取以及同上位机的数据通信。上位机软件用VB编写,主要完成通信参数设置和温度数据的转换。
通信参数设置主要用来完成对系统通信参数的设置,包括设定通信端口、波特率、数据位、奇偶校验位和停止位。温度数据的转换主要实现对接受到的温度数据由十六进制到十进制的转换,同时这一步也为后面的数据库的生成及温度信息管理工作做好了准备。
PC机与单片机之间的通信通过串口实现。由于RS232电平与TTL电平不兼容,本系统通过MAX232芯片实现TTL电平到RS232电平的转换,MAX232芯片是包含两路接收器和驱动器的RS232电平转换芯片,适用于各种232通信接口。如图3.3所示。
图3.3 PC与硬件单片机的连接电路图
为使数据在PC和单片机之间无差错的传送,本文采用通信协议来规约数据的传输。PC机与单片机双方的通信协议如下:
波特率:9600bps;
数据格式:8位数据位,1位停止位,无奇偶校验;
传送方式:PC机和单片机都采用查询方式收发数据,传送的数据格式为二进制格式。DS18B20转换出的温度信息包含两个字节,经过处理后,一个字节为温度的整数部分,另一个字节为温度的小数部分。每个DS18B20共传送三个字节,第一个字节为传感器所在的行列号,第二个字节是温度的整数部分,第三个字节是温度的小数部分。单片机收到PC机发送的握手信号“S”后,就依次命令DS18B20进行温度转换;PC机依次接收单片机上传过来的数据,并显示在特定区域。
1.3.3 VB程序编制
本系统串行通信的界面如图3.4所示:
图3.4 串行通信的界面
因为系统采用的是事件驱动,所以具体程序的编制必须围绕相应的事件进行。本系统中,有关通信的工作过程主要有:通信参数初始化、发送握手信号、接收数据。具体初始化程序如下:
Private Sub Form_Load()
MSComm1.CommPort = 1 '设置通讯窗口
MSComm1.Settings = "9600,N,8,1" '设置数据传输率和发送字符格式
MSComm1.InputMode = comInputModeText
MSComm1.InBufferSize = 1024 '设置接收缓冲区1024Byte
MSComm1.InputLen = 0 '设置或返回一次从接收缓冲区中读取字节数,0表示一次读取所有数据
MSComm1.RThreshold = 21
If MSComm1.PortOpen = False Then '打开串口
MSComm1.PortOpen = True
End If
End Sub
初始化完成后,PC机就可以与单片机进行通信了。点击“开始接收”按钮即可完成向单片机发送握手信号功能。
发送程序为:
Dim rece As String
rece = MSComm1.Input
If Mid(rece, 1, 1) = "S" Then
Text1.Text = Text1.Text & rece
Else
Text1.Text = Text1.Text
End If
单片机接收到PC机发送的握手信号S后,就依次命令总线上的DS18B20进行温度转换并向PC机发送转换后的温度信息。我们在OnComm事件里进行温度数据的接收和转换。在转换后的温度之间加上一个空格,且在单个DS18B20温度信息末尾加上回车和换行符,目的是为PC机接收到的温度信息保存的文本文件转换成数据库作好准备。如果系统初始化不正常或DS18B20的端脱开未接好时,转换出的温度为默认初始值+85℃,温度高低字节为05H和50H。系统检测到DS18B20转换的温度值为上面两种情况时,我们在接收区显示该测点出现“测量有误”字样,提醒我们对系统进行硬件线路检查。OnComm事件程序如下:
Private Sub MSComm1_OnComm()
Dim buffer As Variant
Dim arr() As Byte
Dim i As Integer, a As Integer
Dim restr1 As String, restr2 As String, srestr3 As String, ABC As String
a = MSComm1.InBufferCount
Select Case MSComm1.CommEvent
Case comEvReceive
buffer = MSComm1.Input
arr = buffer
For i = 0 To 18 Step 3
restr1 = arr(i)
restr2 = arr(i + 1)
restr3 = arr(i + 2)
If restr2 = 127 And restr3 = 240 Then
Text1.Text = Text1.Text = Str(Now) + " " + restr1 + " " + "测量有误" + " " + Chr(13) + Chr(10)
Else
If Val(restr3) = 0 Then
ABC = "." + Mid$(Str(Val(restr3) / 256), 2, 3)
Else
ABC = Mid$(Str(Val(restr3) / 256), 2, 3)
End If
Text1.Text = Text1.Text + Str(Now) + " " + restr1 + " " + restr2 + ABC + " " + Chr(13) + Chr(10)
End If
Next i
End Select
End Sub