王天昊,賀亞龍
(1.哈爾濱工程大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,黑龍江 哈爾濱 150001;2.杭州應(yīng)用聲學(xué)研究所,浙江 杭州 310023)
?
基于Linux的串口服務(wù)器設(shè)計(jì)與實(shí)現(xiàn)
王天昊1,賀亞龍2
(1.哈爾濱工程大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,黑龍江 哈爾濱 150001;2.杭州應(yīng)用聲學(xué)研究所,浙江 杭州 310023)
為解決串口通信距離和上位機(jī)接口數(shù)量有限的問題,設(shè)計(jì)了一種基于Linux系統(tǒng)的串口服務(wù)器。服務(wù)器屬于客戶端服務(wù)器模式,通過網(wǎng)絡(luò)傳輸串口數(shù)據(jù)流。服務(wù)器基于嵌入式Linux的TCP/IP,通過串行接口的轉(zhuǎn)換,以非阻塞方式進(jìn)行數(shù)據(jù)收發(fā),并實(shí)現(xiàn)了心跳方式的連接中斷檢測(cè)。經(jīng)仿真和硬件測(cè)試,服務(wù)器運(yùn)行穩(wěn)定,可掛接串口設(shè)備數(shù)量較多。該服務(wù)器已應(yīng)用于嵌入式軟件的調(diào)試工作,并將增加可用接口種類,為遠(yuǎn)程調(diào)試與開發(fā)提供更為有效的支持。
串口服務(wù)器;Linux;接口轉(zhuǎn)換;連接中斷檢測(cè);遠(yuǎn)程調(diào)試
串行接口是一種基本的通信接口,因其簡易和低成本的特點(diǎn)在嵌入式軟件開發(fā)與調(diào)試過程中被廣泛使用。但是計(jì)算機(jī)硬件制造商正逐漸取消外接的低速串口,現(xiàn)在通常利用接口轉(zhuǎn)換設(shè)備將串行接口轉(zhuǎn)換為計(jì)算機(jī)所支持的接口進(jìn)行串口數(shù)據(jù)傳輸。串口服務(wù)器通過以太網(wǎng)協(xié)議收發(fā)異步串行數(shù)據(jù)流,滿足多用戶遠(yuǎn)程調(diào)試多目標(biāo)機(jī)的需求,既能增多可并行操控的串口設(shè)備數(shù)量,又可避免串口傳輸?shù)木嚯x限制。同時(shí)以太網(wǎng)作為一種常用的局域網(wǎng)組網(wǎng)方式,在軟硬件實(shí)現(xiàn)和使用范圍上相比于其它的轉(zhuǎn)換方式均有較大的優(yōu)勢(shì)。通過服務(wù)器從串口到網(wǎng)絡(luò)的轉(zhuǎn)換可以將一些只具備串口輸入輸出的設(shè)備連接到網(wǎng)絡(luò)中實(shí)現(xiàn)更大范圍的控制和管理維護(hù)。
串口服務(wù)器為客戶端服務(wù)器(C/S)的網(wǎng)絡(luò)架構(gòu)。服務(wù)器硬件部分基于ARM920T的 S3C2440A芯片,其操作系統(tǒng)內(nèi)核版本為Linux2.6.22,并利用Nand Flash存儲(chǔ)內(nèi)核和文件系統(tǒng),以太網(wǎng)控制芯片為DM9000CEP。主要器件與操作系統(tǒng)均為較成熟的組件,因而可提高穩(wěn)定性并方便后期維護(hù)改進(jìn)。多線程的服務(wù)器程序從網(wǎng)絡(luò)接收由客戶端程序發(fā)送數(shù)據(jù)將其轉(zhuǎn)發(fā)到對(duì)應(yīng)串口,并將服務(wù)器串口接收到的數(shù)據(jù)通過網(wǎng)絡(luò)轉(zhuǎn)發(fā)至客戶端程序。設(shè)計(jì)結(jié)構(gòu)框圖如圖1所示,客戶端程序包括Linux和Windows版本,可通過圖形界面進(jìn)行串口操作和數(shù)據(jù)收發(fā)。
圖1 串口服務(wù)器結(jié)構(gòu)框圖
1.1 底層軟件硬件部分
S3C2440A芯片具有3個(gè)獨(dú)立的異步串行接口[1],若采用一些現(xiàn)有的方案直接使用這些接口會(huì)限制通過串口連接的設(shè)備數(shù)量[2-4]。根據(jù)需求服務(wù)器至少可同時(shí)連接操作20個(gè)串口,所以應(yīng)擴(kuò)展服務(wù)器硬件接口數(shù)量,其中一種方法是將串口數(shù)據(jù)轉(zhuǎn)換為其它類型協(xié)議的數(shù)據(jù)再傳送至服務(wù)器進(jìn)行處理。常見的串口轉(zhuǎn)換芯片包括USB轉(zhuǎn)串口的PL2303,F(xiàn)T232等和SPI轉(zhuǎn)串口的GM8142等[5-6]。USB串口使用普遍,1個(gè)USB2.0的拓?fù)渚W(wǎng)絡(luò)理論上最多可支持127個(gè)外設(shè)。因?yàn)閁SB接口較為普遍,而PL2303因制造廠商多,規(guī)格和驅(qū)動(dòng)有所差別,所以串口服務(wù)器設(shè)計(jì)中采用FT232芯片。FT232以硬件邏輯實(shí)現(xiàn)USB總線協(xié)議和串口協(xié)議的相互轉(zhuǎn)換并支持異步Bit-Bang模式[7-8],Linux2.6.22包含對(duì)FT232的驅(qū)動(dòng)。串口收發(fā)的連接順序?yàn)樵O(shè)備間串口的收發(fā)端對(duì)接。FT232在USB host的控制下工作,而S3C2440A集成了2個(gè)USB host控制器和1個(gè)USB device控制器,則FT232連接到S3C2440A USB host的DN0,DP0。電路設(shè)計(jì)中加入DN0,DP0引腳對(duì)應(yīng)的下拉電阻,而USB接口電源端可以加入1個(gè)磁珠以降低器件的相互干擾,同時(shí)電源與地之間的去耦電容可提高系統(tǒng)的抗干擾能力[9-10]。
圖2 USB轉(zhuǎn)換串口原理圖
移植過程中配置Linux時(shí)選中Device Drivers / USB support / USB Serial Converter support加入內(nèi)核或以模塊形式進(jìn)行編譯。USB串口的設(shè)備文件為/dev/ttyUSB*,普通串口設(shè)備文件為/dev/ttyS*。服務(wù)器默認(rèn)串口波特率為115 200,8位數(shù)據(jù)位,無奇偶校驗(yàn),1位停止位。串口配置可以根據(jù)實(shí)際情況作為串口調(diào)試客戶端或服務(wù)器的任務(wù)參數(shù)發(fā)送到服務(wù)器以初始化串口。
DM9000CEP為內(nèi)存類型的以太網(wǎng)控制器,集成10/100 Mbit·s-1物理層自適應(yīng)收發(fā)器和16 kB的SRAM,支持以字節(jié)/字/雙字的IO指令數(shù)據(jù)讀寫,兼容3.3 V和5 V的輸入輸出電壓[11]。網(wǎng)絡(luò)控制器部分原理如圖3所示。
圖3 網(wǎng)絡(luò)控制器原理圖
設(shè)計(jì)中DM9000總線寬度為16位。中斷引腳INT接S3C2440A的EINT7外部中斷引腳。IOR#接S3C2440A的nOE讀使能,IOW#接S3C2440A的nWE的寫使能。CS#片選接S3C2440A的nGCS4。對(duì)于S3C2440A的存儲(chǔ)控制,nGCS4與BANK4相對(duì)應(yīng),設(shè)置內(nèi)存控制器BWSCON寄存器的DW4為01,表示BANK4為16位總線寬度,并設(shè)置BANKCON4使CPU的對(duì)BANK4內(nèi)存塊的讀寫時(shí)序符合DM9000的要求。當(dāng)S3C2440A訪問BANK4的地址空間(0x20000000-0x28000000),nGSC4引腳輸出低電平,則DM9000的片選引腳CS#有效,從而完成CPU對(duì)DM9000的操作[12]。DM9000的地址和數(shù)據(jù)傳輸共用總線。CMD引腳用于選擇總線傳輸模式,當(dāng)CMD為低時(shí),傳輸?shù)刂?;CMD為高時(shí),傳輸數(shù)據(jù)。根據(jù)廠商提供的驅(qū)動(dòng)程序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;
設(shè)計(jì)中用S3C2440A的LADDR2連接CMD引腳,當(dāng)LADDR2為1時(shí)可使 為1傳輸數(shù)據(jù),LADDR2為0時(shí)傳輸?shù)刂贰M9000的IO基地址為對(duì)應(yīng)內(nèi)存塊基地址加0x300的偏移量,地址傳輸時(shí)即采用IO基地址。
1.2 應(yīng)用軟件部分
服務(wù)器客戶端軟件的網(wǎng)絡(luò)部分使用Socket套接字編程。將服務(wù)器程序作為自定義開機(jī)啟動(dòng)程序加入Linux系統(tǒng),初始化描述串口狀態(tài)的全局結(jié)構(gòu)體,所有串口均設(shè)置為空閑狀態(tài),可選擇開啟UDP廣播接收線程以供客戶端搜索??蛻舳烁鶕?jù)探測(cè)到的服務(wù)器IP地址請(qǐng)求連接服務(wù)器,根據(jù)實(shí)際應(yīng)用情況嘗試連接相應(yīng)的服務(wù)器。服務(wù)器運(yùn)行監(jiān)聽線程在收到連接后創(chuàng)建連接和任務(wù)處理線程??蛻舳送ㄟ^TCP握手與服務(wù)器連接,接收服務(wù)器發(fā)送的已掛載串口設(shè)備列表。用戶選擇并操作列表中的串口,客戶端發(fā)送相應(yīng)的任務(wù)請(qǐng)求到服務(wù)器。服務(wù)器解析并運(yùn)行任務(wù),任務(wù)結(jié)束返回結(jié)果到客戶端。服務(wù)器可接收的任務(wù)請(qǐng)求類型包括串口復(fù)位與釋放,本地串口控制請(qǐng)求,客戶端對(duì)服務(wù)器的串口控制請(qǐng)求,連接檢測(cè)等。
圖4 串口服務(wù)器流程圖
以下為相關(guān)結(jié)構(gòu)體說明
typedef struct
{
in_addr_t client_addr_u32;
/* 占用串口的客戶端IP地址 */
int num; /* 串口號(hào) */
int status; /* 串口狀態(tài) */
struct keep_alive UART_ka;
}SerialInfo; /* 串口結(jié)構(gòu)體 */
typedef struct
{
in_addr_t server_addr_u32;
/* 服務(wù)器IP地址 */
SerialInfo serial_unit[MAX_SERIAL_NUM];
}SerialSvrInfo; /* 串口服務(wù)器結(jié)構(gòu)體 */
因?yàn)榇诓僮鳛楠?dú)占方式,即同一串口無法被上位機(jī)重復(fù)打開操作。當(dāng)服務(wù)器收到串口控制的任務(wù)請(qǐng)求后,根據(jù)串口號(hào)查詢對(duì)應(yīng)串口是否空閑,若空閑則允許對(duì)其操作并設(shè)置串口狀態(tài)為被占用狀態(tài),對(duì)應(yīng)串口結(jié)構(gòu)體記錄客戶端IP地址,否則將被請(qǐng)求的串口已被占用和占用該串口的客戶端IP地址作為任務(wù)結(jié)果返回客戶端。
服務(wù)器等待任務(wù)請(qǐng)求的線程采用循環(huán)的Select方式監(jiān)視串口和TCP連接套接字的IO變化[13]。Unix類系統(tǒng)提供Select來實(shí)現(xiàn)多路復(fù)用的輸入輸出模型。Select系統(tǒng)調(diào)用可用于監(jiān)視多個(gè)文件描述符的狀態(tài)變化[14]。程序會(huì)在Select等待,直至被監(jiān)視的文件描述符有一或多個(gè)發(fā)生了狀態(tài)變化。Select可以設(shè)置超時(shí)值。服務(wù)器Select若等待超時(shí)可釋放串口和TCP連接并回收相關(guān)的資源。當(dāng)有標(biāo)準(zhǔn)輸入時(shí)根據(jù)描述符集合的置位狀態(tài)確定數(shù)據(jù)來源并讀取數(shù)據(jù)到緩沖區(qū),對(duì)于串口輸入則通過連接套接字sock_connect發(fā)送緩沖區(qū)數(shù)據(jù)到客戶端,對(duì)于網(wǎng)絡(luò)輸入則寫緩沖區(qū)數(shù)據(jù)到串口描述符。若讀取出錯(cuò)或TCP連接意外斷開,返回值小于或等于0,則退出循環(huán),釋放文件描述符,清理相應(yīng)的串口結(jié)構(gòu)體SerialInfo,為客戶端重新連接后訪問串口做好準(zhǔn)備。
為應(yīng)對(duì)網(wǎng)線故障,斷電等非正常連接斷開的情況,設(shè)計(jì)中加入了心跳探測(cè)機(jī)制[15]。服務(wù)器接收客戶端發(fā)來的UDP心跳包并轉(zhuǎn)發(fā)回客戶端,若超時(shí)未收到心跳包則判斷連接已經(jīng)斷開。本設(shè)計(jì)中客戶端心跳包發(fā)送周期為5 s,超時(shí)閾值為30 s。服務(wù)器心跳包接收超時(shí)后將結(jié)束任務(wù)處理線程,釋放接口。
對(duì)于串口服務(wù)器,利用Linux虛擬機(jī),vspd虛擬串口和secureCRT串口工具進(jìn)行了仿真測(cè)試。虛擬串口COM10-COM13分別對(duì)接虛擬串口COM14-COM17。Linux加載運(yùn)行服務(wù)器程序,Windows版本的客戶端程序申請(qǐng)?jiān)L問并操作COM10-COM13,其對(duì)應(yīng)Linux系統(tǒng)中的設(shè)備ttyS0-ttyS3。用串口工具secureCRT操作COM14-COM17。如圖5和圖6所示,軟件可進(jìn)行正確的數(shù)據(jù)傳輸,對(duì)于網(wǎng)絡(luò)連接中斷的情況可以檢測(cè)并回收相關(guān)資源。仿真測(cè)試驗(yàn)證串口服務(wù)器功能正常。經(jīng)過在硬件電路上的測(cè)試與應(yīng)用,包括多個(gè)串口設(shè)備持續(xù)發(fā)送規(guī)定格式數(shù)據(jù)包由客戶端接收檢測(cè),客戶端對(duì)多個(gè)目標(biāo)機(jī)串口的控制和數(shù)據(jù)傳輸,基于Linux的串口服務(wù)器至少支持對(duì)40個(gè)串口設(shè)備的通信。
圖5 服務(wù)器運(yùn)行情況
圖6 客戶端運(yùn)行情況
本設(shè)計(jì)中的串口服務(wù)器已在嵌入式軟硬件調(diào)試中成功應(yīng)用。串口服務(wù)器硬件部分用接口轉(zhuǎn)換芯片拓展服務(wù)器的有效接口數(shù)量,軟件部分基于開源的Linux操作系統(tǒng),移植與修改較為方便,并引入客戶端服務(wù)器之間的心跳機(jī)制增強(qiáng)了可靠性。未來將進(jìn)一步完善接口連接的故障檢測(cè)和設(shè)備斷開后重新枚舉等功能,并加入JTAG等接口的轉(zhuǎn)換與網(wǎng)絡(luò)傳輸。若采用接口服務(wù)器軟件結(jié)合USB hub和USB串口轉(zhuǎn)換器可以進(jìn)一步降低硬件成本。文中設(shè)計(jì)在保證接口轉(zhuǎn)換性能的同時(shí),提出了結(jié)構(gòu)簡單,可掛接多個(gè)串口設(shè)備的服務(wù)器方案,具有較強(qiáng)的通用性。作為一種接口轉(zhuǎn)換和拓展設(shè)備,串口服務(wù)器在多用戶遠(yuǎn)程調(diào)試,傳感器儀器儀表網(wǎng)絡(luò)化等方面具有較高的應(yīng)用價(jià)值。
[1] Samsung Electronics.S3C2440A 32-bit cmos risc microcontroller user’s manual revision 1.3[M].Korea: Samsung Electronics,2006.
[2] 官媛.嵌入式串口通訊服務(wù)器的研究和設(shè)計(jì)[D].杭州:浙江大學(xué),2006.
[3] 李毅.嵌入式串口服務(wù)器的設(shè)計(jì)與實(shí)現(xiàn)[D].北京:北京交通大學(xué),2012.
[4] 王海勇.基于ARM9的嵌入式多串口服務(wù)器設(shè)計(jì)[J].化工自動(dòng)化及儀表,2013(3):372-376.
[5] 馮金霞,張輪,熊天圣.基于SPI接口的異步串口擴(kuò)展技術(shù)研究[J].微型電腦應(yīng)用,2009(12):50-54.
[6] 唐洪富.基于LPC系列單片機(jī)的串口擴(kuò)展器設(shè)計(jì)[J].微型機(jī)與應(yīng)用,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接口快速設(shè)計(jì)[J].艦船電子工程,2009(6):51-53.
[10] 鮑兆偉,王林,徐琦,等.基于FT232R的USB-RS232轉(zhuǎn)換模塊的設(shè)計(jì)[J].網(wǎng)絡(luò)通信及安全,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應(yīng)用開發(fā)完全手冊(cè)[M].北京:人民郵電出版社,2008.
[13] 劉嘉寧,簡秦勤.基于ARM9的多功能綜合通信控制系統(tǒng)設(shè)計(jì)[J].電子科技,2013(26):97-105.
[14] W Richard Stevens,Stephen A Rago.UNIX環(huán)境高級(jí)編程[M].北京:人民郵電出版社,2014.
[15] W.Richard Stevens,Bill Fenner,Andrew M.Rudoff.UNIX網(wǎng)絡(luò)編程[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-),男,碩士研究生。研究方向:模式識(shí)別,嵌入式軟件。賀亞龍(1976-),男,高級(jí)工程師。研究方向:嵌入式系統(tǒng)。
10.16180/j.cnki.issn1007-7820.2017.06.029
TN919.3;TP368.5
A
1007-7820(2017)06-105-04