PC机与多单片机的串行通信
本文作者(陆建华),请您在阅读本文时尊重作者版权。
摘要:本文介绍了PC机与多台单片机间的串行通信原理、实现方法、相应的通信协议,重点阐述了利用MSComm通信控件及C51语言实现通信控制的方法,并给出了相关程序流程图及部分源代码。
关键词:PC机;多单片机;串行通信;MSComm控件
串行通信是各式各样的设备和计算机联机最简单的通信方式。在工程应用中,常常由一台PC机和一台或者多台单片机构成主从式计算机检测系统。这样的系统中,以单片机为核心的智能测控仪表(从机)作为现场检测设备,完成数据采集、处理、和控制等各项任务,同时将信息传给PC机(主机),PC机将这些资料加工处理后,然后进行显示、打印、报表等操作,也可以将各种控制命令传送给单片机,干预单片机系统的运行,从而实现对网络监控、现场数据采集自动化工业控制等多种场合中。
以往在Windows平台下的串行通信多使用其提供的API函数来实现,这种方法使用起来需要很多底层设置,因而较为繁琐,且难以实现。本文介绍在32位Windows操作系统下,用Visual C 6.0的ActiveX技术描述PC机与多台单片机的串行通信原理及相关的软、硬件设计。
一、硬件组成
硬件部分主要包括两部分:上位机端和下位机端。上位机即为主控PC机,操作系统为Windows2000和Windows XP均可;下位机为多个单片机终端,每个终端由AT89S52单片机、数据采集部分组成。
PC机只有常用的RS-232标准串行通信接口,然而,采用RS-232标准存在着传输距离短(一般为不超过15m)、传输速率低(不超过20Kbps)、抗干扰性差等缺点。RS-485因其采用平衡发送和差分接收而具有抑制共模干扰的能力。加上总线收发器具有高灵敏度,能检测低至200mV的电压,故传输信号能在千米以外得到恢复。用于多点互连时非常方便,可以省掉许多信号线。应用RS-485可以联网构成分布式系统,其允许最多并联32台驱动器和32台接收器。普通的PC机一般不带RS-485接口,因此,为了实现基于RS-485协议的串行通信,必须设置RS-232/RS-485转换电路。硬件电路的一个重要部分是实现RS-232与RS-485电平的转换。本设计使用MAX232先实现RS-232与TTL之间的转换,然后再使用MAX487实现TTL与485之间的转换。
下位机为AT89S52单片机,单片机的工作电平为TTL电平,而传输线电平为RS-485电平,所以需进行TTL与RS-485 的电平转换。转换芯片可用MAX487。MAX487是一个准双向口,即要通过选通来确定是发送还是接收。发送数据时,发送方选通自己的发送驱动器(MAX487的DE),该信号反向后选通接收方的接收驱动器(MAX487的/RE)。因DE和/RE只能有一个有效,所以可用单片机的IO口(如P1.7)来一起控制MAX487的DE和/RE。硬件连接图如图1所示。
二、通信协议设计
为保证通信进行,首先做到单片机的串行口与主控机串行口的设置保持一致,即数据格式一致、通信波特率相同。如果是多点通信,每个从机要分配一个地址码。系统中协议有3种帧格式:呼叫帧、应答帧和数据帧。呼叫帧由主机发出。应答帧只能由从机发出。当从机收到呼叫帧后,把本机地址和当前状态回发给主机。设置开机自检、自诊断程序,机器不能带病工作;如果需要,还可以设置在工作空闲时或定时自检程序。
单片机的串行通行模式2、3含第九位数据RB8/TB8 可用于多机通信,然而PC机的帧格式的第九位为校验位,虽然可以通过软件使其置0或置1达到与单片机一样的格式,然而这种方法难以调试,所以本文是采用自行设计的帧格式进行通信。
本课题中通信帧的帧结构定义如表1所示。通信帧的内容包括起始字节、地址字节、类型字节、数据长度字节、数据字节、校验和字节和结束字节。
起始字节定义为“$”字符,其数值为0x24;结束字符定义为“*”字符,其数值为0x2A。
地址字节实际上存放的是下位机的设备号,分别为0x01、0x02、0x03……注意,各下位机设备应避免重复地址。
本课题的帧类型主要有6种,这由类型字决定,它们的值及说明如表2所示。
其中,ACTIVE、GETDATA、READY为单纯的指令帧,即数据字节为0字节,这3种指令帧的长度最短,仅为6字节。其他3种帧为相应的数据帧,数据字节长度N最大为20,所以通信帧的帧长最大为26字节。
采用上述的帧格式传输,既可区分不同的单片机,又可区分不同的帧类型,这样就避免正在通信的某个单片机发送的帧对其他单片机造成干扰。
由于使用RS-485总线结构,所以该系统工作方式为半双工。PC机串口置波特率为9600bps,无奇偶校验,8位数据位,1位起始位,1位停止位。单片机串口工作于方式1,通过设置T1的TH1,TL1 使波特率也为9600bps。
整个系统的通信还需遵守以下协议:
①PC机主导整个通信过程。由PC选择与其通信的下位机设备号(地址)。
②PC机在发送完“ACTIVE”指令后,进入接收状态,同时开启超时控制。如果接收到错误帧则继续等待,如果在规定的时间内未能收到下位机的返回指令“READY”,则认为下位机不在位,并给出告示。
③PC机收到下位机的返回指令“READY”后,可以发送“GETDATA”或“COMTEST”指令,同样开启超时控制。如收到相应的响应帧,则处理之。如果接收到错误帧则继续等待,如果在规定的时间内未能收到下位机的返回指令,则认为下位机未准备好或不在位,并给PC机告示。
下位机复位后,将等待上位机发送指令,并根据具体的指令内容作出应答。如果接收的指令帧或数据帧错误,则会直接丢弃该帧,不做任何处理。
三、软件设计
1.MSComm(Microsoft Communication Control)控件介绍
MSComm控件是Microsoft为简化Windows下串行通信编程而提供的ActiveX控件。每个MSComm控件对应着一个串行端口,在使用MSComm控件时,1个MSComm控件只能同时对应一个串口。MSComm控件有很多重要的属性,其中常用的是如下几个:
(1)CommPort设置并返回通信口号,缺省值为COM1,可设置1~16个。
(2)SetStrings设置并返回波特率、奇偶效验、数据位、停止位的字符串。其中波特率的范围为 。
(3)PortOpen设置并返回通信口的状态,同时用来打开和关闭通信口。
(4)InputLen决定每次Input读入的字符个数,缺省为0,表示读取接受缓冲区的全部内容。
(5)Input读入并清除接收缓冲区的字符。
(6)InBufferCount返回接收缓冲区已接收的字符数,通过置0可清除接收缓冲区。
(7)Output将发送的字符串或数组写到发送缓冲区。
(8)InputMode定义Input属性获得数据的方式:0为文本;1为二进制。