基于RS 485主从通信协议的实现
王 苒,汤冬谊
(大连电子学校教务中心 辽宁大连 116000)
摘 要:介绍基于R S 485的主从总线进行通信的分层体系结构设计,及其在8051单片机上的具体实现,程序使用
Keil C 51编写。
关键词:主从协议;C S 通信;帧;协议数据单元;封装
中图分类号:T P 336 文献标识码:B 文章编号:1004373X (2003)2406702
Ach ievem en t of M a ster slave Comm un ica tion Arch itecture Ba sed on RS 485
W AN G R an ,TAN G Dongyi
(Teach server Centre ,D alian E leetrical Schoo l ,D alian ,116000,Ch ina )
Abstract :T h is article in troduceM aster slave comm un icati on arch itectu re design based on R S 485,and app licati on in the 8051
Single ch i p system ,comp iled by the Keil C 511
Keywords :m ater slave p ro toco l ;C S arch itectu re ;fram e ;p ro toco l data un it ;encap su lati on
收稿日期:20030720
在工业控制领域,随着技术水平的不断提高,各种现场总线技术被开发出来,如PRO F I BU S ,CAN 等,但基于R S 485的主从总线因其简单成熟而仍然被广泛采用。主从协议与ISO O S I 七层协议的对应关系如图1所示。
图1 主从协议与ISO O S I 七层协议的关系图
在物理层,使用E I A T I A 485协议。
数据链路层由串行数据链路协议定义。串行数据链路协议为主从协议。
自定义应用层协议位于ISO O S I 的第7层,提供连接在总线上的各个设备之间的C S 通信。客户对应主节点,服务器对应从节点。1 数据链路层111 主从协议
串行数据链路协议为主从协议。只有一个主节点与一个或多个从节点同时连接在一条总线上。主节点
负责命令的发起,从节点接收命令并响应。从节点只有收到主节点命令时才会做出响应,从节点之间不能相互通信。
主节点向从节点发送2种类型的请求:
单址模式 主节点寻址一个单独的从节点。从节点收到并处理请求之后,向主节点返回一个消息(应答)。在该模式中,一个会话包含2个消息:主节点的请求、从节点的应答。每个从节点必须有一个独一无二的地址,从而可以被主节点寻址到。
广播模式 主节点向所有从节点发送请求。主节点发送的广播请求无需从节点响应。广播请求通常为写命
令,所有从节点必须接受。地址0为广播请求保留。112 帧描述
自定义应用层协议定义独立于底层的协议数据单元(PDU )。该协议建立在串行数据链路协议之上,发送请求的客户端将该PDU 封装在串行数据链路协议的数据单元中进行发送。如图2所示。
图2 自定义应用层的协议数据单元
113 传输模式11311 R TU 传输模式
采用R TU (远程终端单元)传输模式。该模式同A SC II 码模式相比,优点是在相同的波特率下能够传
7
6《现代电子技术》2003年第24期总第167期网络与通信
送更高的字符密度,数据的传输率较高。传送每个消息的字符流必须是连续的。
R TU模式下每个字节(11b)按以下顺序(自左向右)传输:
起始位12345678校验位停止位
11312 信息帧
信息帧格式如下:
从节点地址功能码数据CRC
1B1B0~252B2B,低位在先
一个完整的信息帧由连续的字节序列组成,必须有明确的开始和结束标志,以使接收方能够识别出完整一帧。协议规定,在2个独立帧之间的空闲时间至少为315个字符发送时间。如图3所示。
图3 帧间时间示意图
对于38400b s以上的波特率,帧间时隙建议不小于1175m s。
11313 CRC校验
循环冗余校验(CRC)字段包括2B,即16位二进制比特。CRC由发送方生成,添加在帧尾,随信息帧一同发送,接收方按相同算法校验,如果不同,则视为出错。
11314 协议软件实现
协议软件必须准确识别出一个完整帧并进行处理,如果有响应数据,则发送。软件实现表示如图4所示(其中t315表示315个字符发送时间)。
图4 软件实现示意图
软件实现时,可使用一个定时器监视t315的产生并在各个状态之间切换。接收和发送在串行中断中实现。本例采用8031系列Keil C51编写。
vo id T i m er1(vo id)in terrup t3
{
s w itch(GetComm State())
{
case COMM_S_I N IT:切换初始化状态至空闲状态 SetComm State(COMM_S_I DL E);
b reak;
case COMM_S_I DL E:空闲状态有数据发送则切换至发送状态,否则保持空闲状态 b reak;
case COMM_S_R ECV:
接收完毕,切换接收状态至处理状态 SetComm State(COMM_S_CTRL);
b reak;
case COMM_S_CTRL:等待处理 b reak;
case COMM_S_E M IT:
发送完毕,切换发送状态至空闲状态 SetComm State(COMM_S_I DL E);
b reak;
}
重装该定时器}
vo id Serial_In terrup t(vo id)in terrup t4
{
TR1=0;禁止定时器 s w itch(GetComm State())
{
case COMM_S_I DL E:
SetComm State(COMM_S_R ECV);
接收首位字符 b reak;
case COMM_S_R ECV:
接收其他字符 b reak;
case COMM_S_E M IT:
发送字符 b reak;
defau lt:
b reak;
}
重装该定时器并启动}
2 应用层
封装在串行数据链路协议中应用层协议如图5所示。
图5 自定义应用层的协议数据单元
功能码为1B,范围是1~255,其中128~255为异常响应保留使用。功能码的作用是标识客户向服务器发送的不同服务请求。如果服务器返回客户发送的功能码,说明这是一个普通的响应;否则服务器向客户返回异常响应功能码。如图6所示。
(下转第71页)
86
王 苒等:基于R S485主从通信协议的实现