????????之前我們用測試工具模擬了串口通訊,并通過JAVA實(shí)現(xiàn)了串口數(shù)據(jù)接收和發(fā)送齐莲,今天來個實(shí)戰(zhàn)痢站,以某品牌的液位儀為實(shí)驗(yàn)設(shè)備,通過串口連接到上位機(jī)选酗,用液位儀的通訊命令讀取油罐的液位數(shù)據(jù)阵难。
? ? ? ? 液位儀是使用電子或其它技術(shù)用于檢測液體表面,流量芒填,流速的儀器呜叫,適用多種環(huán)境監(jiān)測,如地下水監(jiān)測殿衰,油站油罐中油位和水位監(jiān)測等朱庆。
? ? ? 如果你的電腦沒有串口,請使用USB轉(zhuǎn)串口來擴(kuò)展播玖,前面文章中有介紹椎工。設(shè)備連接方式如下:
液位儀協(xié)議
????????液位儀通過串口與上位機(jī)連接,不同液位儀廠家有不同的通訊協(xié)議,協(xié)議定義了交互的波特率/數(shù)據(jù)位/停止位和奇偶校驗(yàn)方式维蒙,以及操作指令掰吕。以下為截取的通訊協(xié)議信息,我們將按照協(xié)議來獲取液位數(shù)據(jù):
該表展示的是連接液位儀時串口的參數(shù)配置颅痊,必須按照這幾個參數(shù)配置才能正常與液位儀交互殖熟;
上位機(jī)請求液位儀和液位儀響應(yīng)數(shù)據(jù)時都以這個格式組織數(shù)據(jù)斑响,即以0x01開頭菱属,中間依次為6個字節(jié)的命令號线椰,接下來是可選的數(shù)據(jù)域和校驗(yàn)域绣夺,如果包含數(shù)據(jù)域則必須跟&&和2個字節(jié)校驗(yàn)。
上圖就是查詢當(dāng)前液位的上位機(jī)命令和液位儀響應(yīng)输钩,先來看上位機(jī)請求命令為<SOH>i201TT营罢,其中TT為油罐號赏陵,查詢?nèi)坑凸蘧蛯T傳為00,查詢1號罐就傳01饲漾,根據(jù)截圖2和3我們可以得出查詢?nèi)坑凸迶?shù)據(jù)的命令為:01 69 32 30 31 30 30;再來看下液位儀的回復(fù)數(shù)據(jù)蝙搔,由于遵循統(tǒng)一的協(xié)議格式,所以返回還是以<SOH>i201TT打頭考传,后面緊跟的是當(dāng)前時間吃型,然后就是每個罐的數(shù)據(jù),從下圖可以看出僚楞,如果有多個罐時數(shù)據(jù)會合并在一起返回勤晚,最后是數(shù)據(jù)結(jié)束標(biāo)記&&和2個字節(jié)校驗(yàn)值。其中的浮點(diǎn)數(shù)遵循IEEE標(biāo)準(zhǔn)镜硕,轉(zhuǎn)換時需要注意运翼。
工具測試液位儀
通過usb轉(zhuǎn)串口線將液位儀連接到電腦,打開串口測試工具配置好參數(shù)后以HEX方式發(fā)送請求命令兴枯,可以看到液位儀回復(fù)的數(shù)據(jù):
通過程序連接液位儀
基于之前串口通訊的測試代碼血淌,我們這里完成命令發(fā)送和液位數(shù)據(jù)接收,關(guān)于數(shù)據(jù)驗(yàn)證和解析部分不在這里展示了财剖,如果需要可以留言給我悠夯。
將測試程序做如下修改:
1.程序啟動后發(fā)送查詢液位的命令;
2.發(fā)送后等待一定時間后開始讀取緩沖區(qū)里的數(shù)據(jù)躺坟,如果沒有收到<SOH>就繼續(xù)等待直到收到完整數(shù)據(jù)包沦补;
修改后的代碼如下:
程序運(yùn)行結(jié)果:
如圖,我們用JAVA通過串口完成了液位儀數(shù)據(jù)的讀取咪橙,代碼僅限于測試夕膀,請勿直接用于生產(chǎn)環(huán)境虚倒。