C# 串口编程数据不完整以及处理大数据丢失数据的问题

学无止境ab 2013-12-07 04:23:09
我现在在用C#的串口 来和仪器通讯,但数据总是接收不完整(数据包的类型有很多种),该如何处理,还有就是仪器会实时的给我发数据,但通常会丢数据,网上说可以用多线程和数据池的方法解决,但看到不是很明白,有大神可以帮忙解决吗
...全文
706 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
瓦力2392 2013-12-24
  • 打赏
  • 举报
回复
试一试把上位机程序的串口的DTR和RTS打开,再看一下还有没有丢数据情况
本拉灯 2013-12-23
  • 打赏
  • 举报
回复
找找之前的贴子呀。。 http://bbs.csdn.net/topics/390316188 字节缓冲区。。请看50楼。。
学无止境ab 2013-12-23
  • 打赏
  • 举报
回复
忘了贴代码了,明天补上,模块已经做的差不多了,就是想把延时去掉,明天贴代码
leafmao 2013-12-19
  • 打赏
  • 举报
回复
代码又不肯贴,说数据丢失,让我们怎么猜。。。。 看看是不是数据传输太快,超出缓冲区的大小了
dai78 2013-12-18
  • 打赏
  • 举报
回复
引用 21 楼 youshoubian1 的回复:
[quote=引用 20 楼 djc7811 的回复:] 其实很简单地,只要在设置好缓冲区,然后响应触法事件,判断缓冲区没有新的数据增加了,就开始解析数据,估计你数据没有接收全就开始解析了
不同类型数据 长度不一样,[/quote] 晕,不是给你说了吗,判断缓冲区没有心的数据增加了,就读取并清空缓冲区,数据长度再长再短,类型再不一样哪有什么关系
学无止境ab 2013-12-18
  • 打赏
  • 举报
回复
引用 19 楼 leafmao 的回复:
[quote=引用 17 楼 youshoubian1 的回复:] [quote=引用 9 楼 leafmao 的回复:] [quote=引用 8 楼 youshoubian1 的回复:] [quote=引用 7 楼 yanping1988 的回复:] 加数据校验,对应你的协议,分段解析数据
我们没有校验,只有数据包头和包尾,而且某一种指令得到的数据长度一定的(有很多指令,数据长度不一),每次都我都是把数据放到ArrayList数组中,先找头,然后找尾,如果找到了,就去处理,但数据经常丢一两个字节,不知道是在加入ArrayList数组时出错,还是什么原因[/quote] 看看你是怎么接收数据并加到ArrayList里的[/quote]我是一个字节就触发事件,然后int count =serialport.read(buffer,0,bytestoread),然后dispose(buffer)[/quote] 得把buffer添加到ArrayList里,收到的每个字节都要加到ArrayList,然后去分析ArrayList[/quote] 是的,我也是这么做的,但数据就是会丢的
学无止境ab 2013-12-18
  • 打赏
  • 举报
回复
引用 20 楼 djc7811 的回复:
其实很简单地,只要在设置好缓冲区,然后响应触法事件,判断缓冲区没有新的数据增加了,就开始解析数据,估计你数据没有接收全就开始解析了
不同类型数据 长度不一样,
dai78 2013-12-18
  • 打赏
  • 举报
回复
其实很简单地,只要在设置好缓冲区,然后响应触法事件,判断缓冲区没有新的数据增加了,就开始解析数据,估计你数据没有接收全就开始解析了
leafmao 2013-12-18
  • 打赏
  • 举报
回复
引用 17 楼 youshoubian1 的回复:
[quote=引用 9 楼 leafmao 的回复:] [quote=引用 8 楼 youshoubian1 的回复:] [quote=引用 7 楼 yanping1988 的回复:] 加数据校验,对应你的协议,分段解析数据
我们没有校验,只有数据包头和包尾,而且某一种指令得到的数据长度一定的(有很多指令,数据长度不一),每次都我都是把数据放到ArrayList数组中,先找头,然后找尾,如果找到了,就去处理,但数据经常丢一两个字节,不知道是在加入ArrayList数组时出错,还是什么原因[/quote] 看看你是怎么接收数据并加到ArrayList里的[/quote]我是一个字节就触发事件,然后int count =serialport.read(buffer,0,bytestoread),然后dispose(buffer)[/quote] 得把buffer添加到ArrayList里,收到的每个字节都要加到ArrayList,然后去分析ArrayList
周美文 2013-12-17
  • 打赏
  • 举报
