APP下载

基于Linux的串口服务器设计与实现

2017-06-26王天昊贺亚龙

电子科技 2017年6期
关键词:串口嵌入式客户端

王天昊,贺亚龙

(1.哈尔滨工程大学 计算机科学与技术学院,黑龙江 哈尔滨 150001;2.杭州应用声学研究所,浙江 杭州 310023)



基于Linux的串口服务器设计与实现

王天昊1,贺亚龙2

(1.哈尔滨工程大学 计算机科学与技术学院,黑龙江 哈尔滨 150001;2.杭州应用声学研究所,浙江 杭州 310023)

为解决串口通信距离和上位机接口数量有限的问题,设计了一种基于Linux系统的串口服务器。服务器属于客户端服务器模式,通过网络传输串口数据流。服务器基于嵌入式Linux的TCP/IP,通过串行接口的转换,以非阻塞方式进行数据收发,并实现了心跳方式的连接中断检测。经仿真和硬件测试,服务器运行稳定,可挂接串口设备数量较多。该服务器已应用于嵌入式软件的调试工作,并将增加可用接口种类,为远程调试与开发提供更为有效的支持。

串口服务器;Linux;接口转换;连接中断检测;远程调试

串行接口是一种基本的通信接口,因其简易和低成本的特点在嵌入式软件开发与调试过程中被广泛使用。但是计算机硬件制造商正逐渐取消外接的低速串口,现在通常利用接口转换设备将串行接口转换为计算机所支持的接口进行串口数据传输。串口服务器通过以太网协议收发异步串行数据流,满足多用户远程调试多目标机的需求,既能增多可并行操控的串口设备数量,又可避免串口传输的距离限制。同时以太网作为一种常用的局域网组网方式,在软硬件实现和使用范围上相比于其它的转换方式均有较大的优势。通过服务器从串口到网络的转换可以将一些只具备串口输入输出的设备连接到网络中实现更大范围的控制和管理维护。

1 设计与实现

串口服务器为客户端服务器(C/S)的网络架构。服务器硬件部分基于ARM920T的 S3C2440A芯片,其操作系统内核版本为Linux2.6.22,并利用Nand Flash存储内核和文件系统,以太网控制芯片为DM9000CEP。主要器件与操作系统均为较成熟的组件,因而可提高稳定性并方便后期维护改进。多线程的服务器程序从网络接收由客户端程序发送数据将其转发到对应串口,并将服务器串口接收到的数据通过网络转发至客户端程序。设计结构框图如图1所示,客户端程序包括Linux和Windows版本,可通过图形界面进行串口操作和数据收发。

图1 串口服务器结构框图

1.1 底层软件硬件部分

S3C2440A芯片具有3个独立的异步串行接口[1],若采用一些现有的方案直接使用这些接口会限制通过串口连接的设备数量[2-4]。根据需求服务器至少可同时连接操作20个串口,所以应扩展服务器硬件接口数量,其中一种方法是将串口数据转换为其它类型协议的数据再传送至服务器进行处理。常见的串口转换芯片包括USB转串口的PL2303,FT232等和SPI转串口的GM8142等[5-6]。USB串口使用普遍,1个USB2.0的拓扑网络理论上最多可支持127个外设。因为USB接口较为普遍,而PL2303因制造厂商多,规格和驱动有所差别,所以串口服务器设计中采用FT232芯片。FT232以硬件逻辑实现USB总线协议和串口协议的相互转换并支持异步Bit-Bang模式[7-8],Linux2.6.22包含对FT232的驱动。串口收发的连接顺序为设备间串口的收发端对接。FT232在USB host的控制下工作,而S3C2440A集成了2个USB host控制器和1个USB device控制器,则FT232连接到S3C2440A USB host的DN0,DP0。电路设计中加入DN0,DP0引脚对应的下拉电阻,而USB接口电源端可以加入1个磁珠以降低器件的相互干扰,同时电源与地之间的去耦电容可提高系统的抗干扰能力[9-10]。

图2 USB转换串口原理图

移植过程中配置Linux时选中Device Drivers / USB support / USB Serial Converter support加入内核或以模块形式进行编译。USB串口的设备文件为/dev/ttyUSB*,普通串口设备文件为/dev/ttyS*。服务器默认串口波特率为115 200,8位数据位,无奇偶校验,1位停止位。串口配置可以根据实际情况作为串口调试客户端或服务器的任务参数发送到服务器以初始化串口。

DM9000CEP为内存类型的以太网控制器,集成10/100 Mbit·s-1物理层自适应收发器和16 kB的SRAM,支持以字节/字/双字的IO指令数据读写,兼容3.3 V和5 V的输入输出电压[11]。网络控制器部分原理如图3所示。

图3 网络控制器原理图

