
vb与单片机通信问题
我用vb接收单片机上传的字符串“220210200”,想让Text1(0).Text中显示220,但是结果显示50050,哪位大侠帮忙分析一下,急!PrivateSubM...
我用vb接收单片机上传的字符串“220210200”,想让Text1(0).Text中显示220,但是结果显示50050,哪位大侠帮忙分析一下,急!
Private Sub MSComm1_OnComm()
On Error Resume Next
Dim var As String
Dim str() As Byte
Select Case MSComm1.CommEvent
Case comEvReceive
var = MSComm1.Input
str() = var
Text1(0).Text = str(0) & str(1) & str(2)
Text2(0).Text = Text1(0).Text / 2
Text3(0).Text = Text1(0).Text * Text2(0).Text / 1000
Text5(0).Text = Text2(0).Text / Text1(0).Text * 100
SaveData
End Select
End Sub 展开
Private Sub MSComm1_OnComm()
On Error Resume Next
Dim var As String
Dim str() As Byte
Select Case MSComm1.CommEvent
Case comEvReceive
var = MSComm1.Input
str() = var
Text1(0).Text = str(0) & str(1) & str(2)
Text2(0).Text = Text1(0).Text / 2
Text3(0).Text = Text1(0).Text * Text2(0).Text / 1000
Text5(0).Text = Text2(0).Text / Text1(0).Text * 100
SaveData
End Select
End Sub 展开
4个回答
展开全部
1 在打开串口前清空缓存;
2 接收数据后清空接收数据长度;
不过,还是建议你用接收每个字符,接收完一包数据后再
提取里面的字符串。
以前我做过的一个例子:ttp://z.baidu.com/question/125317000.html
这是根据你的要求实现的:增加了通讯超时再恢复后数据仍然保持正确。
Private Sub Form_Load()
MSComm1.Settings = "9600,n,8,2"
MSComm1.CommPort = 3
MSComm1.InputMode = comInputModeText
MSComm1.InputLen = 9
MSComm1.InBufferCount = 0
MSComm1.OutBufferCount = 0
MSComm1.RThreshold = 9
MSComm1.InBufferSize = 100
MSComm1.PortOpen = True
Timer1.Interval = 3000
Timer1.Enabled = MSComm1.PortOpen
End Sub
Private Sub MSComm1_OnComm()
On Error Resume Next
Dim var As String
Dim str() As Byte
Timer1.Enabled = False
Me.Cls
Select Case MSComm1.CommEvent
Case comEvReceive
var = MSComm1.Input
MSComm1.InBufferCount = 0
str() = var
Text1(0).Text = Left(var, 3) '& " " & Mid(var, 4, 3) & " " & Mid(var, 7, 3)
Text2(0).Text = Val(Text1(0).Text) / 2
Text3(0).Text = Text1(0).Text * Text2(0).Text / 1000
Text5(0).Text = Text2(0).Text / Text1(0).Text * 100
SaveData
Timer1.Enabled = True
End Select
End Sub
Private Sub Timer1_Timer()
Dim var As String
var = MSComm1.Input
MSComm1.InBufferCount = 0
Me.Cls
Me.Print "通讯错误!!!"
End Sub
2 接收数据后清空接收数据长度;
不过,还是建议你用接收每个字符,接收完一包数据后再
提取里面的字符串。
以前我做过的一个例子:ttp://z.baidu.com/question/125317000.html
这是根据你的要求实现的:增加了通讯超时再恢复后数据仍然保持正确。
Private Sub Form_Load()
MSComm1.Settings = "9600,n,8,2"
MSComm1.CommPort = 3
MSComm1.InputMode = comInputModeText
MSComm1.InputLen = 9
MSComm1.InBufferCount = 0
MSComm1.OutBufferCount = 0
MSComm1.RThreshold = 9
MSComm1.InBufferSize = 100
MSComm1.PortOpen = True
Timer1.Interval = 3000
Timer1.Enabled = MSComm1.PortOpen
End Sub
Private Sub MSComm1_OnComm()
On Error Resume Next
Dim var As String
Dim str() As Byte
Timer1.Enabled = False
Me.Cls
Select Case MSComm1.CommEvent
Case comEvReceive
var = MSComm1.Input
MSComm1.InBufferCount = 0
str() = var
Text1(0).Text = Left(var, 3) '& " " & Mid(var, 4, 3) & " " & Mid(var, 7, 3)
Text2(0).Text = Val(Text1(0).Text) / 2
Text3(0).Text = Text1(0).Text * Text2(0).Text / 1000
Text5(0).Text = Text2(0).Text / Text1(0).Text * 100
SaveData
Timer1.Enabled = True
End Select
End Sub
Private Sub Timer1_Timer()
Dim var As String
var = MSComm1.Input
MSComm1.InBufferCount = 0
Me.Cls
Me.Print "通讯错误!!!"
End Sub
展开全部
你这里 Text1(0).Text = str(0) & str(1) & str(2)
str(0) 获得的是传输过来的字符的ascii码
2 的ascii码 就是 50
还有,传输的是 多字节字符,所以 str(1) 的值 为0
你 可以 这样
Text1(0).Text = chr(str(0)) & chr(str(2)) & chr(str(4))
祝你顺利
str(0) 获得的是传输过来的字符的ascii码
2 的ascii码 就是 50
还有,传输的是 多字节字符,所以 str(1) 的值 为0
你 可以 这样
Text1(0).Text = chr(str(0)) & chr(str(2)) & chr(str(4))
祝你顺利
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
Dim RecvMsg() As Byte ' COM 中地内容
Dim Reclen As Integer '用来判断COM是否有内容
Private Sub MSComm1_OnComm()
On Error Resume Next
Select Case MSComm1.CommEvent
Case comEvReceive
Reclen = MSComm4.InBufferCount
ReDim RecvMsg(Reclen)
RecvMsg = MSComm4.Input
Dim i As Integer
在这段代码里最好加一个接受到特定字符就退出程序的判断
For i = 0 To UBound(RecvMsg)
If Len(Hex(RecvMsg(i))) = 1 Then
strData = strData & "0" & Hex(RecvMsg(i))
Else
strData = strData & Hex(RecvMsg(i))
End If
Next
End Select
End Sub
Dim Reclen As Integer '用来判断COM是否有内容
Private Sub MSComm1_OnComm()
On Error Resume Next
Select Case MSComm1.CommEvent
Case comEvReceive
Reclen = MSComm4.InBufferCount
ReDim RecvMsg(Reclen)
RecvMsg = MSComm4.Input
Dim i As Integer
在这段代码里最好加一个接受到特定字符就退出程序的判断
For i = 0 To UBound(RecvMsg)
If Len(Hex(RecvMsg(i))) = 1 Then
strData = strData & "0" & Hex(RecvMsg(i))
Else
strData = strData & Hex(RecvMsg(i))
End If
Next
End Select
End Sub
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
把:Text1(0).Text = str(0) & str(1) & str(2)
改为:Text1(0).Text = (str(0) - 48) & (str(2) - 48) & (str(4) - 48)
看看,注意str(0)是2的ASCII值50.
其实把 var = MSComm1.Input
str() = var
改为 str=MSComm1.Input 就直观多了。
改为:Text1(0).Text = (str(0) - 48) & (str(2) - 48) & (str(4) - 48)
看看,注意str(0)是2的ASCII值50.
其实把 var = MSComm1.Input
str() = var
改为 str=MSComm1.Input 就直观多了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询