回复
引用 15 楼 youshoubian1 的回复:
[quote=引用 14 楼 zhoumeiwen 的回复:] 根据我推断,很有可能是发过来的数据(本来一包数据)你这边接收到分为两包或者多包了,所以,你可能还要多加一步:组包。
我是接过来后,放在arrlist中,然后判断,如果没达到要求,先是等待继续往arrlist中添加,最后如果数据不对,就会重发指令,目前经常会出现数据读不完,原因还在查找[/quote] 建议是定义一个大一点的byte数组,接收到数据就往里面写,然后你再到byte数组里面去查找和做一些处理,处理完一个完整包就把那部分从byte数组里面移除
学无止境ab 2013-12-16
  • 打赏
  • 举报
回复
引用 9 楼 leafmao 的回复:
[quote=引用 8 楼 youshoubian1 的回复:] [quote=引用 7 楼 yanping1988 的回复:] 加数据校验,对应你的协议,分段解析数据
我们没有校验,只有数据包头和包尾,而且某一种指令得到的数据长度一定的(有很多指令,数据长度不一),每次都我都是把数据放到ArrayList数组中,先找头,然后找尾,如果找到了,就去处理,但数据经常丢一两个字节,不知道是在加入ArrayList数组时出错,还是什么原因[/quote] 看看你是怎么接收数据并加到ArrayList里的[/quote]我是一个字节就触发事件,然后int count =serialport.read(buffer,0,bytestoread),然后dispose(buffer)
学无止境ab 2013-12-16
  • 打赏
  • 举报
回复
引用 11 楼 zhantianyou 的回复:
串口通讯,数据要一条一条发送。 也就是你客户端发到服务端时,最好有一条回应命令后,你客户端再发下一条命令。否则会出现过快,数据溢出。 还有,在循环发送这些数据时,是在线程里发送,每发一条,隔一点时间。100毫秒吧 我现在都是这样做的。从没出现问题
延时基本上可以解决问题,但数据量太大,延时会导致读取时间太长,
学无止境ab 2013-12-16
  • 打赏
  • 举报
回复
引用 14 楼 zhoumeiwen 的回复:
根据我推断,很有可能是发过来的数据(本来一包数据)你这边接收到分为两包或者多包了,所以,你可能还要多加一步:组包。
我是接过来后,放在arrlist中,然后判断,如果没达到要求,先是等待继续往arrlist中添加,最后如果数据不对,就会重发指令,目前经常会出现数据读不完,原因还在查找
周美文 2013-12-14
  • 打赏
  • 举报
回复
根据我推断,很有可能是发过来的数据(本来一包数据)你这边接收到分为两包或者多包了,所以,你可能还要多加一步:组包。
周美文 2013-12-14
  • 打赏
  • 举报
回复
建议你用别人已经做好的串口工具来接收数据看看,看它是否也出现丢包或者丢字节。
plato_yun 2013-12-13
  • 打赏
  • 举报
回复
我刚开始也是用的DataReceived事件和Threshold来设置阈值,但是DataReceived事件貌似是新开线程,我使用的总是会出现丢失字节的现象。后来我该用查询的方式,定个timer进行读取,读取里面的数据,判断数据。你可以试试
zhantianyou 2013-12-13
  • 打赏
  • 举报
回复
关于通讯这方面,如果没有好的机制,会出现堵包情况。
zhantianyou 2013-12-13
  • 打赏
  • 举报
回复
串口通讯,数据要一条一条发送。 也就是你客户端发到服务端时,最好有一条回应命令后,你客户端再发下一条命令。否则会出现过快,数据溢出。 还有,在循环发送这些数据时,是在线程里发送,每发一条,隔一点时间。100毫秒吧 我现在都是这样做的。从没出现问题
leafmao 2013-12-12
  • 打赏
  • 举报
回复
引用 8 楼 youshoubian1 的回复:
[quote=引用 7 楼 yanping1988 的回复:] 加数据校验,对应你的协议,分段解析数据
我们没有校验,只有数据包头和包尾,而且某一种指令得到的数据长度一定的(有很多指令,数据长度不一),每次都我都是把数据放到ArrayList数组中,先找头,然后找尾,如果找到了,就去处理,但数据经常丢一两个字节,不知道是在加入ArrayList数组时出错,还是什么原因[/quote] 看看你是怎么接收数据并加到ArrayList里的
学无止境ab 2013-12-12
  • 打赏
  • 举报
回复
引用 7 楼 yanping1988 的回复:
加数据校验,对应你的协议,分段解析数据
我们没有校验,只有数据包头和包尾,而且某一种指令得到的数据长度一定的(有很多指令,数据长度不一),每次都我都是把数据放到ArrayList数组中,先找头,然后找尾,如果找到了,就去处理,但数据经常丢一两个字节,不知道是在加入ArrayList数组时出错,还是什么原因
加载更多回复(7)

110,570

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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