明輝手游網(wǎng)中心:是一個免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

用VB調(diào)試串口通訊

[摘要]現(xiàn)有電子秤一臺,使用串口與計算機(jī)進(jìn)行通訊。編寫VB程序來訪問串口,達(dá)到讀取電子秤上顯示的數(shù)據(jù)。該電子秤為BE01型儀表,輸出為RS-232C標(biāo)準(zhǔn)接口,波特率為300-9600、偶校驗(yàn)、7個數(shù)據(jù)位、2...
現(xiàn)有電子秤一臺,使用串口與計算機(jī)進(jìn)行通訊。編寫VB程序來訪問串口,達(dá)到讀取電子秤上顯示的數(shù)據(jù)。該電子秤為BE01型儀表,輸出為RS-232C標(biāo)準(zhǔn)接口,波特率為300-9600、偶校驗(yàn)、7個數(shù)據(jù)位、2個停止位。所有字符均發(fā)送11位ASCII碼,一個起始位。在VB中與串口通訊需要引入控件MSComm串口通訊控件(在Microsoft Comm Control 6.0中)。具體程序如下:控件簡稱:MSC

Dim Out(12) As Byte   '接收var中的值

Dim var As Variant   '接收MSC.input中的數(shù)值

Dim nRece As Integer   '計算MSC.inputbuffer的個數(shù)

Dim i As Integer, j As Integer  '隨即變量,計算循環(huán)

****************************************************************************

Private Sub Form_Load()

    ClearText

    With MSC

        .CommPort = 1  '設(shè)置Com1為通信端口

        .Settings = "9600,E,7,2"  '設(shè)置通信端口參數(shù) 9600赫茲、偶校驗(yàn)、7個數(shù)據(jù)位、1個停止位.(這里需要進(jìn)一步說明的是:.Setting=”BBBB,P,D,S”。

含義是:B:Baud Rate(波特率);P:Parity(奇偶);D:Data Bit;S:Stop Bit)

        .InBufferSize = 40  '設(shè)置緩沖區(qū)接收數(shù)據(jù)為40字節(jié)

        .InputLen = 1  '設(shè)置Input一次從接收緩沖讀取字節(jié)數(shù)為1

        .RThreshold = 1  '設(shè)置接收一個字節(jié)就產(chǎn)生OnComm事件

    End With

End Sub

****************************************************************************

Private Sub ClearText()

    Text3.Text = ""

    Text2.Text = "5"

    Text1.Text = ""

End Sub



Private Sub Command1_Click()

    ClearText

'    nRece = 0  '計數(shù)器清零

    With MSC

        .InputMode = comInputModeBinary '設(shè)置數(shù)據(jù)接收模式為二進(jìn)制形式

        .InBufferCount = 0  '清除接收緩沖區(qū)

        If Not .PortOpen Then

            .PortOpen = True   '打開通信端口

        End If

    End With

End Sub

Private Sub MSC_OnComm()

    DelayTime   ‘用來延續(xù)時間

    ClearText

    With MSC

        Select Case .CommEvent  '判斷通信事件

            Case comEvReceive:  '收到Rthreshold個字節(jié)產(chǎn)生的接收事件

                SwichVar 1

                If Out(1) = 2 Then  '判斷是否為數(shù)據(jù)的開始標(biāo)志

                    .RThreshold = 0   '關(guān)閉OnComm事件接收

                End If

                Do

                    DoEvents

                Loop Until .InBufferCount >= 3  '循環(huán)等待接收緩沖區(qū)>=3個字節(jié)

'                nRece = nRece + 1

                For i = 2 To 12

                    SwichVar i

                    Text1.Text = Text1.Text & Chr(Out(i))

                Next

                Text1.Text = LTrim(Text1.Text)

                Text2.Text = Text2.Text & CStr(nRece)

                .RThreshold = 1  '打開MSComm事件接收

            Case Else

'                .PortOpen = False

        End Select

    End With

End Sub

****************************************************************************

Private Sub DelayTime()

    Dim bDT As Boolean

    Dim sPrevious As Single, sLast As Single

    

    bDT = True

    sPrevious = Timer  (Timer可以計算從子夜到現(xiàn)在所經(jīng)過的秒數(shù),在Microsoft Windows中,Timer函數(shù)可以返回一秒的小數(shù)部分)

    Do While bDT

        If Timer - sPrevious >= 0.3 Then bDT = False

    Loop

    bDT = True

