汽車衡串口連續(xù)輸出數(shù)據(jù)的采集方法
主要描述了8142 型稱重顯示儀表的串口數(shù)據(jù)的讀取方法, 在主要部分還使用了 U M L 軟件建模來輔助說明設(shè)計(jì)思路。
1.稱重顯示儀與計(jì)算機(jī)串口的連接方法
8142 型儀表具備 1 個(gè)串行口(9 針)和 1 個(gè)并行口(25針), 其中串行口與稱重傳感器連接接收稱重信號(hào) , 并行口可與計(jì)算機(jī)或大屏顯示器連接輸出數(shù)據(jù)。計(jì)算機(jī)與儀表的具體接線方法如圖 1 所示。
2.數(shù)據(jù)輸出格式
在串口連接之前 , 可根據(jù)儀表的使用手冊(cè)改變儀表的串口輸出設(shè)置 , 本文的儀表串口輸出設(shè)置為波特率(1200)、數(shù)據(jù)位(7bits)、無校驗(yàn) 、停止位(1)、連續(xù)輸出 。儀表的連續(xù)輸出格式為 18 個(gè)字節(jié)(By tes)。具體輸出格式如表 1 所示 :
其中 :①<ST X > ASCII 起始符 (02H);②狀態(tài)字A ,B ,C ;③顯示重量 , 可能是毛重也可能是凈重 , 6 位不帶符號(hào)和小數(shù)點(diǎn)的數(shù)字 ;④皮重 , 6 位不帶符號(hào)和小數(shù)點(diǎn)的數(shù)字 ;⑤<CR > ASCII 回車符(ODH);⑥<CKS > 可選的校驗(yàn)和。
通過串口調(diào)試軟件接收的數(shù)據(jù)樣例 :
20202020202020202020200D02293C202020202020202 02020200D 稱重重量的讀取
2 .1 串口設(shè)置
在了解了 8142 型儀表的串口通信設(shè)備和輸出格式之后就可以開發(fā)相應(yīng)的串口通信程序了 , 為了使串口通訊程序有一定的通用性 , 因此串口的波特率、數(shù)據(jù)位等將通過程序而不通過 Window s 設(shè)置。
要通過程序設(shè)置串口 , 首先應(yīng)該在窗體的設(shè)計(jì)時(shí)插入一個(gè) Serial Port 組件 , 然后在代碼窗口中輸入如下代碼 :
If N ot RS232 Is Nothing T hen RS232 =Nothing
Dim mBaudRate A s Integer '傳輸速率
Dim mParity As Parity '奇偶校驗(yàn)
Dim mDataBit A s Integer '數(shù)據(jù)位
Dim mStopBit A s StopBits '停止位
Dim mPortN ame As String mPortN ame =“Com1”
mBaudRate =“1200” mParity ="Parity .None"
mDataBit =7
mStopBit =”StopBits .One” T ry
RS232 = N ew SerialPort (mPortN ame ,
mBaudRate , mParity , mDataBit , mStopBit) Catch ex A s Exception
MessageBox .Show ("串口設(shè)置失敗" + ex . Message , "提示", MessageBoxButtons .OK , Message-
BoxIcon .Warning)
End T ry End If
本文通過 XM L 文檔來保存串口設(shè)置的參數(shù) , 用于保存串口參數(shù)的 XM L 文檔命名為 XlComSet .xml , 具體格式如下 :
xml version ="1 .0"? > <ComSet >
<Com ComName ="COM1"Rate ="1200"Dat-aBit — 7 Parity — None StopBit — One ReceiveN ull —0 DataChar= Unicode ">
〈/Com>
< Count Date= '20101018 " Number - "2 ">
〈/Count>
〈/ComSet>
其中:
ComName為串口號(hào)、Rate為波特率、DataBit為數(shù)據(jù) 位、Parity為奇偶校驗(yàn)、StopBit為停止位、ReceiveNull為 是否接收空字符、DataChar為編碼方式。程序通過計(jì)時(shí) 器(Timer)與串口通信(SerialPort)組件配合讀取串口數(shù) 據(jù),經(jīng)測(cè)試Timer組件的時(shí)間間隔設(shè)置為600ms,并且串 口的接收方式為按字節(jié)接收數(shù)據(jù)時(shí),所接收的串口數(shù)據(jù)連 續(xù)可讀,且與表1所描述的數(shù)據(jù)格式一致。
2.2串口數(shù)據(jù)的接收
串口接收的字節(jié)數(shù)據(jù)保存在長(zhǎng)度為50的1維數(shù)組 中,當(dāng)數(shù)組長(zhǎng)度等于50時(shí),停止接收串口數(shù)據(jù),交給計(jì)時(shí) 器處理,在計(jì)時(shí)器事件中通過for循環(huán)在接收的數(shù)據(jù)中尋 找數(shù)字13 (ASCII碼對(duì)應(yīng)0D),找到后截取從OD開始的 第5到第10位,即重量數(shù)據(jù),再通過Chr函數(shù)將ASCII碼 轉(zhuǎn)換為字符型數(shù)據(jù),就可以得到正確的稱重?cái)?shù)據(jù)。具體處 理過程的順序如圖2所示。
根據(jù)圖3所示的過程處理順序,給出稱重?cái)?shù)據(jù)截取的 實(shí)現(xiàn)代碼。具體代碼如下:
Dim n As Integer
Dim Str(50) As Byte Dim Str1 (17) As Byte
Private Sub ComPort_ DataReceived (ByVal sender As Object,ByVal e As System. IO. Ports. SerialDataRe- ceivedEventArgs) Handles ComPort. DataReceived Dim Sy As Byte Sy = ComPort. ReadByte()
Str(n) = Sy n = n 十 1 If n > 50 Then n = 50 End If E nd Sub
Private Sub TimerCom_Tick (ByVal sender As Ob-ject 9 ByVal e As System. EventArgs ) Handles Timer-Com .Tick
txt Receive .Text = n =0
Dim i As Short For i = 0 To 50 IfStr(i) = 13 Then E xi t Fo r End If N ex t
Ifi< 30 Then
For j As Short = i 十 5 To i 十 10
txt Receive .Text += C hr ( St r (j))
N ex t End If E nd Su b
3汽車稱重窗體的設(shè)計(jì)思路
在稱重窗體中司鎊員首先選擇被稱重車輛的車牌號(hào) 碼,當(dāng)顯示重量的標(biāo)簽讀數(shù)穩(wěn)定不變時(shí),司鎊員點(diǎn)擊[接收 毛重]按鈕,讀取到的重量應(yīng)自動(dòng)減去車輛的皮重,從而得 出車輛凈重,并且鎊單編號(hào)應(yīng)根據(jù)當(dāng)前日期自動(dòng)加1,如 “2010一 10 — 10 — 001”。為保證鎊單編號(hào)的唯一性,因此 其中“001”應(yīng)在點(diǎn)擊打印按鈕之后自動(dòng)加1。當(dāng)司鎊員點(diǎn) 擊[接收皮重]按鈕,皮重Panel會(huì)被激活,皮重即空車重 量。點(diǎn)擊[保存]按鈕后,當(dāng)前讀取的重量應(yīng)替代之前保存 的皮重。具體操作方法應(yīng)如圖3所示。
4.結(jié)束語
本文所述的汽車衡的串口連續(xù)輸出數(shù)據(jù)的采集方法 已經(jīng)應(yīng)用于實(shí)踐當(dāng)中。經(jīng)實(shí)踐證明,本方法切實(shí)可行,讀 數(shù)穩(wěn)定可靠。本方法可以用于其他采用磅重?cái)?shù)據(jù)采集,也可以為采用涉及到串 口通信的項(xiàng)目提供一定的技術(shù)參考。