通過串口助手讀的時候顯示資料正常,顯示為“01 02 03”
但用VB讀串口卻顯示亂碼 估計我VB程式寫的肯定有問題 。。 求各位幫忙!(波特率設定沒有錯,inputmode=0,=1都試了都亂碼)
Private Sub Form_Load()
MSComm1.CommPort = 3
MSComm1.Settings = "4800,n,8,1"
MSComm1.InputMode = 1
MSComm1.InputMode = comInputModeText
MSComm1.PortOpen = True
End Sub
Private Sub Timer1_Timer()
Dim buf$
buf = Trim(MSComm1.Input)
If Len(buf) <> 0 Then
Text1.Text = Text1.Text + Chr(13) + Chr(10) + buf
End If
End Sub
Private Sub cmdquit_click()
MSComm1.PortOpen = False
Unload Me
End Sub
uj5u.com熱心網友回復:
你讀到的是什么?試試:Text1.Text = Text1.Text & vbCrLf & buf
uj5u.com熱心網友回復:
是不是輸出資料 的進制問題uj5u.com熱心網友回復:
不行的話,再試試:Dim i As Long
If Len(buf) > 0 Then
Text1.Text = Text1.Text & Chr(13) & Chr(10)
For i = 0 To Len(buf) - 1
Text1.Text = Text1.Text & Right("0" & Hex(buf(i)), 2)
Next i
End If
uj5u.com熱心網友回復:
還是不行, 我用單片機給串口發的是一個百位數,比如說123,串口助手讀資料的話是顯示“00 7B 00”是123的十六進制顯示。
但是用VB讀串口,就是亂碼,具體表現是:串口里資料是300以下的,就什么也不顯示;是300以上的,就從9開始顯示,并遞增
uj5u.com熱心網友回復:
我用單片機給串口發的是一個百位數,比如說123,串口助手讀資料的話是顯示“00 7B 00”是123的十六進制顯示。
但是用VB讀串口,就是亂碼,具體表現是:串口里資料是300以下的,就什么也不顯示;是300以上的,就從9開始顯示,并遞增
uj5u.com熱心網友回復:
啊不對,應該說是:我用單片機給串口發的是一個百位數,比如說123,串口助手讀資料的話是顯示“00 7B 00”是123的十六進制顯示。
但是用VB讀串口,就是亂碼,具體表現是:串口里資料是300以下的,就什么也不顯示;是300以上的,就只顯示資料的個位數,十位和百位顯示空格
uj5u.com熱心網友回復:
Private Sub Form_Load()
MSComm1.CommPort = 3
MSComm1.Settings = "4800,n,8,1"
MSComm1.InputMode = 1
MSComm1.InputMode = comInputModeText
MSComm1.PortOpen = True
End Sub
Private Sub Timer1_Timer()
Dim buf() As Byte,I As Integer
buf = MSComm1.Input
Text1.Text=Text1.Text & vbCrlf
For I=0 to Ubound(buf)
Text1.Text = Text1.Text & right("0" & Hex(buf(i)),2) & Chr(32)
End If
Text1.Text=Text1.Text & vbCrlf
End Sub
Private Sub cmdquit_click()
MSComm1.PortOpen = False
Unload Me
End Sub
我改了Timer函式,運行一下,看下效果在說
uj5u.com熱心網友回復:
不是字串資料,你還用字串資料來接收,VB字串ascii碼大于127的都會變0的,要用陣列接收的uj5u.com熱心網友回復:
Private Sub Form_Load()
MSComm1.CommPort = 3
MSComm1.Settings = "4800,n,8,1"
MSComm1.InputMode = 1
MSComm1.InputMode = comInputModeText
MSComm1.PortOpen = True
End Sub
Private Sub Timer1_Timer()
Dim buf() As Byte,I As Integer
if MSComm1.InputLen>0 then
buf = MSComm1.Input
Text1.Text=Text1.Text & vbCrlf
For I=0 to Ubound(buf)
Text1.Text = Text1.Text & right("0" & Hex(buf(i)),2) & Chr(32)
Next
Text1.Text=Text1.Text & vbCrlf
end if
End Sub
Private Sub cmdquit_click()
MSComm1.PortOpen = False
Unload Me
End Sub
uj5u.com熱心網友回復:
你說的這個好像很有道理! 我起床了去試試!uj5u.com熱心網友回復:
這樣就 。。 啥都讀不到了QAQuj5u.com熱心網友回復:
用二進制方式接收Byte位元組流,再將接收的位元組資料一一轉換為2字符的十六進制字符拼接為能觀看的十六進制字串查看。uj5u.com熱心網友回復:
具體的接收代碼需要根據下位機與上位機通信協議及資料幀約定撰寫。uj5u.com熱心網友回復:
1 不要用定時器。照串口助手的方式來寫接收代碼。2 用二進制方式接收,接收快取變數也用 Byte 型。VB 字串有個毛病,當遇到大于 127 的值時會被系統置換為 "?"。
uj5u.com熱心網友回復:
我就是現在自己都有點搞不清楚我發送的資料型別了uj5u.com熱心網友回復:
還可以用串口助手的方式寫代碼啊 (′?_?`)我不太會VB……
uj5u.com熱心網友回復:
凡出現亂碼的字串,肯定應該以二進制方式接收。
uj5u.com熱心網友回復:
對電腦而言沒有亂碼,只有二進制位元組;對人腦才有亂碼。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8Auj5u.com熱心網友回復:
僅供參考:Dim iBuf() As Byte
Dim bt As Long
bt = bytesTotal
' 收當前流
ReDim iBuf(bt - 1)
tcpRTB.GetData iBuf
' log每個收到的位元組
' i = 0
' lnx = "RTB-->BYTE:" + Right("0000000" + Hex(i), 8) + "-"
' For i = 0 To bt - 1
' lnx = lnx + " " + Right("0" + Hex(iBuf(i)), 2)
' If i Mod 16 = 15 Then
' LogRX lnx
' lnx = "RTB-->BYTE:" + Right("0000000" + Hex(i + 1), 8) + "-"
' End If
' Next
' i = bt - 1
' If i Mod 16 <> 15 Then
' LogRX lnx
' End If
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/59426.html
上一篇:仿QQ表單收縮功能
下一篇:VB6做聊天系統出錯
