C#串口数据接收问题 c#串口 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 串口本来也并不保证数据一定能够正常接收到它本身是利用电路的高低电平切换来实现通信的TCP协议底层封装好了校验的方法,如果数据出错,数据包会被丢弃而串口通信是一个字节一个字节发送,一个字节一个字节接收,并没有"包"的概念需要你自己制定协议来校验什么样算一组数据,同一组数据通过什么来检测它是否完整,是否有错误参考SUM校验,CRC校验,MODBUS RTU协议 comm.DiscardInBuffer(); //清空缓存,避免下次的数据相互干扰为什么要Discard,把这行去掉试试 比如串口线附近有个大电机启动了,一个强电磁干扰很可能使你的数据全部变成0xff 你用串口调试助手跟踪了多长时间发现没有问题?你的程序中不定时发生问题又是多长时间?不要以为串口调试助手1分钟没有问题,再过5小时就都不会有问题我用串口助手跟踪了8个小时,没有一个数据错误的,换自己的软件,过了一段时间就有几个错误,错误有时是连着的,有时不是,错误时间也没有规律,还有串口缓存中的数据是怎么存的,每次都会自动清空吗,还有我的串口控件comm的属性ReceivedBytesThreshol设置的是6(为了获取完整数据),跟这个有关系吗? 你用串口调试助手跟踪了多长时间发现没有问题?你的程序中不定时发生问题又是多长时间?不要以为串口调试助手1分钟没有问题,再过5小时就都不会有问题我用串口调试助手测了8个小时左右都没问题,但用自己的软件就会出错,但也测了7、8个小时,每秒读一次的话,总共有2、3万组数,大概有200个数据出错,出错有时是连着2、3个,有时间断,出错也没有规律,发送应该没问题,还有我comm控件的ReceivedBytesThreshol写的是6(为了保证读数完整性,默认为1的),可不可能是这个原因? 你用串口调试助手跟踪了多长时间发现没有问题?你的程序中不定时发生问题又是多长时间?不要以为串口调试助手1分钟没有问题,再过5小时就都不会有问题我用串口调试助手测了8个小时左右都没问题,但用自己的软件就会出错,但也测了7、8个小时,每秒读一次的话,总共有2、3万组数,大概有200个数据出错,出错有时是连着2、3个,有时间断,出错也没有规律,发送应该没问题,还有我comm控件的ReceivedBytesThreshol写的是6(为了保证读数完整性,默认为1的),可不可能是这个原因? 好久没来了,看到这个楼主写的那个接收方法明显有问题,comm.DiscardInBuffer(); 特别是用上了这个串口发送过来的数据,有时还在缓存区,如果没达到一定的长度是不会触发DataRevive事件 此时你把他清空了,就造成你上面说的200个数据出错。那是因为它也像TCPIP通信一样,在接收的缓存区 粘包。串口数据接收到的数据,下位机有时发送6个字符过来。你的上位机在DataRecive时不一定就是6个字符,有可能是分成两次接收,先接收到4个字符,第二次是2个字符。 这是时有发生的,也就是发生了你上面的问题了,你做这个,应写一个接收字节缓冲区,专门接收字节,也不用Sleep()看一下这个吧,http://blog.csdn.net/wyd1520/article/details/23822313这个也是为论坛另一网友跟你提的一样的问题写的。这是当时他提的原贴子http://bbs.csdn.net/topics/390316188 串口本来也并不保证数据一定能够正常接收到它本身是利用电路的高低电平切换来实现通信的TCP协议底层封装好了校验的方法,如果数据出错,数据包会被丢弃而串口通信是一个字节一个字节发送,一个字节一个字节接收,并没有"包"的概念需要你自己制定协议来校验什么样算一组数据,同一组数据通过什么来检测它是否完整,是否有错误参考SUM校验,CRC校验,MODBUS RTU协议 asp.net正则表达式匹配中文问题 问什么图片不再pictruebox上显示??? 请做过和了解软件技术支持这个职位的朋友帮个忙!谢谢 出现个问题,大虾们帮忙看看 如果一空格为分割符,将一个字符串分割城一个数组 BT下载:Visual Studio 2005 Enterprise Architect 分享一个简单的群聊程序 【求助】想用C#根据xls中的内容产出气泡聊天的图,求思路 怎么提高编程的速度? 我如何读取.resx资源文件? C#sleep暂停时间越来越小 32 bit Windows OS下windows进程的内存大小真的是2GB麽?
它本身是利用电路的高低电平切换来实现通信的
TCP协议底层封装好了校验的方法,如果数据出错,数据包会被丢弃
而串口通信是一个字节一个字节发送,一个字节一个字节接收,并没有"包"的概念
需要你自己制定协议来校验什么样算一组数据,同一组数据通过什么来检测它是否完整,是否有错误参考SUM校验,CRC校验,MODBUS RTU协议
为什么要Discard,把这行去掉试试
你的程序中不定时发生问题又是多长时间?
不要以为串口调试助手1分钟没有问题,再过5小时就都不会有问题我用串口助手跟踪了8个小时,没有一个数据错误的,换自己的软件,过了一段时间就有几个错误,错误有时是连着的,有时不是,错误时间也没有规律,还有串口缓存中的数据是怎么存的,每次都会自动清空吗,还有我的串口控件comm的属性ReceivedBytesThreshol设置的是6(为了获取完整数据),跟这个有关系吗?
你的程序中不定时发生问题又是多长时间?
不要以为串口调试助手1分钟没有问题,再过5小时就都不会有问题
我用串口调试助手测了8个小时左右都没问题,但用自己的软件就会出错,但也测了7、8个小时,每秒读一次的话,总共有2、3万组数,大概有200个数据出错,出错有时是连着2、3个,有时间断,出错也没有规律,发送应该没问题,还有我comm控件的ReceivedBytesThreshol写的是6(为了保证读数完整性,默认为1的),可不可能是这个原因?
你的程序中不定时发生问题又是多长时间?
不要以为串口调试助手1分钟没有问题,再过5小时就都不会有问题
我用串口调试助手测了8个小时左右都没问题,但用自己的软件就会出错,但也测了7、8个小时,每秒读一次的话,总共有2、3万组数,大概有200个数据出错,出错有时是连着2、3个,有时间断,出错也没有规律,发送应该没问题,还有我comm控件的ReceivedBytesThreshol写的是6(为了保证读数完整性,默认为1的),可不可能是这个原因?
好久没来了,看到这个楼主写的那个接收方法明显有问题,comm.DiscardInBuffer(); 特别是用上了这个
串口发送过来的数据,有时还在缓存区,如果没达到一定的长度是不会触发DataRevive事件 此时你把他清空了,就造成你上面说的200个数据出错。那是因为它也像TCPIP通信一样,在接收的缓存区 粘包。串口数据接收到的数据,下位机有时发送6个字符过来。你的上位机在DataRecive时不一定就是6个字符,有可能是分成两次接收,先接收到4个字符,第二次是2个字符。 这是时有发生的,也就是发生了你上面的问题了,你做这个,应写一个接收字节缓冲区,专门接收字节,也不用Sleep()看一下这个吧,http://blog.csdn.net/wyd1520/article/details/23822313
这个也是为论坛另一网友跟你提的一样的问题写的。这是当时他提的原贴子
http://bbs.csdn.net/topics/390316188
它本身是利用电路的高低电平切换来实现通信的
TCP协议底层封装好了校验的方法,如果数据出错,数据包会被丢弃
而串口通信是一个字节一个字节发送,一个字节一个字节接收,并没有"包"的概念
需要你自己制定协议来校验什么样算一组数据,同一组数据通过什么来检测它是否完整,是否有错误参考SUM校验,CRC校验,MODBUS RTU协议