通用可靠的串口/以太网网关设计
摘要:介绍了一种串口/以太网嵌入式网关的设计方案,详细讨论了串口可靠通信的实现方法,并在开源操作系统RTThread和微处理器S3C2 440开发板的软硬件平台上实现。网关实际应用于一个无线传感器网络项目,实验表明该网关能实现可靠的数据通信。
关键词:串口/以太网网关;可靠串口通信;RT-Thread;S3C2440
引言
随着物联网的蓬勃发展,越来越多的传统本地设备或网络有接入计算机网络的需求,而这些传统没备一般都是不具备网络接口的非IP设备。最常用的通信接口是串口,不能直接接入计算机网络,在不改变这些原有设备的基础上,使用串口/以太网网关来接入计算机网络的方式不失为一种比较好的解决方案。
基于此需求,设计和实现了串口/以太网网关,网络结构如图1所示。实现了非IP设备与IP设备间的数据通信,并特别考虑了串口通信的可靠性,从软件和硬件两方面详细讨论了保证串口通信可靠性的方法。IP端通信的可靠性由TCP/IP协议保证,这样就保证了串口设备与IP设备间通信的可靠性。
1 网关工作原理
1.1 概 述
网关实现串口设备和以太网之间的协议转换,具体表现为帧格式的转换,可表示为:
Socket帧←→净荷数据←→串口帧
其中Socket(套接字)帧和串口帧郜是为实现网关可靠通信而自定义格式的帧,净荷数据为真正需要传送的应用数据。
网关的数据通信可分为两部分:网络端和串口端,要保证整个网关通信的可靠性,那么就要分别保证网络端和串口端通信的可靠性。
在网络端,网关使用了流式套接字。流式套接字使用TCP协议,而TCP协议是面向连接的,保证了数据传输的正确性和顺序性。所以,流式的套接字可以提供可靠的、面向连接的通信流。但是,流式数据对应用来说不易使用,所以Socket数据传送都是基于帧格式的。
在串口端,串口数据传送本质上也是字节流式的,在硬件层次是不可靠的,而且不能保证数据的完整性,需要在软件上有一些其他机制来保证可靠性。所以,网关串口的数据传送同样基于帧格式,并且使用了接收确认、超时重发、差错校验等机制来保证可靠性。
图2为网关工作时的数据流示意图。图中3个带箭头的椭圆表示3个线程,图中未画出建立Socket连接、串口初始化和线程启动等过程。
1.2 串口数据传送
串口数据传送的帧格式如下:
其中各个字段的意义如下:
◆SFD:帧首定界符;
◆EFD:帧尾定界符,SFD和EFD为确定的特定值;
◆Seq:帧序号;
◆Type:帧类型,其值见表1;
◆LEN:Data字段的字节数;
◆Data:实际要传送的数据;
◆FCS:帧校验,是一个简单校验,为Seq.至Data字段中所有字节按位异或运算的结果。
1.2.1 串口发送
串口发送队列示意图如图3所示。网关使用FIFO(先入先出)队列缓冲发送帧,包括待发送队列和待确认队列两个队列,每个队列为一个双向循环链表,节点从尾部插入,头部读出。
当有数据需要从串口发送时,首先将要发送的数据按帧格式加上一些附加的字段组成一个完整的帧,然后插入待发送队列尾。插入待发送队列的帧并不一定会被立即发送,但只要待发送队列中缓冲有需要发送的帧,串口就会从队列头逐个的读取待发送帧以中断的方式发送,直到待发送队列为空。
每一帧发送完毕后,如果是确认帧,便会被立即从待发送队列中删除并释放掉内存,该帧的发送过程结束;如果是非确认帧,即数据帧或命令帧,那么该帧不会被立即释放,而是从待发送队列删除而插入待确认队列尾,等待串口另一端的设备发送对应的确认帧。
若在超时时间内收到对应的确认帧,则将该帧从待确认队列删除释放,该帧的发送过程结束;若等待超时,则将该帧从待确认删除并重新插入待发送队列尾,以重发此帧。当然有重发次数限制,若达到了最大重发次数仍然未收到对应的确认帧,则丢弃该帧,该帧的发送过程结束。
1.2.2 串口接收
串口接收使用中断方式,从串口接收到的字节数据并不直接处理,而是先存入一个环形缓冲,环形缓冲示意图如图4所示。从头偏移处写入,从尾偏移处读出,每写入或读出一字节头或尾都将模递增,且头偏移处为空,尾偏移处为满。
只要串口接收到数据,就将其从头偏移处写入串口的环形缓冲。如果缓冲满了,则用新数据覆盖未处理的旧数据。
在将一个字节数据写入缓冲的同时,判断其是否等于帧结束定界符EFD,如果等于,则表示缓冲中可能存在一个完整的帧(只是可能,并不能完全确定,因为一个普通的字节数据完全有可能正好等于EFD),此时便可从环形缓冲中按帧格式解析数据。若解析到完整的帧,则做相应的处理:首先,根据帧中FCS字段做差错校验,如果校验正确,则从串口回送一个同序号的确认帧;然后从帧中取出净荷数据从Socket发送。
从缓冲中解析数据的过程简述如下:从环形缓冲的尾偏移处开始读字节数据,查验是否等于帧开始定界符SFD,若不等于则丢弃并继续读下一字节,若等于则向后偏移读取长度域LEN,根据长度值,便能确定帧结束定界符EFD的位置。查验此位置的字节数据,若不等于EFD,则认为之前等于SFD的字节只是个普通数据,并不是帧开始定界符,将其丢弃并继续读取查验下一字节;若等于EFD,则认为SFD到FFD之间为一个完整的帧。
1.3 Socket数据传送
Socket数据传送的帧格式如下:
- 基于S3C4480X控制的蓝牙音频网关设计与实现(07-12)
- 基于ARM和uClinux的家庭网关系统(09-14)
- 基于PowerPC和嵌入式Linux的VPN网关设计(11-01)
- 基于PowerPC和Linux的VPN网关设计(01-14)
- CEVA VoIP平台协助GPON住宅网关方案 (05-30)
- 基于ARM平台的嵌入式家庭网关服务器平台(06-09)