通用可靠的串口/以太网网关设计*

2012-03-20 02:32徐良陈向东
单片机与嵌入式系统应用 2012年6期
关键词:字段线程字节

徐良,陈向东

(西南交通大学信息科学与技术学院,成都610031)

引 言

随着物联网的蓬勃发展,越来越多的传统本地设备或网络有接入计算机网络的需求,而这些传统设备一般都是不具备网络接口的非IP设备。最常用的通信接口是串口,不能直接接入计算机网络,在不改变这些原有设备的基础上,使用串口/以太网网关来接入计算机网络的方式不失为一种比较好的解决方案。

基于此需求,设计和实现了串口/以太网网关,网络结构如图1所示。实现了非IP设备与IP设备间的数据通信,并特别考虑了串口通信的可靠性,从软件和硬件两方面详细讨论了保证串口通信可靠性的方法。IP端通信的可靠性由TCP/IP协议保证,这样就保证了串口设备与IP设备间通信的可靠性。

图1 网络结构

1 网关工作原理

1.1 概 述

网关实现串口设备和以太网之间的协议转换,具体表现为帧格式的转换,可表示为:

Socket帧↔净荷数据↔串口帧

其中Socket(套接字)帧和串口帧都是为实现网关可靠通信而自定义格式的帧,净荷数据为真正需要传送的应用数据。

网关的数据通信可分为两部分:网络端和串口端,要保证整个网关通信的可靠性,那么就要分别保证网络端和串口端通信的可靠性。

在网络端,网关使用了流式套接字。流式套接字使用TCP协议,而TCP协议是面向连接的,保证了数据传输的正确性和顺序性。所以,流式的套接字可以提供可靠的、面向连接的通信流。但是,流式数据对应用来说不易使用,所以Socket数据传送都是基于帧格式的。

在串口端,串口数据传送本质上也是字节流式的,在硬件层次是不可靠的,而且不能保证数据的完整性,需要在软件上有一些其他机制来保证可靠性。所以,网关串口的数据传送同样基于帧格式,并且使用了接收确认、超时重发、差错校验等机制来保证可靠性。

图2为网关工作时的数据流示意图。图中3个带箭头的椭圆表示3个线程,图中未画出建立Socket连接、串口初始化和线程启动等过程。

图2 网关数据流示意图

1.2 串口数据传送

串口数据传送的帧格式如下:

字节数1 1 1 1可变1 1字段SFD Seq.Type LEN Data FCS EFD

其中各个字段的意义如下:

◆SFD:帧首定界符;

◆EFD:帧尾定界符,SFD和EFD为确定的特定值;

◆Seq.:帧序号;

◆Type:帧类型,其值见表1;

◆LEN:Data字段的字节数;

◆Data:实际要传送的数据;

◆FCS:帧校验,是一个简单校验,为Seq.至Data字段中所有字节按位异或运算的结果。

表1 串口帧类型

1.2.1 串口发送

串口发送队列示意图如图3所示。网关使用FIFO(先入先出)队列缓冲发送帧,包括待发送队列和待确认队列两个队列,每个队列为一个双向循环链表,节点从尾部插入,头部读出。

图3 串口发送队列示意图

当有数据需要从串口发送时,首先将要发送的数据按帧格式加上一些附加的字段组成一个完整的帧,然后插入待发送队列尾。插入待发送队列的帧并不一定会被立即发送,但只要待发送队列中缓冲有需要发送的帧,串口就会从队列头逐个的读取待发送帧以中断的方式发送,直到待发送队列为空。

每一帧发送完毕后,如果是确认帧,便会被立即从待发送队列中删除并释放掉内存,该帧的发送过程结束;如果是非确认帧,即数据帧或命令帧,那么该帧不会被立即释放,而是从待发送队列删除而插入待确认队列尾,等待串口另一端的设备发送对应的确认帧。

若在超时时间内收到对应的确认帧,则将该帧从待确认队列删除释放,该帧的发送过程结束;若等待超时,则将该帧从待确认删除并重新插入待发送队列尾,以重发此帧。当然有重发次数限制,若达到了最大重发次数仍然未收到对应的确认帧,则丢弃该帧,该帧的发送过程结束。

1.2.2 串口接收

