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