圖0:串口服務(wù)器 - 系統(tǒng)信息
串口服務(wù)器是一種將串口數(shù)據(jù)轉(zhuǎn)換為網(wǎng)口數(shù)據(jù)的設(shè)備,它在工業(yè)方面使用較多。這類(lèi)設(shè)備需要非常高的穩(wěn)定性,但是穩(wěn)定性跟設(shè)計(jì)人員的硬件水平、軟件水平以及測(cè)試等關(guān)系密切,這個(gè)范圍太大,這里只是談串口服務(wù)器軟件如何設(shè)計(jì)。
1.1 串口數(shù)據(jù)結(jié)構(gòu)
1.2 網(wǎng)口數(shù)據(jù)結(jié)構(gòu)
串口數(shù)據(jù)結(jié)構(gòu)中,串口參數(shù)、操作模式、協(xié)議類(lèi)型以及與串口打包有關(guān)的數(shù)據(jù)需要存儲(chǔ)在非易失性存儲(chǔ)器中;
網(wǎng)口數(shù)據(jù)結(jié)構(gòu)需要存儲(chǔ)在非易失性存儲(chǔ)器中。
在設(shè)計(jì)參數(shù)存儲(chǔ)程序時(shí),應(yīng)考慮易擴(kuò)展性。因?yàn)閷?lái)串口的個(gè)數(shù)可能會(huì)比當(dāng)前設(shè)計(jì)的個(gè)數(shù)增加,新增加的串口,不應(yīng)該再去考慮參數(shù)存儲(chǔ)的事情。
串口接收的數(shù)據(jù)和網(wǎng)口接收的數(shù)據(jù)應(yīng)該分別存儲(chǔ),環(huán)形隊(duì)列這種數(shù)據(jù)結(jié)構(gòu)能很好的滿(mǎn)足我們的需求。它用兩個(gè)指針?lè)謩e管理讀和寫(xiě)入口,一般寫(xiě)隊(duì)列的優(yōu)先級(jí)都會(huì)大于或等于讀隊(duì)列優(yōu)先級(jí),這樣就可以不用設(shè)置臨界區(qū)。
在我們這個(gè)應(yīng)用中,環(huán)形隊(duì)列每次寫(xiě)入和讀出的數(shù)據(jù)都不一定相同,所以我們需要改造通用的環(huán)形隊(duì)列實(shí)現(xiàn)方法,將每一幀的長(zhǎng)度字段和數(shù)據(jù)一起存入到環(huán)形隊(duì)列中去。
數(shù)據(jù)打包一般只針對(duì)串口,這是因?yàn)榇谠谟布用嫔鲜遣恢С?數(shù)據(jù)幀'的,它是一個(gè)字節(jié)一個(gè)字節(jié)發(fā)送和接收(即使有FIFO,但通常不會(huì)超過(guò)16字節(jié))。網(wǎng)口與串口不同,它會(huì)將數(shù)據(jù)打包,在一包數(shù)據(jù)前面和后面各增加一些位形成數(shù)據(jù)幀,可以說(shuō)網(wǎng)口硬件已經(jīng)將數(shù)據(jù)打包好了,串口沒(méi)有這種硬件功能,需要軟件打包。
一般可以根據(jù)設(shè)置的參數(shù)來(lái)打包,比如根據(jù)打包時(shí)間參數(shù)、打包長(zhǎng)度參數(shù)、分隔符等等。如果沒(méi)有使能這些參數(shù),或者打包時(shí)間參數(shù)和打包長(zhǎng)度參數(shù)設(shè)置為0,就需要程序默認(rèn)一個(gè)打包時(shí)間。
打包時(shí)間這個(gè)參數(shù)很容易被誤解,它并不是說(shuō)這個(gè)時(shí)間內(nèi)的數(shù)據(jù)打成一包數(shù)據(jù),而是當(dāng)接收一個(gè)字節(jié)數(shù)據(jù)之后,超過(guò)打包時(shí)間也沒(méi)有接收到下一個(gè)字節(jié)數(shù)據(jù),我們就會(huì)把這之前接收的數(shù)據(jù)打包。
打包長(zhǎng)度這個(gè)參數(shù)是指接收到的數(shù)據(jù)個(gè)數(shù)等于打包長(zhǎng)度時(shí),這些數(shù)據(jù)打成一包。需要注意的是程序中隱藏著另外一個(gè)固定的打包長(zhǎng)度,并且這個(gè)打包長(zhǎng)度優(yōu)先級(jí)最高,只要接收到的數(shù)據(jù)長(zhǎng)度等于這個(gè)打包長(zhǎng)度,會(huì)忽略掉其它所有打包參數(shù),立刻將數(shù)據(jù)打包。這個(gè)隱含打包長(zhǎng)度就是串口接收緩沖區(qū)長(zhǎng)度。
分隔符可以有1個(gè)也可以有多個(gè),當(dāng)接收的數(shù)據(jù)流中包含了分隔符后,數(shù)據(jù)立刻被打包,它會(huì)忽略打包時(shí)間參數(shù)。
如果支持軟件協(xié)議,要根據(jù)軟件協(xié)議規(guī)定的打包策略執(zhí)行。
添加自定義協(xié)議層,可以實(shí)現(xiàn)數(shù)據(jù)過(guò)濾、更詳細(xì)的數(shù)據(jù)統(tǒng)計(jì)功能等等;可以將串口服務(wù)器用作Modbus網(wǎng)關(guān),用于將Modbus TCP轉(zhuǎn)換成Modbus RTU;可以實(shí)現(xiàn)其它協(xié)議轉(zhuǎn)換。
如果隔個(gè)半年,還得讓你記得某個(gè)串口服務(wù)器的IP地址,那么這樣的產(chǎn)品是相當(dāng)沒(méi)有人性化設(shè)計(jì)的。所以我們必須設(shè)計(jì)一種功能,通過(guò)一個(gè)上位機(jī)軟件,去發(fā)現(xiàn)當(dāng)前局域網(wǎng)下的所有串口服務(wù)器IP地址、MAC地址等信息。這一功能,叫做IP發(fā)現(xiàn)。
一般是利用UDP廣播功能,向特定端口發(fā)送一個(gè)特定數(shù)據(jù)包,串口服務(wù)器收到數(shù)據(jù)包后,將自己的IP地址等信息上傳給上位機(jī)。圖6-1顯示上位機(jī)軟件獲取到的一個(gè)串口服務(wù)器信息。
圖6-1:IP發(fā)現(xiàn)示意圖
主要用來(lái)修改參數(shù)和顯示統(tǒng)計(jì)信息。需要注意的是要具有非法參數(shù)檢查功能。圖0、圖7-1和圖7-2顯示了部分網(wǎng)頁(yè)服務(wù)器一般內(nèi)容。
圖7-1:網(wǎng)絡(luò)設(shè)置
圖7-2:串口設(shè)置
聯(lián)系客服