串口接收使用中断方式,从串口接收到的字节数据并不直接处理,而是先存入一个环形缓冲,环形缓冲示意图如图4所示。从头偏移处写入,从尾偏移处读出,每写入或读出一字节头或尾都将模递增,且头偏移处为空,尾偏移处为满。

只要串口接收到数据,就将其从头偏移处写入串口的环形缓冲。如果缓冲满了,则用新数据覆盖未处理的旧数据。

在将一个字节数据写入缓冲的同时,判断其是否等于帧结束定界符EFD,如果等于,则表示缓冲中可能存在一个完整的帧(只是可能,并不能完全确定,因为一个普通的字节数据完全有可能正好等于EFD),此时便可从环形缓冲中按帧格式解析数据。若解析到完整的帧,则做相应的处理:首先,根据帧中FCS字段做差错校验,如果校验正确,则从串口回送一个同序号的确认帧;然后从帧中取出净荷数据从Socket发送。

图4 环形缓冲示意图

从缓冲中解析数据的过程简述如下:从环形缓冲的尾偏移处开始读字节数据,查验是否等于帧开始定界符SFD,若不等于则丢弃并继续读下一字节,若等于则向后偏移读取长度域LEN,根据长度值,便能确定帧结束定界符EFD的位置。查验此位置的字节数据,若不等于EFD,则认为之前等于SFD的字节只是个普通数据,并不是帧开始定界符,将其丢弃并继续读取查验下一字节;若等于EFD,则认为SFD到EFD之间为一个完整的帧。

1.3 Socket数据传送

Socket数据传送的帧格式如下:

字节数1 1可变1 SFD LEN Data EFD字段

相比串口帧格式,少了Seq.、Type和FCS字段。这三个字段在串口数据传送中是用来保证可靠性的,而网关使用TCP Socket,下层的TCP协议会保证通信的可靠性,应用层只需要保证数据的完整性,所以不需要这些字段。其他字段相同,意义也分别相同。

1.3.1 Socket发送

Socket接收过程同串口接收类似,接收的数据并不直接处理,而是先存入环形缓冲。然后,按Socket帧格式,解析环形缓冲中的数据。解析到的数据帧插入串口发送队列,从串口转发。

1.3.2 Socket接收

Socket发送相比串口发送操作更简单,因为下层的TCP协议会保证通信的可靠性,所以不需要再另外实现确认、重发等机制,发送队列中只需要一个待发送队列即可,不需要待确认队列。而且在具体实现中,并没有真的构造一个Socket发送队列,而是利用了操作系统提供的线程间通信机制中的邮箱通信方式,需要从Socket发送数据时,只需将数据的首地址以邮件的方式发送到Socket发送线程指定的邮箱中。

2 网关实现

2.1 软硬件平台

网关软硬件平台包括操作系统RT-Thread和ARM9开发板Mini2440。

2.1.1 RT-Thread实时操作系统[1-3]

为实现网关,选用了实时操作系统RT-Thread。RTThread是一款国内的开源实时操作系统,并且商业许可证非常宽松,由国内一些专业开发人员开发、维护。RTThread不仅是一款高效、稳定的实时核心,也是一套面向嵌入式系统的软件平台,覆盖了全抢占的实时操作系统内核小巧的文件系统、轻型的TCP/IP协议栈以及轻型的图形用户界面。

图5是RT-Thread及外围组件的基本框架图。RTThread的使用范围极为灵活,可以从资源极度紧张的小型系统到带内存管理单元、网络功能的基本计算单元。RT-Thread有着高度可配置、易裁减、可扩展性好和可靠性高等特点,适用于嵌入式实时系统。

图5 RT-Thread基本框架图

2.1.2 Mini2440开发板

硬件平台使用了Mini2440开发板,Mini2440是一款ARM9开发板,微处理器采用三星公司的S3C2440芯片,具有64MB SDRAM、128MB/256MB/1GB大小可选的NAND Flash和2MB NOR Flash,外设包括1个100M以太网RJ-45口(采用DM9000网卡)和3个串口等。

2.2 网关实现

2.2.1 软件相关

如图2所示,系统使用了3个线程:串口接收线程、Socket发送线程和Socket接收线程,下面对这3个线程作具体介绍:

