景区闸机异步串行通信协议的设计与实现 您所在的位置:网站首页 异步串行通信协议帧头为 景区闸机异步串行通信协议的设计与实现

景区闸机异步串行通信协议的设计与实现

2024-07-14 22:27| 来源: 网络整理| 查看: 265

沙亚雄,徐骏善

(南京理工大学 机械工程学院,江苏 南京 210094)

0 引言

随着计算机及网络技术的发展和我国数字化景区建设步伐的加快,电子票务管理系统已成为智慧景区建设的重要组成部分,是实现景区标准化管理、树立良好形象必不可少设备和管理手段。闸机作为票务管理系统的重要终端,其主要功能是实现自动检票、管理人流、规范行人出入、上传检票信息[1]。

本文所应用的景区闸机为翼闸,如图1,其内部逻辑结构有二维码读写器、IC卡读写器、身份证读写器、通行算法控制板、机芯控制板和通信主控板。其中通信主控板对上通过RS485串口与PC机通信,对下通过RS232串口与二维码读写器、IC卡读写器、身份证读写器、机芯控制板通信。无论是RS485还是RS232都属于异步串行通信方式,所以有必要设计一套简单、高效、安全、复用性强的通信协议,以保证设备之间信息的稳定交互。

图1 翼闸内部逻辑结构示意图

1 通信帧设计

众所周知,串口通信接收和发送数据都是面向字节的,但一个字节的信息量和可靠性显然不能达到设备之间通信的要求。故串口通信通常都是面向帧的,即以多个字节组成一帧来传递信息。帧的设计比较自由灵活,一般根据具体的通信方式、实时性及可靠性要求等进行设计[2]。本文从结构和类型对通信帧进行设计。

1.1 结构设计

通信帧结构如下:

1) 帧头:表示帧的开始,一般选用固定的1个字节或多个字节。

2) 报头开始:表示帧中报头的开始,一般选用固定的1个字节或多个字节。

3) 报头:表示帧中报头的内容,报头内容可自定义、放地址码、帧类型、帧长度等,其内容不宜过多。

4) 报文开始:表示帧中报文的开始,一般选用固定的1个字节或多个字节。

5) 报文:表示帧中报文的内容、报文内容可自定义,放命令码、参数等,是通信中数据的载体。

6) 帧尾:表示帧的结束,一般选用固定的1字节或多字节。

7) 校验码:数据校验,在此选择BCC校验方式,即报头内容和报文内容依次异或。

图2列出3种通信帧结构,其中标准结构拥有报头和报文,也有无报文结构和无报头结构,可根据需要选定。

图2 通信帧结构示意图

1.2 类型设计

考虑到翼闸使用了半双工的RS485和全双工的RS232串行通信方式,故设计2种类型的通讯帧,即控制帧和数据帧,其中控制帧主要用于对通讯流程进行控制,数据帧则用于传输数据。同时帧头等固定字节均选用对应含义ASCII码,为避免报头或报文中出现此类选定的ASCII码,在此采用转义字符的方式,即若报头或报文中出现DLE(0X10),则需要在其前面加上一个DLE转义字符,校验时只计入一个DLE字符。控制帧使用频率较高,信息量小,应尽量短小,故在此选择无报文结构的帧。且报头内容固定为3个字节:地址码、类型码、指令码。地址码用于表示此帧的接收对象;类型码用于表示帧的类型,在此即控制帧和数据帧;指令码则是表示此控制帧的功能。

控制帧格式为:

ACK 表示校验通过,收到正确的帧;

NAK 表示校验未通过,收到错误帧或接收超时;

ENQ 请求建立通信,发送数据;

XON 设备空闲,可以接收数据;

XOFF 设备繁忙,暂停接收数据。

数据帧格式为:

2 通信实现2.1 环形缓冲区和队列

环形缓冲区是嵌入式系统中十分重要的一种数据结构,在串行通讯中发送方将环形缓冲区中的数据逐一取出通过串行接口发送出去,而接收方接收后方可将收到的数据依次置入环形缓冲区中,待检测到一个完整的数据帧后再进行处理。环形缓冲区是一个先进先出(first in first out,FIFO)的队列,数据只能从尾部添加,从头部获取。其在内存中占用一块连续的地址空间,通常用一个数组来定义[2]。

若要对一帧数据进行描述,用一个结构体是非常适合的,若将此结构体作为链表的数据域,再将链表组织为队列的形式,则使得串口接收发送数据帧变得简单。接收数据时,将收到的字符依次放入接收环形缓冲区中,检测到一个完整的帧后,从队列尾部寻找一个可用空节点,将此帧的描述赋与节点,推入接收队列中。应用层则只需检测接收队列是否非空,若非空则根据节点中的帧描述从接收缓冲区中取出帧进行处理。发送数据时组织好帧后,将帧内容添加进发送缓冲区,同时帧描述推入发送队列中,若要发送数据只需检测发送队列,非空则根据节点帧描述从发送环形缓冲区中取出帧进行发送。

