摘 要: 采用串口轉(zhuǎn)以太網(wǎng)模塊使現(xiàn)有串口設(shè)備具備聯(lián)網(wǎng)功能是一種低成本實用的解決方案。在使用之前,需要根據(jù)具體應(yīng)用環(huán)境對串口轉(zhuǎn)以太網(wǎng)模塊的串口參數(shù)以及網(wǎng)絡(luò)參數(shù)進行設(shè)置。對上位機與串口轉(zhuǎn)以太網(wǎng)模塊間的通信協(xié)議進行了詳細闡述,采用UDP廣播通信方式,由上位機通過網(wǎng)口對模塊進行參數(shù)配置。在Visual Studio 2012下,用C#編程實現(xiàn)了一套配置軟件。配置過程中,上位機和模塊可以跨網(wǎng)段通信,避免需預知模塊初始IP以及更改上位機IP地址的麻煩,使用更方便。
關(guān)鍵詞: 通用同步/異步串行接收/發(fā)送器;以太網(wǎng);通信協(xié)議
0 引言
長期以來,串行通信方式在數(shù)據(jù)采集、數(shù)據(jù)監(jiān)控、安防、醫(yī)療等很多領(lǐng)域應(yīng)用普遍,但隨著Internet的發(fā)展和應(yīng)用需求的提升,其局限性也日益凸顯:通信距離短、速率低、網(wǎng)絡(luò)特性差等[1]。同時,物聯(lián)網(wǎng)的迅猛發(fā)展,使得嵌入式設(shè)備聯(lián)網(wǎng)的需求越來越迫切。
淘汰現(xiàn)有串口設(shè)備,研發(fā)能聯(lián)網(wǎng)的新產(chǎn)品需要投入大量的時間和人力物力,相比之下,采用串口轉(zhuǎn)以太網(wǎng)技術(shù),只需增加串口轉(zhuǎn)以太網(wǎng)模塊,而無需淘汰原先的串口設(shè)備,不僅可以提高設(shè)備利用率,還可以降低開發(fā)成本、縮短開發(fā)周期,輕松實現(xiàn)串口設(shè)備聯(lián)網(wǎng)。
串口轉(zhuǎn)以太網(wǎng),實際就是將串口數(shù)據(jù)作為TCP/IP的應(yīng)用層數(shù)據(jù),用TCP/IP封裝傳輸[2-3]。本文主要完成串口轉(zhuǎn)以太網(wǎng)模塊上位機配置軟件的設(shè)計,根據(jù)上位機和串口轉(zhuǎn)以太網(wǎng)模塊間的通信協(xié)議,利用UDP廣播方式,完成模塊的參數(shù)配置,方便用戶對模塊的使用。
1 串口轉(zhuǎn)以太網(wǎng)模塊簡介
串口轉(zhuǎn)以太網(wǎng)實際上就是將串行通信數(shù)據(jù)轉(zhuǎn)化為網(wǎng)絡(luò)數(shù)據(jù)包發(fā)出,將收到的網(wǎng)絡(luò)數(shù)據(jù)包用串行通信的方式發(fā)出,從而實現(xiàn)串口與網(wǎng)口之間數(shù)據(jù)的透明傳輸[4-5]。
本文采用USR-TCP232-E45串口轉(zhuǎn)以太網(wǎng)模塊。該模塊搭載ARM處理器,采用Cortex-M3內(nèi)核,內(nèi)部集成了LWIP協(xié)議棧,速度快,功耗低,工作穩(wěn)定可靠[6]。模塊在使用之前需配置的參數(shù)包括:串口參數(shù)[7](波特率、數(shù)據(jù)位、校驗位、停止位)和網(wǎng)絡(luò)參數(shù)(工作模式、IP地址、端口號、子網(wǎng)掩碼、網(wǎng)關(guān)等)。
2 通信協(xié)議
對串口轉(zhuǎn)以太網(wǎng)模塊進行參數(shù)配置,需要上位機按照一定的通信協(xié)議向模塊發(fā)送相應(yīng)命令(數(shù)據(jù)報文)。
通信協(xié)議由報文頭、報文長度、報文內(nèi)容組成,上位機發(fā)送的報文在末尾還帶1 B的校驗碼,模塊對上位機的響應(yīng)不帶校驗,如表1所示。在通信協(xié)議中加入校驗?zāi)軌蚝芎玫亟鉀Q傳輸誤碼的問題;接收方對收到的數(shù)據(jù)進行校驗,如果校驗值不正確,則丟棄本包數(shù)據(jù),并通知發(fā)送方。
報文頭值為0xFF;報文長度為報文內(nèi)容所占的字節(jié)數(shù),由于報文內(nèi)容不同報文長度也會不同;校驗碼取報文長度和報文內(nèi)容各字節(jié)之和。報文內(nèi)容中只有控制碼是必需的,用來標識不同的命令操作,MAC地址、用戶名密碼、參數(shù)由于控制碼的不同可能不是必需的。
下位機返回的報文與上位機發(fā)送的報文格式類似,但是不帶校驗,響應(yīng)報文中控制碼字段表示本報文是對上位機發(fā)出的哪條命令的響應(yīng)。
發(fā)送搜索命令,模塊會返回36 B的數(shù)據(jù),包括模塊的IP地址、MAC地址,之后可以利用MAC地址對該模塊進行其他參數(shù)的設(shè)置。
讀取設(shè)置,返回256 B,包括基礎(chǔ)參數(shù)(IP地址、網(wǎng)關(guān)、子網(wǎng)掩碼、用戶名、密碼、MAC地址等)和串口參數(shù)(串口波特率、數(shù)據(jù)位、校驗位、停止位、流控、本地端口、工作協(xié)議等)。
響應(yīng)報文除了上述必須返回上位機要求的相應(yīng)參數(shù)情況外,還包括對上位機命令的校驗及命令的執(zhí)行情況。
校驗錯誤:′E′+正確的校驗值;
命令正確執(zhí)行:FF 01 CMD′K′;
用戶名密碼錯誤:FF 01 CMD′P′;
其他錯誤:FF 01 CMD ′E′
3 上位機配置軟件設(shè)計
為了方便跨網(wǎng)段進行配置,所有通信協(xié)議的操作均采用UDP廣播方式完成。
3.1 UDP廣播原理
廣播:一個節(jié)點發(fā)送數(shù)據(jù)包,網(wǎng)絡(luò)中的所有節(jié)點都可以收到。如果網(wǎng)絡(luò)中兩個主機上的應(yīng)用程序要相互通信,其一要知道彼此的IP;其二要知道程序可監(jiān)聽的端口,因為同一主機上的程序使用網(wǎng)絡(luò)是通過端口號來區(qū)分的。
如果想在整個網(wǎng)絡(luò)中廣播數(shù)據(jù),要向255.255.255.255發(fā)送數(shù)據(jù)包,這種數(shù)據(jù)包不會被路由,它只能到達本物理網(wǎng)絡(luò)中的所有主機,因為如果路由器轉(zhuǎn)發(fā)了廣播信息,那么勢必會引起網(wǎng)絡(luò)癱瘓。廣播需要指明接收者的端口號,因為不可能接收者的所有端口都用來收聽廣播,所以通信時必須保證目標端口號和本地端口號不被占用。
3.2 配置軟件的功能設(shè)計
配置軟件的功能比較單一,需要讀取模塊的當前設(shè)置(IP地址、網(wǎng)關(guān)、子網(wǎng)掩碼、MAC地址、串口波特率、數(shù)據(jù)位、校驗位、停止位、流控、本地端口、工作協(xié)議等)予以顯示,并能對這些參數(shù)進行設(shè)置。
3.3 程序設(shè)計及實現(xiàn)
上位機配置軟件在Visual Studio 2012開發(fā)環(huán)境下,采用C#編程實現(xiàn)。C#中對UDP的編程有兩種方式:直接使用Socket類和使用UdpClient類[8]。UdpClient類對基礎(chǔ)的Socket進行了封裝,發(fā)送和接收數(shù)據(jù)時不必考慮底層套接字收發(fā)時必須處理的一些細節(jié)問題,開發(fā)簡單、效率較高。因此,本文使用UdpClient類實現(xiàn)對UDP協(xié)議的編程。
本文采用了多線程技術(shù),用主線程發(fā)送數(shù)據(jù),專門啟動一個線程用于接收數(shù)據(jù),同一個進程中的兩個線程可以獨立運行并相互通信。
3.3.1 利用UdpClient對象實現(xiàn)UDP通信——數(shù)據(jù)發(fā)送
利用UdpClient對象發(fā)送數(shù)據(jù)的流程如圖1所示。
private UdpClient udpClient;
//創(chuàng)建UdpClient對象,這里使用1901端口
udpClient=new UdpClient(1901);
//遠程主機及端口號
IPEndPoint iep=new IPEndPoint(IPAddress.Broadcast,1901);
//發(fā)送緩沖區(qū)
byte[]searchDeviceCommand=new byte[]{0xff,0x01,0x01,0x02};
//通過udpClient將發(fā)送緩沖區(qū)中的內(nèi)容發(fā)送到遠程節(jié)點
udpClient.Send(searchDeviceCommand,
searchDeviceCommand.Length,iep);
3.3.2 利用UdpClient對象實現(xiàn)UDP通信——數(shù)據(jù)接收
利用UdpClient對象接收數(shù)據(jù)的流程如圖2所示。
UdpClient對象的Receive方法用于在指定的本地IP地址和端口上接收遠程主機發(fā)送的數(shù)據(jù)報[9]。
private byte[]rBuffer=new byte[256];
//根據(jù)通信協(xié)議中響應(yīng)報文的長度,設(shè)置合適大小的接收緩沖區(qū)(接收緩沖區(qū)的大小不能小于模塊響應(yīng)報文的最大長度)
private UdpClient udpClient;
private void FrmConfig_Load(object sender,EventArgs e)
{
udpClient=new UdpClient(1901);//創(chuàng)建接收數(shù)據(jù)的線程
t=new Thread(startThread);//線程后臺運行
t.IsBackground=true;//啟動線程
t.Start();
}
//在接收線程中從遠程節(jié)點接收數(shù)據(jù),對數(shù)據(jù)進行分析處理
private void startThread()
{
while(true)
{
IPEndPoint iepRemote=new IPEndPoint(IPAddress.Broadcast,1901);
rBuffer=udpClient.Receive(ref iepRemote);
//對接收緩沖區(qū)中的內(nèi)容進行分析,針對不同命令予以處理
}
}
3.4 程序調(diào)試
程序調(diào)試過程中用到了Wireshark工具。Wireshark是一個網(wǎng)絡(luò)封包分析軟件,通過簡單的設(shè)置就可以擷取網(wǎng)絡(luò)封包,并盡可能顯示出最為詳細的網(wǎng)絡(luò)封包資料。通過該軟件,可以方便地看到上位機配置軟件與串口轉(zhuǎn)以太網(wǎng)模塊之間數(shù)據(jù)包的各種信息。
4 結(jié)論
采用串口轉(zhuǎn)以太網(wǎng)模塊對現(xiàn)有串口嵌入式設(shè)備進行升級聯(lián)網(wǎng),只需一根網(wǎng)線將模塊與PC相連,通過該配置軟件就能方便地對模塊參數(shù)進行設(shè)置,操作簡單、實用。本文介紹的通信協(xié)議以及UDP通信的實現(xiàn)對其他通信應(yīng)用具有一定的參考價值。
參考文獻
[1] 蔡長安,鐘銳,王盈瑛.串行通信轉(zhuǎn)網(wǎng)絡(luò)通信數(shù)據(jù)模塊的設(shè)計[J].計算機應(yīng)用與軟件,2010,27(1):88-91.
[2] 李毅.嵌入式串口服務(wù)器的設(shè)計與實現(xiàn)[D].北京:北京交通大學,2012.
[3] 曾廣圣,曾維清,徐冉.一種基于ARM的以太網(wǎng)串口服務(wù)器的設(shè)計[J].科技廣場,2012,25(5):248-253.
[4] 陳政石,秦紅波,李鐵鷹.基于MSP430F149的串口服務(wù)器設(shè)計[J].電子技術(shù)應(yīng)用,2009,35(1):95-97.
[5] 成彬,王冬艷,韓憲生,等.密碼算法中的循環(huán)移位“異或”運算實質(zhì)性研究[J].微型機與應(yīng)用,2011,30(11):79-80.
[6] Jinan USR IOT Technology Co.,Ltd. Multifunctional serial to Ethernet module user manual[EB/OL].(2012-07-18)[2014-04-16]. http://www.usriot.com/Down/E45/USR-TCP232- E45-EN%20V1.3.2.pdf.
[7] 朱英翔,朱福民,劉炎鳴.C#下串口通信編程的開發(fā)和擴展[J].微型機與應(yīng)用,2014,33(6):89-91.
[8] 周有杰.Visual C#.Net網(wǎng)絡(luò)核心編程[M].北京:清華大學出版社,2002.
[9] ROBINSON S.C#高級編程[M].北京:清華大學出版社,2002.