End Sub

(通信傳輸速率為9600bps,則最快速度1.04ms發(fā)送一個字節(jié),儀表每秒發(fā)送50幀數(shù)據(jù),每幀數(shù)據(jù)有4個字節(jié),即每秒發(fā)送200個字節(jié),平均5.0ms 發(fā)送一個字節(jié),連續(xù)讀取串口數(shù)據(jù)時要在程序中添加循環(huán)等待程序)

Private Sub SwichVar(ByVal nNum As Integer)

    DelayTime

    var = Null

    var = MSC.Input

    Out(nNum) = var(0)

End Sub

(設(shè)置接收數(shù)據(jù)模式采用二進(jìn)制形式,即 InputMode=comInputModeBinary,但用Input屬性讀取數(shù)據(jù)時,不能直接賦值給 Byte 類型變量,只能通過先賦值給一個 Variant 類型變量,返回一個二進(jìn)制數(shù)據(jù)的數(shù)組,再轉(zhuǎn)換保存到Byte類型數(shù)變量中。)

Private Sub Text1_Change()

    Text3.Text = CText(Text1.Text) - CText(Text2.Text)

End Sub

****************************************************************************

Private Function CText(ByVal str As String) As Currency

    If str <> "" Then

        CText = CCur(Val(str))

    Else

        CText = 0

    End If

End Function

(儀表每秒發(fā)送50幀數(shù)據(jù),微機(jī)收到一幀完整數(shù)據(jù)至少需要20 ms時間,然后再進(jìn)行數(shù)據(jù)處理。如果微機(jī)在下一幀數(shù)據(jù)接收前即20ms內(nèi)能將數(shù)據(jù)計算處理完畢,則接收緩沖區(qū)內(nèi)只會保存有一幀數(shù)據(jù),不會存有兩幀以上數(shù)據(jù),接收緩沖區(qū)的大小不會影響實(shí)時監(jiān)測效果(接收緩沖區(qū)>4字節(jié)),這時完全可以實(shí)現(xiàn)實(shí)時監(jiān)測或?qū)崟r控制;如果微機(jī)在20ms內(nèi)不能將數(shù)據(jù)計算處理完畢,接收緩沖區(qū)設(shè)置得又很大,在數(shù)據(jù)計算處理完畢前,接收緩沖區(qū)內(nèi)就會保存有兩幀以上數(shù)據(jù),而且一次工作時間越長,緩沖區(qū)內(nèi)滯留數(shù)據(jù)幀就越多,數(shù)據(jù)采集和數(shù)據(jù)處理之間產(chǎn)生逐漸增大的額外時間差,當(dāng)接收緩沖區(qū)充滿后,時間差不再增大,固定在某一值,部分?jǐn)?shù)據(jù)因不能及時采集到接收緩沖區(qū)中,數(shù)據(jù)產(chǎn)生丟失現(xiàn)象,真實(shí)工作情況就會和微機(jī)處理結(jié)果產(chǎn)生較大的時間差,對實(shí)時監(jiān)測和實(shí)時控制很不利,這種情況下接收緩沖區(qū)的大小就會影響實(shí)時監(jiān)測效果,所以接收緩沖區(qū)設(shè)置不能過大,以保證數(shù)據(jù)處理的實(shí)時性。)

  小結(jié):本文所用的儀表為梅特勒公司出產(chǎn)的BE01型電子秤,其輸出的每個編碼均為標(biāo)準(zhǔn)的ASCII碼。其他的儀表存在發(fā)射的編碼中含有BCD壓縮碼,而且分為高低位,需要接收后對其進(jìn)行解碼換算,之后還要將高位和低位數(shù)字進(jìn)行相加,即可以將其BCD碼換算成實(shí)數(shù)。另還存在誤差的可能:判斷最大值,儀表在剛開始工作時有干擾,會傳導(dǎo)一些亂碼,位移傳感器有參數(shù)偏差,最大值一般都略大于50毫米,所以取51為極限最大值,。51為極限最小值。暫時先寫這些,當(dāng)然其他的情況可以依此類推!