機電之家資源網(wǎng)
單片機首頁|單片機基礎(chǔ)|單片機應(yīng)用|單片機開發(fā)|單片機文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發(fā)
培訓(xùn)信息
贊助商
Visual Basic串口通訊調(diào)試方法
Visual Basic串口通訊調(diào)試方法
 更新時間:2008-7-27 13:57:52  點擊數(shù):4
【字體: 字體顏色
現(xiàn)有電子秤一臺,使用串口與計算機進行通訊。編寫VB程序來訪問串口,達到讀取電子秤上顯示的數(shù)據(jù)。該電子秤為BE01型儀表,輸出為RS-232C標準接口,波特率為300-9600、偶校驗、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赫茲、偶校驗、7個數(shù)據(jù)位、1個停止位.(這里需要進一步說明的是:.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ù)接收模式為二進制形式 
  .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ù)的開始標志 
    .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ù)模式采用二進制形式,即 InputMode=comInputModeBinary,但用Input屬性讀取數(shù)據(jù)時,不能直接賦值給 Byte 類型變量,只能通過先賦值給一個 Variant 類型變量,返回一個二進制數(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  

 。▋x表每秒發(fā)送50幀數(shù)據(jù),微機收到一幀完整數(shù)據(jù)至少需要20 ms時間,然后再進行數(shù)據(jù)處理。如果微機在下一幀數(shù)據(jù)接收前即20ms內(nèi)能將數(shù)據(jù)計算處理完畢,則接收緩沖區(qū)內(nèi)只會保存有一幀數(shù)據(jù),不會存有兩幀以上數(shù)據(jù),接收緩沖區(qū)的大小不會影響實時監(jiān)測效果(接收緩沖區(qū)>4字節(jié)),這時完全可以實現(xiàn)實時監(jiān)測或?qū)崟r控制;如果微機在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)生逐漸增大的額外時間差,當接收緩沖區(qū)充滿后,時間差不再增大,固定在某一值,部分數(shù)據(jù)因不能及時采集到接收緩沖區(qū)中,數(shù)據(jù)產(chǎn)生丟失現(xiàn)象,真實工作情況就會和微機處理結(jié)果產(chǎn)生較大的時間差,對實時監(jiān)測和實時控制很不利,這種情況下接收緩沖區(qū)的大小就會影響實時監(jiān)測效果,所以接收緩沖區(qū)設(shè)置不能過大,以保證數(shù)據(jù)處理的實時性。) 小結(jié):本文所用的儀表為梅特勒公司出產(chǎn)的BE01型電子秤,其輸出的每個編碼均為標準的ASCII碼。其他的儀表存在發(fā)射的編碼中含有BCD壓縮碼,而且分為高低位,需要接收后對其進行解碼換算,之后還要將高位和低位數(shù)字進行相加,即可以將其BCD碼換算成實數(shù)。另還存在誤差的可能:判斷最大值,儀表在剛開始工作時有干擾,會傳導(dǎo)一些亂碼,位移傳感器有參數(shù)偏差,最大值一般都略大于50毫米,所以取51為極限最大值,取-51為極限最小值。暫時先寫這些,當然其他的情況可以依此類推
  • 上一篇: 8X8 LED點陣顯示技術(shù) 8X8 LED點陣顯示技術(shù)
  • 下一篇: 基于AT89C51的多功能數(shù)字鐘課程設(shè)計
  • 發(fā)表評論   告訴好友   打印此文  收藏此頁  關(guān)閉窗口  返回頂部
    熱點文章
     
    推薦文章
     
    相關(guān)文章
    網(wǎng)友評論:(只顯示最新5條。)
    關(guān)于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機電之家 | 會員助手 | 免費鏈接

    點擊這里給我發(fā)消息66821730(技術(shù)支持)點擊這里給我發(fā)消息66821730(廣告投放) 點擊這里給我發(fā)消息41031197(編輯) 點擊這里給我發(fā)消息58733127(審核)
    本站提供的機電設(shè)備,機電供求等信息由機電企業(yè)自行提供,該企業(yè)負責信息內(nèi)容的真實性、準確性和合法性。
    機電之家對此不承擔任何保證責任,有侵犯您利益的地方請聯(lián)系機電之家,機電之家將及時作出處理。
    Copyright 2007 機電之家 Inc All Rights Reserved.機電之家-由機電一體化網(wǎng)更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術(shù)支持

    主辦:杭州市高新區(qū)(濱江)機電一體化學會
    中國行業(yè)電子商務(wù)100強網(wǎng)站

    網(wǎng)站經(jīng)營許可證:浙B2-20080178-1