设计中DM9000总线宽度为16位。中断引脚INT接S3C2440A的EINT7外部中断引脚。IOR#接S3C2440A的nOE读使能,IOW#接S3C2440A的nWE的写使能。CS#片选接S3C2440A的nGCS4。对于S3C2440A的存储控制,nGCS4与BANK4相对应,设置内存控制器BWSCON寄存器的DW4为01,表示BANK4为16位总线宽度,并设置BANKCON4使CPU的对BANK4内存块的读写时序符合DM9000的要求。当S3C2440A访问BANK4的地址空间(0x20000000-0x28000000),nGSC4引脚输出低电平,则DM9000的片选引脚CS#有效,从而完成CPU对DM9000的操作[12]。DM9000的地址和数据传输共用总线。CMD引脚用于选择总线传输模式,当CMD为低时,传输地址;CMD为高时,传输数据。根据厂商提供的驱动程序dm9dev9000c.c

#define DM9KS_MIN_IO (MST_ETH_PHYS + 0x300)

static int iobase = DM9KS_MIN_IO;

db->io_addr = iobase;

db->io_data = iobase + 4;

设计中用S3C2440A的LADDR2连接CMD引脚,当LADDR2为1时可使 为1传输数据,LADDR2为0时传输地址。DM9000的IO基地址为对应内存块基地址加0x300的偏移量,地址传输时即采用IO基地址。

1.2 应用软件部分

服务器客户端软件的网络部分使用Socket套接字编程。将服务器程序作为自定义开机启动程序加入Linux系统,初始化描述串口状态的全局结构体,所有串口均设置为空闲状态,可选择开启UDP广播接收线程以供客户端搜索。客户端根据探测到的服务器IP地址请求连接服务器,根据实际应用情况尝试连接相应的服务器。服务器运行监听线程在收到连接后创建连接和任务处理线程。客户端通过TCP握手与服务器连接,接收服务器发送的已挂载串口设备列表。用户选择并操作列表中的串口,客户端发送相应的任务请求到服务器。服务器解析并运行任务,任务结束返回结果到客户端。服务器可接收的任务请求类型包括串口复位与释放,本地串口控制请求,客户端对服务器的串口控制请求,连接检测等。

图4 串口服务器流程图

以下为相关结构体说明

typedef struct

{

in_addr_t client_addr_u32;

/* 占用串口的客户端IP地址 */

int num; /* 串口号 */

int status; /* 串口状态 */

struct keep_alive UART_ka;

}SerialInfo; /* 串口结构体 */

typedef struct

{

in_addr_t server_addr_u32;

/* 服务器IP地址 */

SerialInfo serial_unit[MAX_SERIAL_NUM];

}SerialSvrInfo; /* 串口服务器结构体 */

因为串口操作为独占方式,即同一串口无法被上位机重复打开操作。当服务器收到串口控制的任务请求后,根据串口号查询对应串口是否空闲,若空闲则允许对其操作并设置串口状态为被占用状态,对应串口结构体记录客户端IP地址,否则将被请求的串口已被占用和占用该串口的客户端IP地址作为任务结果返回客户端。

服务器等待任务请求的线程采用循环的Select方式监视串口和TCP连接套接字的IO变化[13]。Unix类系统提供Select来实现多路复用的输入输出模型。Select系统调用可用于监视多个文件描述符的状态变化[14]。程序会在Select等待,直至被监视的文件描述符有一或多个发生了状态变化。Select可以设置超时值。服务器Select若等待超时可释放串口和TCP连接并回收相关的资源。当有标准输入时根据描述符集合的置位状态确定数据来源并读取数据到缓冲区,对于串口输入则通过连接套接字sock_connect发送缓冲区数据到客户端,对于网络输入则写缓冲区数据到串口描述符。若读取出错或TCP连接意外断开,返回值小于或等于0,则退出循环,释放文件描述符,清理相应的串口结构体SerialInfo,为客户端重新连接后访问串口做好准备。

为应对网线故障,断电等非正常连接断开的情况,设计中加入了心跳探测机制[15]。服务器接收客户端发来的UDP心跳包并转发回客户端,若超时未收到心跳包则判断连接已经断开。本设计中客户端心跳包发送周期为5 s,超时阈值为30 s。服务器心跳包接收超时后将结束任务处理线程,释放接口。

2 测试

对于串口服务器,利用Linux虚拟机,vspd虚拟串口和secureCRT串口工具进行了仿真测试。虚拟串口COM10-COM13分别对接虚拟串口COM14-COM17。Linux加载运行服务器程序,Windows版本的客户端程序申请访问并操作COM10-COM13,其对应Linux系统中的设备ttyS0-ttyS3。用串口工具secureCRT操作COM14-COM17。如图5和图6所示,软件可进行正确的数据传输,对于网络连接中断的情况可以检测并回收相关资源。仿真测试验证串口服务器功能正常。经过在硬件电路上的测试与应用,包括多个串口设备持续发送规定格式数据包由客户端接收检测,客户端对多个目标机串口的控制和数据传输,基于Linux的串口服务器至少支持对40个串口设备的通信。

