1硬件系统的设计
本串口服务器采用Philips的ARM7系列芯片LPC2210,网络控制芯片采用RTL8019,串口采用TL16C554芯片扩展。为得到更广泛的应用,串口端还扩展485接口,通过跳线选择232/485方式。系统结构框图,如图1所示。
图1系统结构框图
2软件系统的实现
串口服务器软件系统包括两部分:TCP/IP协议栈的移植和实时多任务应用程序。μC/OS-Ⅱ在LPC系列ARM中的移植采用周立功公司的方案。
2.1TCP/IP协议栈的移植
LWIP是瑞士人AdmaDumkels等开发的源代码开放的精简TCP/IP协议栈。目的是在于保证TCP协议完整的情况下减少系统资源的需求,适合于资源较少的嵌入式系统应用。移植LWIP协议栈主要有两部分代码:(1)编写操作系统模拟层相关代码;(2)LWIP接口初始设置及网卡驱动。
2.1.1操作系统模拟层相关代码
操作系统模拟层存在的目的主要是在μC/OS-Ⅱ和LWIP之间提供一座桥梁,使LWIP能与μC/OS-Ⅱ能以相同的规范存在于一个系统中并能相互通信。LWIP有信号量和邮箱两种进程通讯方式,而μC/OS-Ⅱ也提供这两种进程通讯方式。
信号量用来同步任务,操作函数有sys_new_sem(建立并返回一个新信号量),sys_sem_signal(指定要发送的信号量),sys_sem_free(指定要释放的信号量),sys_arch_sem_wait(等待由参数sem指定的信号量并阻塞线程),在这些函数体中进行数据结构的初始化并加入μC/OS-Ⅱ中的相关函数便可完成。
邮箱用来投递消息,LWIP允许将邮箱实现为一个队列,多条消息投递到这个邮箱。
μC/OS-Ⅱ提供了丰富的消息队列函数,且μC/OS-Ⅱ和LWIP投递到邮箱中的消息均用指针实现。该系统建立了多个邮箱,邮箱通过单向链表接在一起。接收消息的最大数量由消息数组决定,结构图如图2所示。
图2邮箱数据结构图
邮箱建好后用指针P_Mbox指向节点1,申请新邮箱将节点1和节点2断开,P_Mbox指向节点1的pstNext,以此类推。回收时P_Mbox的移动方向与申请时相反,这样不会浪费内存且比较稳定。由以上结构和μC/OS-Ⅱ提供的函数写出邮箱相关函数。
除此之外,还需要编写任务创建函数sys_thread_new和sys_arch_timeouts函数,由于每个任务都有timeouts链表,sys_arch_timeouts函数返回的sys_timeouts结构保存了timeouts链表的首地址。
2.1.2LWIP初始化设置及底层驱动
LWIP的初始化设置包含在LWIP通信进程的入口函数中,其入口函数LwipEntry的基本结构如下:
Void Lwip Entry(void 3 pvArg)
{
//初始化LW IP,涉及LWIP使用的内存区,PCB(TCP/UDP)以及OS模拟层各个方面
__ilvInitLwip();
//设置LW IP,包括添加配置网络接口,建立接受任务等工作
__ilvSetLwip();
//在这里建立LWIP的应用,服务器支持TCP/UDP方式,两种方式都建立
}
底层驱动在服务器每次收发数据中都要调用,这部分代码需要有良好的健壮性和稳定性。整个实现顺序,如图3所示。
图3底层程序框架图
发送主线首先是以太网初始化函数(1)开始,调用链路层发送函数(2)并增加各层协议头,再调用RTL8019发送函数(9)发送数据。
接收主线除初始化以太网外,需调用链路层初始化函数(3),(3)中调用(4)初始化RTL8019。
收到的数据先经过函数(8),然后通过信号量传送到函数(6),由(6)调用(7)得到数据个数,最后由(5)根据以太网帧头携带的上层协议类型判断是交给IP协议还是ARP协议处理。
移植完毕,进行数据收发实验验证。使用TCP传输协议,由网口虚拟串口软件VSPM通过串口调试工具收发数据,图4是以10ms的发送速度在自发自收程序中收发数据的截图。
图4TCP协议数据传输界面
由于COM1和COM2被PC机占用,故由网口虚拟出来的串口是COM3,由图4可看出在面向连接的TCP协议下,高速收发数据不会丢包。
2.2实时多任务方案的设计
16个串口分别与网络端口组成16个双向通道。为使代码灵活、透明,程序不使用LWIP提供的SOCKETAPI。应用程序把每个双向通道分为发送,接收,串口3个任务,加上LWIP本身需占用一个任务,共需建立49个任务。μC/OS-Ⅱ最多能建立64个任务,其中8个操作系统本身占用,剩56个能满足要求。由VSPM软件把网口模拟成16个串口,串口服务器侦听的16个端口分别是1000~1015,如图5所示。
图5网口虚拟扩展16个串口界面
网络端和串口端的数据接收会触发相应的中断。每个双向通道的3个任务各司其职,网口端接收数据中断后在传输层协议判断信源的端口号,交给相应的接收任务,处理完后交给串口任务把数据从相应串口发送;串口接收数据后在中断程序中判断信源的通道号,把数据交给串口任务,处理完后由发送任务通过网口把数据发送出去。
服务器支持TCP/UDP两种传输协议,下面给出一个通道的TCP传输流程图,UDP部分代码只需在相应任务中调用LWIP给的UDP函数。TCP模式下串口服务器工作在Server模式,PC机工作在Client模式,流程图,如图6所示。
图6串口服务器单通道程序流程图
3.结论
文中本服务器是以性能不及ARM9且不能使用Linux的ARM7为主控芯片,但两种开源代码μC/OS-Ⅱ实时操作系统和LWIP协议栈的有效结合避免了高额的软件费用,而且能满足通信要求。实验证明,基于LWIP和μC/OS-Ⅱ的串口服务器不仅能实现双向通信,而且传输数据实时、准确,符合工业应用的要求。