图3以接收帧过程说明环形缓冲区和队列在帧接收和提取时的应用,发送过程类似。

图3 接收和提取帧数据结构示意图

几个重要数据结构说明:

1) 结构体1:帧描述结构体,用于描述帧在环形缓冲区中的位置和一些重要属性,如帧的报头报文在缓冲区中的位置和长度、帧地址、帧类型、发送状态、生命周期等。

2) 结构体2:帧描述链表的节点。

3) 链表:将多帧数据的描述组织成队列存放。

4) 环形缓冲区:接收环形缓冲区,用于存放接收到的字符。

5) 结构体3: 接收帧结构体,用于存放帧的有效内容,即去除帧头等固定字符后的内容、报头和报文的内容和一些重要属性。

如图3所示,接收帧过程中,先将串口接收到的有效字符放入接收缓冲区中,待接收到BCC字符并校验通过后将接收帧描述(结构体1)存入队列中。提取帧时通过队列中链表节点(结构体2)的描述将接收缓冲区中的报头、报文内容提取到接收帧结构体(结构体3)中。应用层中,结构体3的内容就是帧的有效内容,只需对其进行解析处理即可。

2.2 通讯实现图

一套可靠的通讯协议,一次完整的通讯过程必然需要设备之间进行多次握手,才能保证通讯稳定可靠,同时通讯过程中还应该包含确认机制,否定重发机制,超时重发机制等,用通讯实现图可清楚描述此类过程。图4共列出7种情况。

图4 通讯实现图

1) 正常通信过程:发送方发送请求,接收方回复设备空闲,发送方发送数据,接收方回复数据接收正确。

2) ENQ请求3次内无回应:发送ENQ请求后,若在设定时间Xms后无应答,则重发ENQ请求,若重发2次后仍然无响应则中断通讯,认定接收设备通讯异常。

3) ENQ请求回应为XOFF:发送ENQ请求后,收到XOFF回应,则Nms后再次发送ENQ请求,直到收到XON。

4) 数据发送3次内无回应:若ENQ请求成功,并发送数据后,若在设定时间Xms后无回应,则重发数据,若重发2次后仍然无回应则中断通讯,认定接收设备通讯异常。

5) 数据发送3次内有回应:若ENQ请求成功,并发送数据后,若在设定时间Xms后无应答,则重发数据,若在3次内有ACK或NAK回应,则进入正常通讯阶段。

6) 数据发送3次内无ACK回应:若ENQ请求成功,并发送数据后,Xms时间内收到NAK回应,则立刻再次重发该数据,若在3次内无ACK回应,则中断通讯,认定通讯线路干扰过大。

7) 数据发送3次内有ACK回应:若ENQ请求成功后,发送数据后,Xms时间内收到NAK回应,则立刻再次重发该数据,若在3次内有回应有ACK,则进入正常通讯阶段。

2.3 接收帧实现

通信协议结构设计好之后,发送、接收都应该严格按照设计的结构来处理,对于接收来说要符合设计结构的帧,即需要屏蔽异常字符,同时需要去除帧头等固定字符,提取报头、报文等有效字符。由于串口是面向字节的,且串口通讯速度非常慢,在此选用有限状态机来实现按设计帧结构接收数据。有限状态机的原理是发生事件后,根据当前状态,决定执行的动作,并设置下一个状态,其使用范围很广[4]。

图5的状态迁移图中使用UML标准标记法,即当一个系统处于“状态A”时发生“触发”事件,只有当[临界条件]为真时系统会转换到“状态B”,然后,一个动作被执行。图中可以看出根据设计的帧结构一共有8个状态,而触发事件是串口接收到一个字节,动作则是将报头或报文内容推入接收缓冲区。根据此图可方便编制出接收帧函数。若在单片机中使用,则只需将接收帧函数放入串口接收终端中,即每接收一个字节,执行一次有限状态机。待BCC验证后,帧有效内容存入接收缓冲区,帧描述推入接收队列。

图5 接收帧状态迁移图

2.4 应用层状态设计

要想实现图4中的7种通讯过程,需结合应用层实现,即需提取帧之后,判断帧类型或帧内容后才能做出相应的回应,实现重发机制也需要在应用层进行一些设计。图6为应用层状态示意图,其包含了发送帧和接收帧的状态处理,二者不是孤立的,而是息息相关的,因为需要根据接收内容判断是否需要重发帧。

图6 应用层状态示意图

图6中状态的解释如下:

1) 发送空闲:在此状态下,首先需要不断检测发送队列是否为空,非空则取出队列中的帧判断其发送状态是否为待发送状态,若是则发送此帧,发送完成后还需根据帧类型或控制帧指令码判断其是否需要等待回应,若无需等待回应则将此帧的超时生命周期置0;若需等待回应则将此帧的超时重发次数减1,并开启应答超时计时。若应答超时计时溢出,需重发正在等待回应的帧。此外还需检测发送队列,从发送缓冲区和发送队列中删除生命周期为0 的帧。

2) 识别帧:此状态是提取帧之后,根据帧类型和指令码做出相应的动作。若收到A帧或XON帧则将正在等待回应帧的生命周期置0, 关闭应答超时计时。若收到NAK帧,则将否定重发次数减1,帧发送状态置为待发送。若收到ENQ帧,则需要判断接收缓冲区或接收队列容量,若容量充足则组XON帧并推入发送队列,相反组XOFF帧。若收到XOFF帧,则延时Nms后再继续发送帧,同时应暂停向发送队列中添加帧。

3) 处理帧:此状态是用于解析接收到的数据帧内容,即根据帧的报文内容做相应的动作或任务。

3 实时性测试

评价一套良好的串行通讯协议,实时性是一个重要的标准,本文所述的通讯协议主要应用于单片机等嵌入式系统中,故测试平台选用时下流行的STM32F103系列单片机,此款单片机时钟频率为72 MHz,同时在裸机和uC/OSII下对接收帧和发送帧时间进行测试,其中接收帧时间测试起始为接收到第一个字节开始,终止为从接收队列中提取出帧;发送帧时间测试起始为将发送帧推入发送队列,终止为此帧发送完成。

表1接收发送时间测试表

ms

如表1 所示,物理层设置的参数为1位起始位,8位数据位,1位停止位,无校验位。即发送一字节数据需发送10位。 9 600bit/s的波特率下,理论上发送接收100字节数据时间为100×10/9 600=104ms,表中测试为103ms和105ms。故在此单片机系统中,接收发送程序对通信速度几乎无影响。而在uC/OSII下接收帧测试时间和裸机相同,发送帧测试时间会略多几毫秒,原因是发送帧和接收帧任务设计为2个任务,uC/OSII此操作系统规定每个任务在适当的情况下必须释放CPU一段时间,故会多出几毫秒,如果在实时性要求不高的应用中,可以忽略[5]。由于测试方法差异,实验器材不同、串口驱动不相同等问题,实验数据仅供参考。

4 结语

异步串行通信以其通讯简单占用资源少的特点,在数据通信领域尤其是在嵌入式系统中,必定在很长一段时间内依然会占据着重要地位。本文从帧结构设计到具体的帧接收发送的实现方法都做出了简单叙述,即描述了一套串行通讯协议的设计与实现方法。虽然串行通信的应用设备或场合不尽相同,但所述方法还是对串行通讯协议的设计和实现有一定的参考价值。此外所述的通信协议已经应用到了实际的景区闸机中,且运行良好。

参考文献:

[1] 宋哲. 地铁闸机扇门控制系统设计[D]. 南京:南京理工大学,2010.

[2] 谢瑞和. 串行技术大全[M]. 北京:清华大学出版社,2003.

[3] 徐骏善,朱岩. 微型计算机原理与接口技术[M]. 北京:机械工业出版社,2014.

[4] 张腊明, 佟宇. 状态机技术在数据通讯协议栈中的编程应用[J]. 工控技术,2008,35(3):146-148.

[5] 任哲. 嵌入式操作系统基础μC/OS-II和Linux[M]. 北京:北京航空航天大学出版社,2011.

猜你喜欢 发送数据报头缓冲区 报业文化中的一道独特风景新闻爱好者(2018年11期)2018-12-05一种车载自组织网络的媒体接入控制协议汽车文摘(2018年2期)2018-11-27国家网络空间安全发展创新中心郭毅IPv6协议栈脆弱性分析中国教育网络(2018年10期)2018-11-08带标记方式的CRDSA++协议性能分析*通信技术(2018年10期)2018-10-15基于ARC的闪存数据库缓冲区算法①计算机系统应用(2018年3期)2018-04-21多优先级无时隙CSMA/ CA算法研究软件导刊(2017年3期)2017-04-13测试软件简介个人电脑(2016年8期)2016-11-04一类装配支线缓冲区配置的两阶段求解方法研究中国工程机械学报(2016年5期)2016-03-07淡妆浓抹总相宜——对中国晚报报头变化的研究与欣赏大众文艺(2015年12期)2015-07-13初涉缓冲区时代人物(2014年10期)2015-01-28

机械制造与自动化2018年2期

机械制造与自动化的其它文章路面附着系数识别方法发展现状综述及展望难切削金属材料零件热等静压近净成形工艺研究拉伸模具内孔CVD金刚石薄膜抛光工艺研究基于MACH3的五轴数控机床设计动力刀架齿轮系传动误差分析新型高速五轴联动叶轮加工机床大件结构设计


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有