图5 服务器运行情况

图6 客户端运行情况

3 结束语

本设计中的串口服务器已在嵌入式软硬件调试中成功应用。串口服务器硬件部分用接口转换芯片拓展服务器的有效接口数量,软件部分基于开源的Linux操作系统,移植与修改较为方便,并引入客户端服务器之间的心跳机制增强了可靠性。未来将进一步完善接口连接的故障检测和设备断开后重新枚举等功能,并加入JTAG等接口的转换与网络传输。若采用接口服务器软件结合USB hub和USB串口转换器可以进一步降低硬件成本。文中设计在保证接口转换性能的同时,提出了结构简单,可挂接多个串口设备的服务器方案,具有较强的通用性。作为一种接口转换和拓展设备,串口服务器在多用户远程调试,传感器仪器仪表网络化等方面具有较高的应用价值。

[1] Samsung Electronics.S3C2440A 32-bit cmos risc microcontroller user’s manual revision 1.3[M].Korea: Samsung Electronics,2006.

[2] 官媛.嵌入式串口通讯服务器的研究和设计[D].杭州:浙江大学,2006.

[3] 李毅.嵌入式串口服务器的设计与实现[D].北京:北京交通大学,2012.

[4] 王海勇.基于ARM9的嵌入式多串口服务器设计[J].化工自动化及仪表,2013(3):372-376.

[5] 冯金霞,张轮,熊天圣.基于SPI接口的异步串口扩展技术研究[J].微型电脑应用,2009(12):50-54.

[6] 唐洪富.基于LPC系列单片机的串口扩展器设计[J].微型机与应用,2015(13):98-102.

[7] Future Technology Devices Intl. Ltd. FT232R USB UART IC datasheet[M].USA: Future Technology Devices Intl. Ltd,2015.

[8] Future Technology Devices Intl. Ltd. FT4232H quad high speed USB to multipurpose UART/MPSSE IC datasheet[M].USA: Future Technology Devices Intl. Ltd,2010.

[9] 刘建,武树飞.基于FT232BL的USB接口快速设计[J].舰船电子工程,2009(6):51-53.

[10] 鲍兆伟,王林,徐琦,等.基于FT232R的USB-RS232转换模块的设计[J].网络通信及安全,2008(4):59-63.

[11] Davicom Semiconductor, Inc.DM9000C ethernet controller with general processor interface data sheet[M].USA:Davicom Semiconductor, Inc.,2007.

[12] 韦东山.嵌入式Linux应用开发完全手册[M].北京:人民邮电出版社,2008.

[13] 刘嘉宁,简秦勤.基于ARM9的多功能综合通信控制系统设计[J].电子科技,2013(26):97-105.

[14] W Richard Stevens,Stephen A Rago.UNIX环境高级编程[M].北京:人民邮电出版社,2014.

[15] W.Richard Stevens,Bill Fenner,Andrew M.Rudoff.UNIX网络编程[M].北京:人民邮电出版社,2015.

Design and Implementation of UART Server Based on Linux

WANG Tianhao1,HE Yalong2

(1.School of Computer Science and Technology, Harbin Engineering University, Harbin 150001, China;2. Hangzhou Applied Acoustics Research Institute, Hangzhou 310023, China)

A UART server is designed based on Linux to solve the problems about transmission distance and number of host computer’s serial ports. The server is in the Client/Server mode and transmits UART data stream by Ethernet. With TCP/IP of embedded Linux and the UART interface convertor, the UART server is used to receive and transmit data in a non-blocking way and check the disconnection with the heartbeat function of keepalive. Simulation and hardware test results indicate that the server can operate stably and mount a number of UART devices. The UART server has been used in the debugging of embedded software, and is capable of adding more types of interface.

UART server; Linux; interface convertor; keepalive; remote debugging

2016- 06- 21

王天昊(1989-),男,硕士研究生。研究方向:模式识别,嵌入式软件。贺亚龙(1976-),男,高级工程师。研究方向:嵌入式系统。

10.16180/j.cnki.issn1007-7820.2017.06.029

TN919.3;TP368.5

A

1007-7820(2017)06-105-04

猜你喜欢

串口嵌入式客户端
Focal&Naim同框发布1000系列嵌入式扬声器及全新Uniti Atmos流媒体一体机
浅谈AB PLC串口跟RFID传感器的通讯应用
如何看待传统媒体新闻客户端的“断舍离”?
TS系列红外传感器在嵌入式控制系统中的应用
县级台在突发事件报道中如何应用手机客户端
孵化垂直频道:新闻客户端新策略
大枢纽 云平台 客户端——中央人民广播电台的探索之路
搭建基于Qt的嵌入式开发平台
数字电源内部数据传输的串口通信方法实现
USB接口的多串口数据并行接收方法探索