基于W5500的串口服务器设计及物联网应用

``

罗毅

【摘要】随着物联网技术的发展,嵌入式仪表设备逐渐纳入物联网信息平台。对于常规的嵌入式仪表设备,通常不具备与物联网数据交互的通道,必须通过路由器、串口服务器等方式接入物联网信息平台。

【Abstrt】WththdvlptfItrtfthsthly,ddstrutquptsrdullyrprtdtthfrtpltfrfthItrtfthsCvtlddstruttusullydsthvdtsstItrtfthsItustssItrtfthsfrtpltfrbysfrutrsdsrlsrvrs

【關键词】物联网信息平台;串口服务器;网络多链路

【Kyrds】trtfthsfrtpltfr;srlsrvr;trult-

【中图分类号】TP393【文献标志码】A【文章编号】673-069(208)03-047-02

串口服务器简介

串口服务器又叫串口联网服务器,是为RS-232/485串口到TCP/IP网络之间完成数据转换和传输的通信接口转换器,提供RS-232/485终端串口与TCP/IP网络的数据双向透明传输,提供串口转网络功能,RS-232/485串口转网络的解决方案可以让串口设备方便、快捷的接入互联网网络。

2W5500简介

W5500是韩国WIZt公司生产的一款全硬件TCP/IP嵌入式以太网控制器,为嵌入式系统设备提供了简易的互联网连接方案。W5500集成了TCP/IP协议栈,0/00M以太网数据链路层(MAC)及物理层(PHY),使得用户使用单芯片就能够拓展实现网络连接功能。

W5500内嵌32K字节数据缓存用于缓存以太网数据包,最多支持8个硬件St独立通讯。W5500提供了SPI(外设串行接口)从而能够更加容易与外设MCU整合。高效SPI协议支持80MHz速率,从而能够更好地实现高速网络通信。以太网控制芯片W5500具有以下特点:①支持硬件TCP/IP协议:TCP、UDP、ICMP、IPv4、ARP、IGMP、PPPE和以太网的PHY和MAC层;②支持8个独立的St同时工作,可同时工作在不同的工作模式;③支持高速SPI接口,SPI的时钟最高可达80MHz,极大地提高了网络通讯的数据传输速率;④内部集成32KB存储器用于发送/接收缓存;⑤内嵌0T/00TX以太网物理层(PHY);⑥支持自动协商(0/00d全双工/半双工)。

3系统设计

3硬件设计

串口服务器主要由MCU、以太网控制器、硬件看门狗和线性稳压器组成。其中MCU选用M3处理器LPC763,该处理器主频达到00MHz,内置256Mflsh和64KRAM,还具有多个SPI和RS232等串行接口,完全能够满足串口服务器设计需求。为提高系统稳定性,串口服务器还配置了独立的硬件看门狗CAT706。系统采用5V供电,内置33V稳压器LM7。系统下行通过RS-232接口与底层数据采集系统交换数据,上行通过RJ45接口接入物联网平台。

32软件设计

为确保串口服务器对各种中断能够实时响应,系统软件采用UCOSⅡ嵌入式多任务实时操作系统,根据系统功能,系统建立了网络监测任务、网络中断处理任务及串口数据接收处理任务3个任务进程,其中串口数据接收处理任务和网络中断处理任务平时处于挂起状态,只有当串口接收到数据或接收到W5500的中断事件信号时才执行[]。几个任务的主要功能如下:

网络监测任务:定时监测网络状态,处理网络断开重连、TCPSrvr模式下接收到Clt连接请求、TCP模式下接收到对方断开请求及UDP模式下“OPEN”命令生效等网络状态事件。同时查看并处理网络异常中断事件,让网络连接在异常状态下恢复。

网络中断处理任务:响应并处理以太网接收到数据事件、网络St连接建立成功、接收到对方网络断开请求、接收到数据发送成功应答等网络正常中断事件。该任务平时处于挂起状态,只有当接收到网络正常中断信号才执行。

串口数据接收处理任务:通过中断方式接收底层数据采集控制系统发送过来的数据,根据当前网络状态将数据发送到以太网控制器数据发送缓冲区。该任务平时处于挂起状态,只有当接收到串口数据帧才执行。

4网络数据处理关键功能代码(C语言)

MCU接收到W5500的网络接收数据中断信号,先用过“Rd_SOCK_2_Byt”函数提取接收网络数据长度信息,并判断数据长度是否合法。若数据长度合法,则通过“Rd_SOCK_2_Byt”函数提取接收数据在接收缓冲区内的偏移量,分别根据接收数据长度及偏移量判断接收数据是否溢出,根据溢出情况读取缓冲区数据,再将读取到的数据填充到MCU的数据接收缓冲区等待处理。

usdshrtrx_sz;//接收数据长度

usdshrtffst,ffst;//ffst:相对偏移,ffst:绝对偏移

usdshrt;

usdhr;

rx_sz=Rd_SOCK_2_Byt(s,S_RX_RSR);

f(rx_sz==0)

rtur0;

f(rx_sz&t;460)

rx_sz=460;

ffst=Rd_SOCK_2_Byt(s,S_RX_RD);

ffst=ffst;

ffst&p;=(S_RX_SIZE-);

LPC7xx_SPI_Slt();//StW5500SCSL

LPC7xx_SPI_SdByt(ffst/256);//WrtAddrss

LPC7xx_SPI_SdByt(ffst);

LPC7xx_SPI_SdByt(VDM|RWB_READ|(s*0x20+0x8));//WrtCtrlByt

f((ffst+rx_sz)