①串口接收线程。以阻塞的方式接收“UART_RX_IRQ_EVENT”事件,接收到此事件后,从串口环形接收缓冲中解析串口帧,当有数据帧需要向以太网发送时,便将该数据帧的首地址以邮件的方式给Socket发送线程。而在RT-Thread中,邮件的存储方式本质是双向循环队列。

②Socket发送线程。以阻塞的方式接收来自串口接收线程的指针邮件,接收到此类邮件后,Socket发送线程将指针指向的数据封装成Socket帧发送。

③Socket接收线程。用于从以太网接收数据,并缓存解析数据帧,调用串口发送接口函数,将收到的数据帧封装成串口帧并插入串口发送队列。

串口收/发工作于中断方式,可以连续发送串口发送队列中缓存的待发送帧和从串口接收字节数据并写入串口的环形接收缓存。在接收到等于EFD的字节时,向串口接收线程发送一个“UART_RX_IRQ_EVENT”事件,通知串口接收线程环形缓存中可能存在一个完整的帧。

串口帧发送完毕后等待确认帧的时间计时使用了RT-Thread提供的定时器,并且在定时器的超时函数中处理帧重发问题。

在软件实现过程中遇到了一个问题:在RT-Thread操作系统的中断程序中不能申请和释放动态内存,而串口中断发送程序在发送完一个帧后,如果该帧是确认帧或非确认帧但达到了最大发送次数,那么需要从待发送队列删除该帧并释放对应的动态内存。这就存在矛盾,系统不能提供中断程序释放内存的功能,但实际应用又需要此功能。

为此,程序中专门设置了一个删除队列,当中断程序需要释放发送帧时,将对应帧插入删除队列,并向串口接收线程发送一个删除事件“UART_TX_DEL_EVENT”,在串口接收线程中接收到此事件后再来释放队列中的帧,这就避免了在串口发送中断程序中直接释放动态内存。

2.2.2 硬件相关

在硬件方面,为提高串口通信的可靠性,也做了相应处理。

S3C2440微处理器的串口具有两种工作模式[4]:非FIFO模式和FIFO模式。在FIFO模式中,串口发送和接收分别具有64字节的硬件FIFO缓冲,使用硬件缓冲,能显著地减少串口发送和接收中断产生的次数,进而减小正常程序被中断的频率,提高系统性能。并且使用接收FIFO后,在处理器不能及时跳转到串口接收中断程序的情况下,由于硬件FIFO的存在,使得串口数据丢失的可能性减小。所以,网关中S3C2440微处理器的串口使用了FIFO模式。

另外,S3C2440微处理器的串口还具有硬件自动流控制功能[3],当与网关相连的串口设备也具有硬件自动流控制功能时,开启此功能。在开启此功能的情况下,当通信的某一端不能及时读取接收缓冲中的数据时,硬件自动流控制能自动暂停另一端串口的数据发送,以防止数据的丢失。

在网关的软件实现中,确认机制的开关、确认超时时间、重发次数、队列容量、缓冲的大小、串口的FIFO设置和硬件流控制的开关等都是可配置的,针对不同的应用可以非常容易地做出合适的裁剪和设置。

结 语

目前该网关被用于一个无线体温监测项目,以连接本地无线传感网络和远程数据库服务器,实现本地设备对远程数据库服务器的访问,通过实际运行实验,网关能很好地实现本文讲述的功能。当然,网关仍然有不尽完善之处,比如对有些公共资源的访问没有提供竞争保护机制,可能会影响网关运行的稳定性和可靠性,有待今后进一步完善。

[1]RT-Thread工作室.RT-Thread实时操作系统编程指南,2010.

[2]邱祎.嵌入式实时操作系统RT-Thread的设计与实现[D].成都:电子科技大学,2007.

[3]Samsung Electronics.S3C2440A32-BIT CMOS MICROCONTROLLER USER'S MANUAL,2004.

猜你喜欢
字段线程字节
图书馆中文图书编目外包数据质量控制分析
No.8 字节跳动将推出独立出口电商APP
基于C#线程实验探究
基于国产化环境的线程池模型研究与实现
No.10 “字节跳动手机”要来了?
简谈MC7字节码
浅谈linux多线程协作
CNMARC304字段和314字段责任附注方式解析
无正题名文献著录方法评述
关于CNMARC的3--字段改革的必要性与可行性研究