VB 串口编程 开发心得
接触vb的串口控件也有一段时间了
经常被它弄得晕头转向
最重要的是死机 死机 死机
其實關鍵在於 寫好接收函數
现将自己的经验写下来供大家参考
1,下位機中單片機控制的232晶片,在上電後會自動發送FF FEFC 00 01 03等隨機通信數據給電腦串口 ,如果不處理好,在上電時就會出現數據異常或通信錯誤 2,vb編程時儘量不要使定時器和串口中斷會同時發生的情況出現 3,通信中儘量使用協議,自定義的協議或標準協議,例如接收超時的規定
Vb中對串口的操作無非就是 設置串口屬性,讀取串口屬性,讀取串口數據,發送數據 流程為:設置埠號—設置通信模式,串列傳輸速率,閥值等---清空緩衝區數據----打開串口 下麵一一介紹 讀取,設置串口屬性
設置串口: PrivateFunction com1_init(com_no As Byte) OnError GoTo err IfMSComm1.PortOpen = True Then MSComm1.PortOpen = False MSComm1.CommPort= com_no IfMSComm1.PortOpen = False Then MSComm1.Settings ="9600,n,8,1" MSComm1.RThreshold = 1 '******核心語句,去掉則無法觸發,來一個字節數據就中斷 'MSComm1.SThreshold = 1 '發送緩衝區中允許的最小字元數觸發 MSComm1.OutBufferSize = 10 ‘發送緩衝區大小字節 MSComm1.InBufferSize = 10 ‘發送緩衝區大小字節 MSComm1.InputLen = 1 '每次從緩衝區讀取數據的字節數 MSComm1.InputMode =comInputModeBinary '二進制模式 'MSComm1.InputMode =comInputModeText ‘文本模式 MSComm1.InBufferCount = 0 '清空接收緩衝區數據 MSComm1.PortOpen = True '打開串口 EndIf ExitFunction err: MsgBox"串口打開失敗" EndFunction
接收,發送數據(1)兩種模式下的數據收發
1------------------------------二進制模式:以二進制模式收發,比如發送0XFE 注:發送時使用數組發送
MSComm1.InputMode= comInputModeBinary '二進制模式 發送數據函數 Dim cc(0) As Byte cc(0) = mydata MSComm1.Output = cc 接收數據函數(接收一個字節的數據,也就是說來的數只有8位) MSComm1.InputLen= 1 每次从缓冲区讀出來1個數(8位為一個,也可以自己定義接收多個) Private Sub MSComm1_OnComm() Dim Instring As Byte On Error GoTo err Select Case MSComm3.CommEvent CasecomEvReceive DimInByte,i As Integer InByte = MSComm3.Input Fori = 0 To UBound(InByte) Instring = Instring & (InByte(i)) Next End Select End Sub 接收函數(一次接收多個字節的這樣寫) MSComm1.InputLen= 0 每次从缓冲区讀出來所有數據 Dim counter As Byte counter = MSComm1.InBufferCount If counter > 0 Then DimReceiveArr() As Byte Dimj,Instring As Integer ReceiveArr = MSComm1.Input ‘把得到的數據放在一個數組中
Forj = 0 To (counter - 1) Instring = ReceiveArr(j) ‘循環查看得到的每一個數 IfVal(Instring) = 1 Then Text1.Text = Text1.Text + "ok " Nextj Else End If 2------------------------文本模式:發送和接收的都是ascii形式的字串,比如我可以發送’S’給output
'MSComm1.InputMode= comInputModeText ‘文本模式 MSComm1.InputLen= 0 每次接收緩衝區的所有字符串 發送函數dim outstring as string MSComm1.Input= outstring 接收函數 Private Sub MSComm1_OnComm() Dim Instring ‘也可以定義成string類型 On Error GoTo err Select Case MSComm1.CommEvent Case comEvReceive Instring = MSComm1.Input End Select err: End Sub (2) 接收數據的方法(重要)
大於255的數,小數,modbus通信,回車換行 大於255的數 Option Explicit Private Declare Sub CopyMemory Lib "kernel32" Alias"RtlMoveMemory" (Destination As Any,Source As Any,ByVal Length AsLong) Private Sub Form_Load() MSComm1.Settings = "9600,1" MSComm1.PortOpen = True Text1 = 256 End Sub Private Sub Command1_Click() Dim a As Integer a = Val(Text1) Dim buffer(1) As Byte CopyMemory buffer(0),a,2 '獲得Byte陣列,低位元組在前,高位元組在後 MSComm1.Output = buffer End Sub 小數 用多位數據來表示 modbus通信 起始位停止位 奇數偶數校驗都可以設置 Crc程式代碼 Dim CRC_HiByte As Byte,CRC_LowByte As Byte Private FunctionCRC16(ByRef cmdstring() As Byte,ByVal j As Integer) Dim data As Integer Dim I As Integer Addressreg_crc = &HFFFF For I = 0 To j Addressreg_crc = Addressreg_crcXor cmdstring(I) For j = 0 To 7 data = Addressreg_crcAnd &H1 If data Then Addressreg_crc= Int(Addressreg_crc / 2) Addressreg_crc= Addressreg_crc And &H7FFF Addressreg_crc= Addressreg_crc Xor &HA001 Else Addressreg_crc= Addressreg_crc / 2 Addressreg_crc= Addressreg_crc And &H7FFF End If Next j Next I
If Addressreg_crc < 0 Then Addressreg_crc = Addressreg_crc -&HFFFF0000 End If
CRC_HiByte = Addressreg_crc And&HFF CRC_LowByte = (Addressreg_crc And&HFF00) / &H100 End Function Private SubCommand1_Click() Dim mydat(2) As Byte mydat(0) = &H1 mydat(1) = &HF0 Call CRC16(mydat(),2) Text1.Text =Hex(CRC_HiByte) Text2.Text =Hex(CRC_LowByte) MsgBox " changok!!" End Sub 回車換行 回車vbcr 回車換行vbcrlf
Dim i,j As Integer
j = 1 For i = 1 To 16 MSComm1.CommPort = i On Error Resume Next MSComm1.PortOpen = True If err.Number = 0 Then Text1.Text = Text1.Text & "COM" & i & vbCr & vbLf j = j + 1 'this port i can be use MSComm1.PortOpen = False Else MSComm1.PortOpen = False End If Next i Text1.Text = "總共發現" & j - 1 & "個串口:" & vbCr & vbLf & Text1.Text 串口數據一旦讀出來後緩衝區數據就沒有了 DimInstring Instring = MSComm1.Input 接收緩衝區的長度值一旦讀取也會變成0 Dim counter As Byte counter = MSComm1.InBufferCount
錯誤,提示,規範 錯誤用gotoerr來處理 用提示來監控程式咝械臓顟B 規範:代碼規範,注釋規範,文檔規範,軟件發佈協議等
1,中斷嵌套 2,死循環 3,硬體問題 4,緩衝區耗盡(接收緩衝區的數據如果一直纍計將逐漸耗盡內存,所以盡可能快的讀取串口發來的數據)
專注的力量--專注於嵌入式軟件開發 轉載請注明出處
如有錯誤的地方歡迎指正 wenzerzhang@gmail.com (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |