




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、MSComm控件在中文Windows下的通信問題與處理方法摘 要VB 5.0/6.0的MSComm通信控件提供了一系列標準通信命令的接口,它允許建立串口連接,但在實際通信軟件設計過程中,MSComm控件并非像想像中那樣完美和容易控制,特別是在中文Windows下通信時更會出現問題。本文就MSComm控件在實際應用中可能出現的問題以及編程技巧進行探討。關鍵詞 MsComm控件 串口通信 處理1.MSComm控件的基礎理論一般說來,計算機都有一個或多個串行端口,它們依次為Com1、Com2、.。這些串口還提供了外部設備與PC進行數據傳輸和通信的通道,這些串口在CPU和外設之間充當解釋器的角色。當字
2、符數據從CPU發送給外設時,這些字符數據將被轉換成串行比特流數據;當接收數據時,比特流數據被轉換為字符數據傳遞給CPU。再進一步說,在操作系統方面,Windows用通信驅動程序(COMM.DRV)調用API函數發送和接收數據。當用通信控件或聲明調用API函數時,它們由COMM.DRV解釋并傳遞給設備驅動程序。作為一個VB程序員,要編寫通信程序,只需知道通信控件提供給Windows通信API函數的接口即可,換句話說,只需設定和監視通信控件的屬性和事件即可。2.利用MSComm控件進行數據的接收和發送搞清楚以上基本屬性和事件后就可以開始編寫通信程序了:在VB 5.0/6.0中新建一個工程文件,添加
3、Microsoft Comm control 5.0組件,在窗體Form1中加入Command命令按鈕并取名為cmdTest,MSComm控件取名為MSComm1,寫入以下代碼:Private Sub cmdTest_Click() MSComm1.CommPort = 1 '設定Com1口 If MSComm1.PortOpen = False Then MSComm1.Settings = "9600,N,8,1" '9600波特率,無校驗,8位數據位,1位停止位 MSComm1.PortOpen = True '打開串口 End If MSCo
4、mm1.OutBufferCount = 0 '清空發送緩沖區 MSComm1.InBufferCount = 0 '清空接收緩沖區 '發送字符數據,注意必須用回車符(vbCr)結束 MSComm1.Output="This is a good book!" & vbCr '撥打電話號碼或發送AT命令 MSComm1.Output="ATDT 0294563622" & vbCr '發送字符數組數據,注意ByteArray必須事先定義賦值 Dim ByteArray as byte(
5、) '定義動態數組 ReDim ByteArray(1) '重定義數組大小 ByteArray(0)=0 ByteArray(1)=1 MSComm1.Output = ByteArray '發送字符數組數據 End Sub Private Sub MSComm1_OnComm() Select Case MSComm1.CommEvent Case comEvReceive '接收字符數據 Dim Buffer As Variant MSComm1.InputLen = 0 '當InputMode 屬性值為0(文本模式)時,變量中含String型數據。
6、'當InputMode屬性值為1(二進制模式)時,變量中含Byte型數組數據。 MSComm1.InputMode=comInputModeBinary Buffer=MSComm1.Input '接收二進制數據 MSComm1.InputMode=comInputModeText Buffer = MSComm1.Input Case else End Select End Sub 3.中文Windows下的通信問題與解決方法 3.1 接收的數據少于發送的數據 如果通過MSComm控件一次性傳送較多的二進制數據,那么,很可能收到的數據不足。例如在設置為2400bps傳輸率的情
7、況下,一次性可以傳輸2048個字符數據,那么在大多數情況下一次只能收到1200個字符左右,這是因為新版的MSComm32.OCX中存在一個影響傳輸二進制數據的Bug。 32位Windows API函數使用了幾個用COMMTIMEOUTS結構表示的限時變量,WriteTotalTimeOutConstant即是其中的一個,它被Windows內部設定為5000(即5秒),這個常量決定了在通信驅動程序停止傳輸之前花費在發送緩沖區中數據的時間的長短。5秒鐘意味著通信速度為1200bps情況下僅能發送600個字符,2400bps情況下僅能發送1200個左右的字符。事實上,在一個緩沖區內一次性發送更多的數
8、據是非常可能的。VB 5.0/6.0版本的MSComm控件有一個新增的重要的屬性稱為CommID,CommID指的是當串口被打開時,被API所調用的串口句柄(或標志),這也意味著能利用API接口函數去修改這個常量。每次串口關閉后,Windows會自動將之恢復為5000,所以,每次打開串口后需要重新設定。以下是API聲明代碼: Type COMMTIMEOUTS ReadIntervalTimeout As LongReadTotalTimeoutMultiplier As Long ReadTotalTimeoutConstant As Long WriteTotalTimeoutMultip
9、lier As Long WriteTotalTimeoutConstant As Long End Type Declare Function SetCommTimeouts Lib "Kernel32" (ByVal h Long , _lpCommTimeouts As COMMTIMEOUTS) As Long Declare Function GetCommTimeouts Lib "Kernel32" (ByVal h Long , _lpCommTimeouts As COMMTIMEOUTS) As Long Dim timeouts A
10、s COMMTIMEOUTS Dim Ret As Long If Comm1.PortOpen = False Then Comm1.PortOpen = True End If '打開串口后重新設定串口句柄 Ret=GetCommTimeouts(Comm1.CommID,timeouts) 'Set some default timeouts timeouts.ReadIntervalTimeout = 1 timeouts.ReadTotalTimeoutMultiplier = 1 timeouts.ReadTotalTimeoutConstant = 1 timeo
11、uts.WriteTotalTimeoutMultiplier = 1 timeouts.WriteTotalTimeoutConstant=(Comm1.OutBufferSize Val(Comm1.Settings)*10000+1000 Ret=SetCommTimeouts(Comm1.CommID,timeouts) 3.2 如何發送大于128的字符數據 在通信程序中,以單字符方式逐個發送數據時,每一個數據范圍為0-255(即十六進制的00-FF)。在單字符版本的英文Windows或DOS版的BASIC程序中,只需要將相應的數據轉換成相應的字符發送到通信端口即可。但在中文Windo
12、ws下卻行不通,假設在中文Windows下運行以下程序: Dim i as Integer For i = 0 To 255 MSComm1.Output = chr(i) Next i希望在接收端得到預期的0-255之間的數據,結果卻是:前129個數據接收正確,為0-128,后面127個數據為126個0和一個255。造成這種結果的原因在于中文Windows使用的是雙字節字符集(DBCS)系統。DBCS系統使用0-128之間的數字表示ASCII字符,大于128的數字僅作為前導字符,它只是顯示是一個非拉丁語系的字符,而并不代表實際意義。上述程序在調用CHR()函數時用到了DBCS字符集,因此產生
13、了此類錯誤。那么,如何發送大于128的數據呢?答案是使用字節數組,將以上程序改為: Dim MyData(255) As Byte For i = 0 To 255 MyData(i) = i Next i MSComm1.Output = MyData Do DoEvents Loop Until MSComm1.OutBufferCount = 0 '接收過程 Private Sub MSComm1_OnComm() Select Case MSComm1.CommEvent Case comEvReceive Dim Buffer As Variant MSComm1.Input
14、Mode = comInputModeBinary MSComm1.InputLen = 0 Buffer = MSComm1.Input For i=LBound(Buffer) To UBound(Buffer) Text1.Text= Buffer(i); Next i Case ElseEnd Select End Sub3.3 如何發送中文字符串VB 5.0/6.0中可以直接把中文字符等同于英文字符發送,如:MSComm1.output="現在發送中文數據!",但這種方法發送的中文數據不能太長,發送緩沖區和接收緩沖區的大小需設定為中文字符的兩倍以上,而且發送與接收
15、系統所處的操作系統版本最好要一致,否則會出現接收或發送緩沖區溢出之類的錯誤。這種方法可用于一般要求不太高的場合。除了上述方法外,還可以采用間接方式發送中文字符串。在發送端將漢字或字符轉換為機器內碼或區位碼數據數組,然后將轉換后的數據發送到串口,在接收端接收到數據后,按照相反的順序將得到的數據轉換為相應的漢字或字符。在轉換過程中,要用到位運算,如取得漢字的內碼后需要將高字節和低字節分開,而VB 5.0/6.0中并沒有提供此類函數,以下是求整數高、低字節的函數。 Public Function HiByte(a As Integer) Dim b As Integer b = a And &
16、;amp;HFF00 b = b / 256 If b < 0 Then b = b + 256 HiByte = b End Function Public Function LowByte(a As Integer) Dim b As Integer b = a And &HFF LowByte = b End Function 3.4如何在通信過程中進行延時 在某些通信過程中,常常需要在發送完一組數據后進行一段延時,以等待對方處理上組數據,以下是延時函數代碼。 Public Sub Delay(PauseTime As Single) Dim Start Start = Timer '設定開始時間 Do While Timer < Start + PauseTime DoEvents Loop End Sub 4.結束語隨著計算機應用領域的不斷擴展,計算機之間的遠程通信用得也越來越廣泛。作為RAD開發工具代表的Visual Basic同樣提供了一系列標準通信命令的接口,它允
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 工業園區綠色制造與節能減排技術
- 工業廢棄地生態修復與再利用
- 工業廢水處理技術進展及政策解讀
- 工業安全防護與自動化技術的融合
- 工業機器人技術的應用與發展
- 工業污染防治與環境教育案例分析
- 工業自動化中的數據驅動決策技術
- 工業物聯網的實時數據傳輸與處理
- 工業機械設備的節能與環保改造
- 工業遺址改造為文創園區的策略
- 脫發介紹演示培訓課件
- 初中物理教材插圖原理集錦(回歸教材)
- 腸梗阻護理查房(小腸減壓管的應用)
- JGT266-2011 泡沫混凝土標準規范
- 2024屆遼寧省沈陽市東北育才校中考沖刺卷物理試題含解析
- 抗菌藥物合理應用
- 初中體育籃球雙手胸前傳接球教案
- 中建盤扣式落地卸料平臺施工方案
- 配電網技術標準(施工驗收分冊)
- 12英寸主要原輔材料消耗表
- 電力電子裝置-2021復習要點
評論
0/150
提交評論