这是小弟写的一个简单的串口接受一串16进制数的程序
其中在属性栏设置settings=19200,n,8,1;RThreshold=1;SThreshold=1
InputLen=0;InputMode=1Private Sub MSComm1_OnComm()
Dim wyh As String
Dim buffer As Variant
Dim i As Integer
Select Case MSComm1.CommEvent
Case comEvCD
Case comEvCTS
Case comEvDSR
Case comEvRing
Case comEvReceive
buffer = MSComm1.Input
For i = LBound(buffer) To UBound(buffer)
If Len(Hex(buffer(i))) = 1 Then
Text1.Text = Text1.Text & "0" & Hex(buffer(i)) & Chr(32)
Else
Text1.Text = Text1.Text & Hex(buffer(i)) & Chr(32)
End If
Next i
wyh = Text1.Text
Case comEvSend
End Select
MSComm1.OutBufferCount = 0
MSComm1.InBufferCount = 0
End Sub你用串口调试助手向串口输入一串16进制数看看(大于14个).1,全速运行,看结果 (正确)2,全速运行,并多次向串口发送数据(10次以上),看结果(第十次以前正确,以后发现只能收到前14个)3,单步运行,看结果 (正确)4,在监视窗口监视 mscomm1.input ,然后单步运行,看结果 (一个收不着)5,在 buffer = MSComm1.Input这条语句后面的任何语句上设置断点,然后运行,看结果 (发现只能收到前14个)以上5种情况出现的结果怎么这样?我的程序或设置哪有错么?求解!
其中在属性栏设置settings=19200,n,8,1;RThreshold=1;SThreshold=1
InputLen=0;InputMode=1Private Sub MSComm1_OnComm()
Dim wyh As String
Dim buffer As Variant
Dim i As Integer
Select Case MSComm1.CommEvent
Case comEvCD
Case comEvCTS
Case comEvDSR
Case comEvRing
Case comEvReceive
buffer = MSComm1.Input
For i = LBound(buffer) To UBound(buffer)
If Len(Hex(buffer(i))) = 1 Then
Text1.Text = Text1.Text & "0" & Hex(buffer(i)) & Chr(32)
Else
Text1.Text = Text1.Text & Hex(buffer(i)) & Chr(32)
End If
Next i
wyh = Text1.Text
Case comEvSend
End Select
MSComm1.OutBufferCount = 0
MSComm1.InBufferCount = 0
End Sub你用串口调试助手向串口输入一串16进制数看看(大于14个).1,全速运行,看结果 (正确)2,全速运行,并多次向串口发送数据(10次以上),看结果(第十次以前正确,以后发现只能收到前14个)3,单步运行,看结果 (正确)4,在监视窗口监视 mscomm1.input ,然后单步运行,看结果 (一个收不着)5,在 buffer = MSComm1.Input这条语句后面的任何语句上设置断点,然后运行,看结果 (发现只能收到前14个)以上5种情况出现的结果怎么这样?我的程序或设置哪有错么?求解!
MSComm1.OutBufferCount = 0
MSComm1.InBufferCount = 0
这两句我没有用过,但看字面应该是清空缓冲区的吧。
你设置的是串口收到一个字符即触发事件。
当串口接收事件被触发,你用 input接收时,这时对方发送过来的数据还没有完全到达,所以你用input只能收到一部分,你能收到14个,已经不错了,我这里有时一次能收到的更少。
而你通过input接收数据后,进行处理。在处理过程中,可能串口又收到了剩余的几个字符。
而你后面把缓冲区清掉了,当然就收不到了。
所以,去掉这两句,你可能一次发送的16个会在两次事件中收到。
MSComm1.OutBufferCount = 0
MSComm1.InBufferCount = 0
这两句是为了清空缓冲区的,如果不清空的话,确实是可以在第二次事件中收到
但我现在需要它一次收完,因为每次需要接收的字符不一样,我检测接收到的头几个字符从而判断到底是哪些用途!3楼的话,因为接收的16进制字符串未知,且是变化的,所以我也没法把它固定的!因此,我也不知道该如何办才好!
每次收到的东西都往这个字符串添加,然后查找里面是否存在起始和终止配对。
如果找到配对,则将其中间的字符串取出来,通过事件啊,其他方式发出来。
这样外面的程序收到这个字符串就是完整的。
我接收Sick的条码扫描器输出的条码就是这样处理的。如果没有开始和结束符,那就按楼上的这个办法了