CserialPort类的RS-485多机通信设计与实现

2011-10-09 09:46王雷阳李正生
电子设计工程 2011年19期
关键词:服务程序中断串口

王雷阳,李正生

(第二炮兵工程学院 101室,陕西 西安 710025)

在工业数据采集系统中,多以单片机作为核心器件采集数据,PC机大多通过RS-232接口和单片机进行通讯,实现对单片机的控制及在PC机上显示及处理所采集的数据。由于RS-232接口协议所传输的距离[1]不能超过30 m,再者在只占用一个串口资源的情况下只能实现单机间的通讯,所以要实现多机远距离通讯时,将RS-232转换为RS-485接口协议。

1 RS-485接口概况

RS-485作为一种通用串行通信接口,具有传输距离长、速度较高、电平兼容性好、使用灵活方便、成本低廉和可靠度高等优点[2],在工业测量、智能控制等许多领域都有着广泛的应用。在实际应用中,需要注意电气规定、网络拓扑结构及传输线缆的选择。

首先考虑电气规定。不同的接口有不同的标准,使用中,需要将表1中常见的3种电平进行相互转换。

其次考虑网络拓扑结构。在数据采集系统中,一般有多个采集点,因而需要构建网络,进行主机和从机间的通讯。网络拓扑一般采用终端匹配的总线型结构,不支持环形或星形网络[3]。在构建网络时,应注意以下两点。

表1 常见接口电气特性表Tab.1 Electric characteristic of common ports

1)总线连线的方式 采用一条双绞线电缆作为总线,将各个从机串联起来,从总线到各个从机的引出线长度应尽量短,以便使引出线中的反射信号对总线信号的影响最低。

2)总线的特性阻抗 注意总线特性阻抗的连续性,在阻抗不连续点就会发生信号的反射。如果总线的不同区段采用了不同的电缆,或某一段总线上有许多从机紧靠在一起安装,再者是过长的分支线引出到总线等情况出现,一产生阻抗的不连续性。

最后考虑传输线缆。在低速、短距离、无干扰的场合可以采用普通的双绞线,反之,在高速、长线传输时,则必须采用阻抗匹配(一般为120 Ω)的RS485专用电缆,而在干扰恶劣的环境下还应采用双绞屏蔽电缆。

2 硬件设计

PC机作为主机,Atmega16 AVR单片机为核心作为从机,通过RS-485总线结构将主机与各个从机相连接。PC机通过市场上现有的RS-232/RS-485转接器连接到485总线网络,各个从机通过SN75176芯片连接到485总线网络,实现主机与从机间的通讯。485总线接口硬件结构如图1所示。

图1 接口硬件结构框图Fig.1 Block diagram of interface hardware

ATmega16是ATmega系列中一种高性能、低功耗的8位AVR RISC微处理器。通过在一个时钟周期执行一条指令,ATmega16可以获得接近1 MIPS/MHz的性能。该单片机具有16 kB的系统内可编程Flash(具有同时读/写的能力)、512 B EEPROM、1 kB SRAM、32个通用I/0口。此外,还具有一个10位的A/D转换器,一个全双工同步/异步串行口和3个可编程定时/计数器。ATmega16功能强大,价格适宜,是一款性价比很高的MCU[4]。

通讯接口采用SN75176收发器芯片将单片机的TTL电平转换为RS-485接口电平,其与单片机的接口电路如图2所示。通过Atmega16的PA0和PA1按照表2的方式对SN75176的DE和RE端使能,表中,H为高电平输入,L为低电平输入。在A端与B端间并联120 Ω(1/4 W)的终端匹配电阻,以便有效抑制反射信号,通信距离可达1 200 m。

图2 SN75176接口电路图Fig.2 SN75176 ports circuit

表2 SN75176端口使能模式Tab.2 SN75176 ports enabled modal chart

3 软件设计

3.1 通讯协议

串口通信协议分为底层协议和用户层协议。底层协议一般由计算机硬件提供商及设备厂家提供,而用户层协议需要,以此确定通信双方的数据以何种方式进行发送、接收及保证数据在串行通信过程中的正确性。在编制用户层协议时,需要遵守以下几个原则。

