用VB除錯串列埠通訊 (轉)

worldblog發表於2008-01-31
用VB除錯串列埠通訊 (轉)[@more@]

現有電子秤一臺,使用串列埠與進行通訊。編寫VB來訪問串列埠,達到讀取電子秤上顯示的資料。該電子秤為BE01型儀表,輸出為RS-232C標準介面,波特率為300-9600、偶校驗、7個資料位、2個停止位。所有字元均傳送11位ASCII碼,一個起始位。在VB中與串列埠通訊需要引入Mmm串列埠通訊控制元件(在 Comm Control 6.0中)。具體程式如下:控制元件簡稱:MSC

Dim Out(12) As Byte   '接收var中的值:namespace prefix = o ns = "urn:schemas-microsoft-com::office" />

Dim var As Variant   '接收MSC.input中的數值

Dim nRece As Integer   '計算MSC.inputbuffer的個數

Dim i As Integer, j As Integer  '隨即變數,計算迴圈

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

Private Sub Form_Load()

  ClearText

  With MSC

  .CommPort = 1  '設定Com1為通訊埠

  .Settings = "9600,E,7,2"  '設定通訊埠引數 9600赫茲、偶校驗、7個資料位、1個停止位.(這裡需要進一步說明的是:.Setting=”BBBB,P,D,S”。

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

  .InBufferSize = 40  '設定緩衝區接收資料為40位元組

  .InputLen = 1  '設定Input一次從接收緩衝讀取位元組數為1

  .RThreshold = 1  '設定接收一個位元組就產生OnComm事件

  End With

End Sub

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

Private Sub ClearText()

  Text3.Text = ""

  Text2.Text = "5"

  Text1.Text = ""

End Sub

 

Private Sub Command1_Click()

  ClearText

'  nRece = 0  '計數器清零

  With MSC

  .InputMode = comInputModeBinary '設定資料接收為二進位制形式

  .InBufferCount = 0  '清除接收緩衝區

  If Not .PortOpen Then

  .PortOpen = True   '開啟通訊埠

  End If

  End With

End Sub

Private Sub MSC_OnComm()

  DelayTime   ‘用來延續時間

  ClearText

  With MSC

  Case .CommEvent  '判斷通訊事件

  Case comEvReceive:  '收到Rthreshold個位元組產生的接收事件

  SwichVar 1

  If Out(1) = 2 Then  '判斷是否為資料的開始標誌

  .RThreshold = 0   '關閉OnComm事件接收

  End If

  Do

  DoEvents

  L Until .InBufferCount >= 3  '迴圈等待接收緩衝區>=3個位元組

'  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可以計算從子夜到現在所經過的秒數,在Microsoft 中,Timer可以返回一秒的小數部分)

  Do While bDT

  If Timer - sPrevious >= 0.3 Then bDT = False

  Loop

  bDT = True

End Sub

(通訊傳輸速率為9600bps,則最度1.04ms傳送一個位元組,儀表每秒傳送50幀資料,每幀資料有4個位元組,即每秒傳送200個位元組,平均5.0ms 傳送一個位元組,連續讀取串列埠資料時要在程式中新增迴圈等待程式)

Private Sub SwichVar(ByVal nNum As Integer)

  DelayTime

  var = Null

  var = MSC.Input

  Out(nNum) = var(0)

End Sub

(設定接收資料模式採用二進位制形式,即 InputMode=comInputModeBinary,但用Input屬性讀取資料時,不能直接賦值給 Byte 型別變數,只能透過先賦值給一個 Variant 型別變數,返回一個二進位制資料的陣列,再轉換儲存到Byte型別數變數中。)

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

(儀表每秒傳送50幀資料,微機收到一幀完整資料至少需要20 ms時間,然後再進行資料處理。如果微機在下一幀資料接收前即20ms內能將資料計算處理完畢,則接收緩衝區內只會儲存有一幀資料,不會存有兩幀以上資料,接收緩衝區的大小不會影響實時監測效果(接收緩衝區>4位元組),這時完全可以實現實時監測或實時控制;如果微機在20ms內不能將資料計算處理完畢,接收緩衝區設定得又很大,在資料計算處理完畢前,接收緩衝區內就會儲存有兩幀以上資料,而且一次工作時間越長,緩衝區內滯留資料幀就越多,資料採集和資料處理之間產生逐漸增大的額外時間差,當接收緩衝區充滿後,時間差不再增大,固定在某一值,部分資料因不能及時採集到接收緩衝區中,資料產生丟失現象,真實工作情況就會和微機處理結果產生較大的時間差,對實時監測和實時控制很不利,這種情況下接收緩衝區的大小就會影響實時監測效果,所以接收緩衝區設定不能過大,以保證資料處理的實時性。)

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


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-998950/,如需轉載,請註明出處,否則將追究法律責任。

相關文章