| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1579 人关注过本帖
标题:SerialPort在传输时丢失数据--抱歉每分给大家散,请帮忙指点迷津
只看楼主 加入收藏
fionagao
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2008-7-1
收藏
 问题点数:0 回复次数:2 
SerialPort在传输时丢失数据--抱歉每分给大家散,请帮忙指点迷津
最近工作之余,在学习一些串口得知识,或许是基础太差了,总是碰到一些问题,解决不了。
  请教大家一下。
  在串口传送一些大得数组,总是会丢失一些数据,例如我发送一个02 01 00 00 00 00 00 00 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 23,当程序刚运行时,

第一次在接收端可以接收得数据02 01 00 00 00 00 00 00 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 23

第二次再发送同样得数组接收得就是02 01 00 00 00 00 00 00

第三次,第四次..再发送同样得数组接收得是00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 23 02 01 00 00 00 00 00 00
SerialPort1.ReceivedBytesThreshold 我也有设置过,但是还是总是丢失。
当发送一个02 01 02 00 00 00 00 00 01这样得数组就不会丢失数据。
发送端代码:
      
程序代码:
 Sub sendmessage()
        Dim i As Integer
        'Me.SerialPort1.DiscardInBuffer()
        If CheckBox2.Checked = True Then
            strHex = sendtxt.Text
            ReDim byteSEnd(Len(strHex) \ 3)
            For i = 1 To Len(strHex) Step 3
                byteSEnd((i - 2) / 3) = Val("&H" & Mid(strHex, i, 3))
            Next
            Me.SerialPort1.Write(byteSEnd, 0, byteSEnd.Length)
            readmessage()
        Else
            Me.SerialPort1.Write(sendtxt.Text)
            readmessage()
        End If
        If CheckBox1.Checked = True Then
            Timer1.Enabled = True
            Timer1.Interval = TextBox1.Text
        End If
    End Sub


接收端代码:
   
程序代码:
Sub readmessage()
        If CheckBox2.Checked = True Then
            Dim j As Integer
            Dim temp As String
            Dim mSize As Integer = Me.SerialPort1.BytesToRead
            ReDim receiveData(mSize - 1)
            Me.SerialPort1.Read(receiveData, 0, mSize)
            Me.SerialPort1.ReceivedBytesThreshold = 1000
            If mSize > 0 Then
                For j = 0 To UBound(receiveData)        ' 根据接收到的16进制数据长度,逐个字节显示
                    temp = Hex(receiveData(j))
                    If Len(temp) = 1 Then
                        temp = "0" & Hex(receiveData(j))
                    Else
                        temp = Hex(receiveData(j))
                    End If
                    Receivedtxt.Text = Me.Receivedtxt.Text + temp + " "
                Next j
            End If
        Else
            Receivedtxt.AppendText(Me.SerialPort1.ReadExisting)
            'System.Threading.Thread.Sleep(1000)
            Me.Receivedtxt.ScrollToCaret()

        End If
        Me.messagelab2.Text = "信息已传输完毕"
    End Sub

请大家支招,怎样避免在传送大数组时丢失数据,谢谢~~
搜索更多相关主题的帖子: SerialPort 传输 数据 
2009-09-25 08:21
fairy4
Rank: 4
等 级:贵宾
威 望:10
帖 子:738
专家分:267
注 册:2007-11-1
收藏
得分:0 

在 readmessage()前面加上     Application.DoEvents()
如果還不行的話,對數據進行格式化 增加發送完畢和字長標示 ,對數據進行校驗。如果是不正確的數據就要求重發。
參照TCP/IP傳送

一个人只有一个心脏,却有两个心房。一个住着快乐;一个住着悲伤。不要笑得太大声,不然会吵醒旁边的悲伤
2009-09-25 16:46
acaiwlj
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2009-10-1
收藏
得分:0 
由于串口的传递速度有所限制,所以建议你将ReceivedBytesThreshold 设为1
另外当你知道所要接收的数据的大小时,在接收到数据时先判断接收到的数据是否已经接收完成。这里可以用一个循环语句进行检测。
还有就是你应该给发送信息一定的时间不能一发送就进行接收。
2009-10-05 17:38
快速回复:SerialPort在传输时丢失数据--抱歉每分给大家散,请帮忙指点迷津
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028447 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved