我用mscomm1控制元件嘗試通過藍牙傳出串口(com3)讀取單片機資料
運行即提示實時錯誤8002:invalid port number
Private Sub Form_Load()
If MSComm1.PortOpen = True Then MSComm1.PortOpen = False ' 先判斷串口是否打開,如果打開則先關閉
MSComm1.CommPort = 3 ' 設定埠1
MSComm1.Settings = "115200, N,8,1" ' 設定波特率,偶校驗, 7位資料位,1位停止位
MSComm1.InBufferSize = 1024 ' 設定接識訓沖區為1024位元組
MSComm1.OutBufferSize = 4096 ' 設定發送緩沖區為4096位元組
MSComm1.InBufferCount = 0 ' 清空輸入緩沖區
MSComm1.OutBufferCount = 0 ' 清空輸出緩沖區
MSComm1.SThreshold = 1 ' 發送緩沖區空觸發發送事件
MSComm1.RThreshold = 1 ' 每X個字符到接識訓沖區引起觸發接收事件
MSComm1.OutBufferCount = 0 ' 清空發送緩沖區
MSComm1.InBufferCount = 0 ' 清空接識訓沖
MSComm1.PortOpen = True ' 打開串口
MSComm1.InputMode = comInputModeText
最奇怪在于用這個程式可以正常通過有線埠(com6)讀取單片機傳出資料,改成com3就不成了
而且用arduino的串口監視器可以正常讀取兩個埠(com6或com3)的資料
uj5u.com熱心網友回復:
資訊量不助于問題的分析invalid port number 無效的埠號
一般這個錯誤是在串口不存在的時候才會出來,
1) 那只能去確認運行的時候你串口是不是存在。
2) Intel 的ME也很喜歡用Com3,會不會有串口重疊的情況,實在不行設備管理器里去改一下串口號。
uj5u.com熱心網友回復:
arduino和串口助手都能讀所以串口肯定是存在的呀串口號也改過無數次并沒有成功……
所以我才很無奈啊T·T
uj5u.com熱心網友回復:
出問題的行在MSComm1.PortOpen = True
MSComm1.PortOpen總顯示為false
uj5u.com熱心網友回復:
試試不用串口控制元件,用api來操作uj5u.com熱心網友回復:
把其他連接串口的應用都關了。或者重啟機器試試。uj5u.com熱心網友回復:
請在設備管理其中查看有幾個COM口存在,存在的COM口號是多少。
uj5u.com熱心網友回復:

設備管理器中存在的COM口,VBMsComm控制元件必然能打開。
uj5u.com熱心網友回復:
' 鏈接串口
Private Sub Command3_Click()
Dim i As Integer, _
m_Port As Integer
m_Port = 0
On Error Resume Next
i = Int(Text1.Text) ' 串口號 1-255
MSComm1.PortOpen = False
If Err.number <> 0 Then
Err.Clear
End If
MSComm1.CommPort = i
MSComm1.Settings = "57600,N,8,1"
MSComm1.PortOpen = True
If Err.number <> 0 Then
Err.Clear
m_Port = 0
GoTo protError
End If
MSComm1.RThreshold = 1
MSComm1.SThreshold = 1
MSComm1.InputMode = comInputModeBinary
Shape1.BackColor = &HFFFF& ' 弄個鏈接成功提示色
Exit Sub
protError:
If m_Port = 0 Then
Shape1.BackColor = &HFF& ' 弄個鏈接失敗提示色
Exit Sub
End If
End Sub
' 串口接收資料事件處理程序
Private Sub MSComm1_OnComm()
Dim Bytes() As Byte, _
Size As Long, _
by_tmp As Byte, _
str_out As String, _
i As Long
On Error Resume Next
' 通過事件標志判斷是否接收資料
If MSComm1.CommEvent = comEvReceive Then
Bytes = MSComm1.Input '// 將資料接收到動態陣列中
Size = UBound(Bytes) '// 取得陣列最大邊界數
' 將接收到的資料一個一個位元組的進行識別處理,開始回圈陣列位元組
For i = 0 To Size
by_tmp = Bytes(i)
str_out = str_out & Right("0" & Hex(by_tmp), 2) & " "
'這里你可以一個位元組一個位元組的處理資訊
'......
next_data:
Next i
AddLog str_out
End If
End Sub
uj5u.com熱心網友回復:
設備管理器明顯的提示 Com1 Com6 為啥你還用 COM3?uj5u.com熱心網友回復:
i = Int(Text1.Text) ' 串口號 1-255Text1.text 要先用Val轉為數值 再說VB6串口號限制在 1-16
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/43600.html
標籤:控件