1)数据包必须有包头 包头是数据接收端判断数据是否传输的重要标志,如果接收端接收到了包头,就认为以后的数据为有效数据。因而包头字符必须有别于有效数据,如果有效数据中包含了包头,就会引起通信混乱。程序中,包头定为两个字节,0xA7 0x7A。

2)数据包应该指明长度 指明了数据长度,接收端便能够判断数据包是否结束。

设置各个从机的地址,分别为0x01~0x04,主机通过轮流发送从机地址的方式控制相应的从机和接收从机的数据。从机只能被动的接收命令,只有被查询到的从机才能向主机发送数据,本次通讯结束后,从机又处于接收命令的状态。通讯的波特率为9 600 bps,单片机晶振选为11.059 2 MHz。数据帧格式设为:8数据位、无校验、1停止位。从机向主机发送数据包格式为:2字节的字头(0xA7 0x7A)、30字节的数据。

3.2 主机的软件设计

3.2.1 串行通信方案选择

主机在Windows环境下以VC++6.0软件为开发平台,主要解决串口通讯及数据运算处理。常用的串行通信有以下几种方案[5]:

1)直接利用通信端口函数(-input(),-output()等),采用TC等C语言工具来开发,这种方案由于涉及具体的硬件电路,所以比较复杂,而且TC开发可视化界面较困难;

2)用Windows API函数实现通信功能,实现起来较复杂;

3)直接利用ActiveX控件(如MSComm控件)来实现,这种方案的特点是方便、简单;

4)利用串行通讯类来实现,如Cserial类、CserialPort类。

本设计采用CserialPort类实现串口通信。CserialPort类是Remon Spekreijse写的一个串口类,是一个简单而强大的多线程串口编程工具。使用时,只需将该类添加到编写的工程里,就可以使用其成员函数,并且用户可以根据需要对该类进行改进。

3.2.2 程序实际开发

程序开发的主要步骤如下:

1)建立可视化窗口界面 建立基于对话框的MFC应用程序SerialPortTest,在自动生成的用户界面上添加必要的控件。界面如图3所示,使用时,按照通信要求正确设置串口参数,打开串口后,选择从机地址点击发送,接收框便会自动显示该从机的测量数据,并显示出连续测量n次的平均值。

2) 添加CserialPort类文件 将SerialPort.h和SerialPort.cpp文件复制到工程根目录下,用Project-Add to Project-Files命令将上述文件加入工程,并在SerialPortTestDlg.h中加入#include “SerialPort.h”。

图3 窗口界面图Fig.3 Window interface

3)串口初始化 串口初始化主要是按照默认的参数打开串口。默认的参数设置为:串口号为串口1、波特率9 600、8个数据位、1个停止位、无奇偶校验。此外,如果在初始化成功后,还要调用串口通信监测线程函数,这样各种串口状态和事件才能被监测到。

使用的函数为:

① BOOL InitPort (CWnd*pPortOwner, UINT portnr,UINT baud, char parity, UINT databits, UINT stopbits,DWORD dwCommEvents, UINT writebuffersize), 该函数为串口初始化函数,如果初始化成功,就返回TRUE。

②BOOL StartMonitoring(),该函数为串口通信监测线程函数。

4)人工添加串口消息响应函数:OnComm(WPARAM ch,LPARAM port)

因为CserialPort类所有的消息均需要人工添加消息处理函数,所以需要用户自己对函数进行声明和消息映射。首先在SerialPortTestDlg.h中添加该函数的声明:

接着,在SerialPortTestDlg.cpp中加入函数OnComm()的实现,关键代码如下,实现了将收到的数据字符显示到编辑框中,然后将字符转换为整形,解析出所需要的数据,并将多次测量的结果计算出均值。

LONG CSerialPortTestDlg::OnComm (WPARAM ch,LPARAM port)

5)添加串口发送函数。在发送框中输入进行通信从机的地址,由于单片机地址匹配的是十六进制数据,因而将待发送的数据在程序中使用用户编写的Str2Hex函数转换为十六进制。接收框便可接收到该从机所采集的数据。

3.3 从机的软件设计

通过宏定义给各个从机Atmega16单片机定义从机地址,在初始化后保持接收地址命令状态,当与本机地址匹配后发送所采集的数据,其余从机处于地址接收等待状态,当该从机发送完数据后作出相应的反应,回到接收地址命令的状态。各个从机串口接收和发送均使用中断的方式处理数据,这样能够减轻单片机的运行负荷,图4为从机串口接收完成中断服务程序流程图。

图4 从机串口接收完成中断服务程序流程图Fig.4 Receive interrupt program chart of slave

图5 从机串口发送完成中断服务程序流程图Fig.5 Transmit interrupt program chart of slave

图5为串口发送完成中断服务程序流程图。在服务程序中,首先发送字头A7,此时产生发送完成中断,程序进入中断服务程序,接着发第二个字头7A,接着发送所采集的数据,每发一个数据,便计1次数,当发送32次时,一个完整的数据包便发送完毕,此时,设置一个标志,当主程序查询到该标志时,程序便跳出中断。

4 结 论

通过调试发现,信号接地很重要,不能忽略,若不接地严重影响数据的有效通信。主要有两方面的原因:一是共模干扰问题,RS-485收发器有一定的共模电压范围,如果没有接地,很可能导致接收器共模输入超出正常范围,并在传输线上产生干扰电流,轻则影响正常通信,总则损坏通信接口电路;二是电磁干扰问题,发送驱动器输出信号中的共模部分需要一个返回通路,如没有信号地,就会以辐射的形式返回源端,整个总线就会向外辐射电磁波。

将本文的设计应用到线阵CCD缝隙测量系统中,经过软硬件测试,各个从机能够接收到主机的命令并准确的发出CCD测量的缝隙数据,主机能够接收到数据并计算出缝隙的大小,总体运行良好,可靠性较高。

[1]李永,李芙玲,贺秀玲.基于PC机和AVR单片机的RS485通信系统的设计与实现[J].工矿自动化,2008(1):108-110.

LI Yong, LI Fu-ling,HE Xiu-ling.Design and implement of RS-485 communication system based on PC and AVR MCU[J].Industry and Mine Automation,2008(1):108-110.

[2]耿立中,王鹏,马骋,等.RS485高速数据传输协议的设计与实现[J].清华大学学报 :自然科 学版,2008,48(8):1311-1314.

GENG Li-zhong, WANG Peng, MA Cheng,et al.Design and implement of RS-485 high speed data communications protocal [J].JournalofTsighua University:Sci&Tech,2008,48 (8):1311-1314.

[3]龚建伟,熊光明.Visual C++/Turbo C串口通信编程实践[M].北京:电子工业出版社,2005.

[4]江海波,王卓然,耿德根.深入浅出AVR单片机[M].北京:中国电力出版社,2008.

[5]陈善林,杨承志,杨晓洪.基于CSerialPort类的PLC与上位计算机的串行通信 [J].云南民族大学学报:自然科学版,2004,13(2):129-138.

CHEN Shan-lin,YANG Cheng-zhi,YANG Xiao-hong.Serial communication between PLC and computerbased on CSerialPort class[J].Journal of Yunnan Nationalities University:Natural Sciences Edition,2004,13(2):129-138.

[6]任海波,韩崇伟,李硕,等.CSerialPort类在定位定向数据采集系统中的应用[J].火炮发射与控制学报,2010(1):26-29.

REN Hai-bo,HAN Chong-wei,LI Shuo,et al.The application of CSerialPort class in the data acquisition system of location and orientatin[J].Journal of Gun Launch and Control,2010(1):26-29.

猜你喜欢
服务程序中断串口
SylixOS系统的中断嵌套机制研究与实现
浅谈AB PLC串口跟RFID传感器的通讯应用
基于C#的进程守护程序的设计
UDP穿透NAT技术实现数据唤醒车联网T-Box设备的方案
跟踪导练(二)(5)
千里移防,卫勤保障不中断
数字电源内部数据传输的串口通信方法实现
USB接口的多串口数据并行接收方法探索
基于蓝牙串口适配器的GPS接收机与AutoCAD的实时无线通信
水利工程施工监理服务程序及质量控制