VS2005中SerialPort读到的数据有时候是反的?

51Crack 2008-06-24 10:47:09
对方发送的数据比如是" SA|DA20080624|TI104410| ",而我收到的是"|DA20080624|TI104410| SA",在超级终端中则正常!

接收代码如下:

Public strData as String
'
Public Sub OnDataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs)
Try
Invoke(New EventHandler(AddressOf GetData))
Catch ex As Exception
End Try
End Sub
'
Public Sub GetData(ByVal sender As System.Object, ByVal e As System.EventArgs)
Dim nums As Integer = Port1.BytesToRead
If nums > 0 Then
For i = 1 To nums
strData &= Chr(Port1.ReadChar)
Next
'处理数据...
End If
End Sub
...全文
215 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
llsus 2008-06-24
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 51Crack 的回复:]
引用 2 楼 llsus 的回复:
If nums > 0 Then
For i = 1 To nums
strData &= Chr(Port1.ReadChar)
Next
'处理数据...
End If

函数这样写是错的,如果在你接受的过程中还有新数据过来,就会出现有些字符反了,原因你还不明白吗?那我就解释给你听:
仅仅是举例:
假定你要发10个字符0,1,2...9 ,受到字符后产生事件,你处理的时候可能已经受到5个,01234,但是出一个个读取的,你本意是要读01234,当你…
[/Quote]

上面我也说了,应该是个队列,不会乱的,但事实上会乱,可能不是队列吧,具体我也不太清楚,没去研究。
51Crack 2008-06-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 llsus 的回复:]
If nums > 0 Then
For i = 1 To nums
strData &= Chr(Port1.ReadChar)
Next
'处理数据...
End If

函数这样写是错的,如果在你接受的过程中还有新数据过来,就会出现有些字符反了,原因你还不明白吗?那我就解释给你听:
仅仅是举例:
假定你要发10个字符0,1,2...9 ,受到字符后产生事件,你处理的时候可能已经受到5个,01234,但是出一个个读取的,你本意是要读01234,当你读到第三个的时候,又有数…
[/Quote]

不太明白读数据的顺序,为什么5,6来了,就不继续读3,4了?
llsus 2008-06-24
  • 打赏
  • 举报
回复
按道理串口接收缓冲区是个队列,不会发生这个情况,但是事实上有,自己写错也好,控件Bug也罢,自己控制好,就不会错的。
llsus 2008-06-24
  • 打赏
  • 举报
回复
其实你写的比较罗嗦,只要几句就可以了

Public Sub GetData(ByVal sender As System.Object, ByVal e As System.EventArgs)
If Port1.BytesToRead > 0 Then
For i As Integer = 1 To 5 '如果数据较多,多循环几次(延时长点时间)
System.Threading.Thread.Sleep(10)
Application.DoEvents()
Next
Dim strData As String = Port1.ReadExisting '一个一个字符读取在,再拼起来,就容易出现反的
'处理数据
End If
End Sub
llsus 2008-06-24
  • 打赏
  • 举报
回复
对于你这个问题,因为数据有限,当产生事件后,延时少许,在接受,就不会有问题,我给你修改下

Public Sub GetData(ByVal sender As System.Object, ByVal e As System.EventArgs)
Dim nums As Integer = Port1.BytesToRead
If nums > 0 Then
For i As Integer = 1 To 5 '如果数据较多,多循环几次(延时长点时间)
System.Threading.Thread.Sleep(10)
Application.DoEvents()
Next
Dim strData As String = Port1.ReadExisting
'nums = Port1.BytesToRead
'For i = 1 To nums
' strData &= Chr(Port1.ReadChar)
' Next '用你这个方法读取也可以
'处理数据...
End If
End Sub
kbryant 2008-06-24
  • 打赏
  • 举报
回复
进来学习了
llsus 2008-06-24
  • 打赏
  • 举报
回复
通讯肯定是有协议的,按协议去收,就不会出这个问题。要做到收发都有数。不要一个字节字节去收。
llsus 2008-06-24
  • 打赏
  • 举报
回复
If nums > 0 Then
For i = 1 To nums
strData &= Chr(Port1.ReadChar)
Next
'处理数据...
End If

函数这样写是错的,如果在你接受的过程中还有新数据过来,就会出现有些字符反了,原因你还不明白吗?那我就解释给你听:
仅仅是举例:
假定你要发10个字符0,1,2...9 ,受到字符后产生事件,你处理的时候可能已经受到5个,01234,但是出一个个读取的,你本意是要读01234,当你读到第三个的时候,又有数据56过来了,你就会读成01256 ,下面我不用说了吧?

神之泪花 2008-06-24
  • 打赏
  • 举报
回复
这个需不需要先序列化,然后再反序列化???
openext 2008-06-24
  • 打赏
  • 举报
回复
借楼主地方请教个问题,在用serialport编写串口程序,相同的代码在以计算机为平台的基础上收发都正常,但把代码放到pda下开发就会出现程序不相应的问题,请问各位碰到过类似情况没有,该注意什么?
CloneCenter 2008-06-24
  • 打赏
  • 举报
回复
ReadExisting在读取字符串的时候可能会存在问题,如果字符编码是unicode,则会产生乱码。因为有可能DataReceive事件产生的时候,数据还没有全部发送过来。这个时候如果读取数据,得到的就是不完整的。
最好的办法是读取为字符缓冲区,按字节读取,然后将字节数组内容按指定的编码转换为String。
51Crack 2008-06-24
  • 打赏
  • 举报
回复
3Q,我试试ReadExisting

16,555

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