9757|30

65

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

RS232串口大数据量通讯的问题 [复制链接]

大家好,现在再做一个串口通讯的程序,数据量比较大,通讯协议知道,已经能正常通讯,不过发现经常是数据收发一段时间之后会乱掉,就是没有按要求收发了,我这里面有校验的,校验不成功重新发送,最多允许重复十次,而且发现最后错的主要是一包数据没收完就结束了,也就是把一包数据按几包接受了,而且一旦错了很难纠正过来,但是每次我都又从新清零的,也就是每报数据的接收都是从头开始的,理论上说,错了下次应该就纠正过来了啊。
很着急,帮我出出主意吧,谢谢大家了

对了我的串口在数据收发的时候用的是轮询的方式,只要有数据就接收

最新回复

谢谢 那我再看一下while(1)中的代码,不过里面已经减到最小了,就是一个数据接收函数R(),中间是间接收到的数据验证处理代码的代码,最后一个数据发送函数T()。我再看看程序结构是不是还有什么问题,是不是哪里时间积累会导致接收错位  详情 回复 发表于 2010-6-25 09:43
点赞 关注

回复
举报

69

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
这个不太懂。建议你发到相应的编程板块区
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
你使用串口通讯来捕捉打印的话,一般数据量大是会出现接受不全或者乱码现象的。可以尝试加大波特率(需硬件支持)或者减少不必要的打印来实现,如循环打印让延时久一点
 
 
 

回复

89

帖子

0

TA的资源

一粒金砂(初级)

4
 
看错标题了,以为是在问串口的最大波特率,应该是115200
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

5
 
只有一个解释,你的纠错协议有问题,出现错误不能正确的纠正.
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用 2 楼 cbyibby 的回复:
你使用串口通讯来捕捉打印的话,一般数据量大是会出现接受不全或者乱码现象的。可以尝试加大波特率(需硬件支持)或者减少不必要的打印来实现,如循环打印让延时久一点


谢谢指点

不好意思,你说的捕捉打印是什么意思呢?
另外我的波特率现在已经是115200了,加不上去了
你说的循环打印时间又是什么意思呢,我现在的数据是一个一个接收的,接受的时候个数据之间没有延时(试过加延时,但效果不明显),你说的延时应该加在哪里呢?
谢谢啦
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

7
 
另外还有一点需要补充的就是我的串口初始化中有一个变量叫做“串口接收/发送定时器”,现在发现如果改变这个值的大小的时候,运行结果会有一些改变,但是也是接收几组之后就会接收不全或者乱码,大家知道这个量是用来干嘛的么
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

8
 
引用 4 楼 91program 的回复:
只有一个解释,你的纠错协议有问题,出现错误不能正确的纠正.


谢谢提醒,你说的纠错协议有问题是什么意思,能具体说一下么。
我现在是没接受到一包数据之后进行16bit和验证(协议要求,不可改),如果正确则DSP返回正确接收命令,上位机继续发送下一包数据;如果验证不正确,则DSP返回错误命令,上位机重新发送刚才那包数据;最多重复5次。不知道这样子做逻辑上有没有什么漏洞呢,大家帮我分析一下,谢谢了。
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

9
 
不懂,帮顶
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

10
 
没有办法保证一个数据包不会被分成几次接收,而且一次接收的数据也不一定都属于同一个数据包,所以需要修改你的通讯协议。要在数据包的头部,添加一个数据包长度字段,根据这个长度字段来确定包的结尾在哪里。
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

11
 
如果你的串口驱动性能不好,那么你校验也没有用,
建议修改串口驱动先。以前我的性能不行,现在性能上去了,校验也不用了。
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

12
 
1、估计和你的通信协议有关,这个可能性比较大,我们做串口测试通常就是好几天,偶尔会出错,但是会纠正过来
2、如果你通信距离比较长,可以尝试降低波特率
3、不排除干扰的可能性,改善试验环境,降波特率,加屏蔽
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

13
 
可增加流控
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

14
 
引用 9 楼 will_shao 的回复:
没有办法保证一个数据包不会被分成几次接收,而且一次接收的数据也不一定都属于同一个数据包,所以需要修改你的通讯协议。要在数据包的头部,添加一个数据包长度字段,根据这个长度字段来确定包的结尾在哪里。


现在的问题是这样的,首先通讯协议不可改(跟别人通讯,发送部分已确定),而且已确定该协议在现有硬件上是可以实现的;其次现在的协议中每包数据的开始确实有这包数据共多少个,但是现在的问题是不止是一包数据按几包着收了,还有就是可能丢数,就是收来的一包中数据不连续,某些数据没收进来,这个怎么回事呢。


我现在的做法是通过while(1)反复调用串口接收函数RX();只要接收缓冲区内有新数就接收,否则就跳出循环,收到的数先放到一个临时的数组中,等一包数据接收完毕之后再做处理,这样做可能会带来一个问题就是串口发送的时间和DSP接受的时间配合可能会出问题,但是现在调试的结果是,当我调到某些合适的值后,数据可以正常接收,在数据小于150KB的时候还可以,再大的时候就会乱掉,纠正不回来。
大家帮我分析一下可能是什么原因呢
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

15
 
引用 10 楼 gooogleman 的回复:
如果你的串口驱动性能不好,那么你校验也没有用,
建议修改串口驱动先。以前我的性能不行,现在性能上去了,校验也不用了。


谢谢您的建议,您这里所说的串口驱动性能是什么意思?硬件问题么?
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

16
 
引用 11 楼 eagle109 的回复:
1、估计和你的通信协议有关,这个可能性比较大,我们做串口测试通常就是好几天,偶尔会出错,但是会纠正过来
2、如果你通信距离比较长,可以尝试降低波特率
3、不排除干扰的可能性,改善试验环境,降波特率,加屏蔽


谢谢您的建议,我的程序是这样的,程序有两块:一块是上位机一个类似于串口调试助手的文件发送软件,另一个是DSP数据接收软件,这两块本来都是别人做的,在现有硬件上用起来很正常;由于某些原因,现在想把DSP部分自己做,替换掉以前别人做的那部分,上位机数据发送部分还用以前的那个,所以协议不可改,而且协议本身估计也没有太大问题,可能是我的程序结构有问题,或者对协议理解有问题。
不过通过我现在对协议的理解,我的DSP程序可以跟上位机连接起来,也可以进行正常的数据收发,只是连续收发好多数据之后会出问题,我一次可能需要发送2MB左右的数据,现在经常是前200KB基本正常,即使出错也能正常纠正过来,但在往后可能就出错了,最多的时候每包269个字节,连续发送了将近1MB字节才出的问题。
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

17
 
引用 15 楼 haoxuesheng1106 的回复:

引用 11 楼 eagle109 的回复:
1、估计和你的通信协议有关,这个可能性比较大,我们做串口测试通常就是好几天,偶尔会出错,但是会纠正过来
2、如果你通信距离比较长,可以尝试降低波特率
3、不排除干扰的可能性,改善试验环境,降波特率,加屏蔽


谢谢您的建议,我的程序是这样的,程序有两块:一块是上位机一个类似于串口调试助手的文件发送软件,另一个是DSP数据接收软件,这两块本来……


说实话,这样的问题,很难给你具体的建议
如果是原来的平台没有问题,而你自己做了之后出现问题,那么基本上就是你对协议的理解有问题,只有自己细心的检查程序和看协议了
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

18
 
我遇到了楼主同样的问题!但我是连续运行,有的4-8小时后死机,有的不死机,收发只是偶尔有乱码,调试半个月还没有彻底解决!
我的系统用在机器上,研华的WinCE主板PCM-4386,上位eVC应用程序自己写,下位用51兼容单片机VRS51L3174,硬件由本公司一个变态电子工程师做(无法沟通,一谈就是说别人的软件问题),程序我自己写。不同的机器出现的程度不一样。建议几条,希望楼主解决问题的同时,有助于解决我的问题。

1、停止位,80%的工程师都会出错,台湾研华的工程师做的驱动同样出错了。停止位错误设置时WINCE能成功(WINXP设置错误时不能成功),我的主板驱动出错情况是:停止位为1,驱动用的就是直接的数字1(应该用ONESTOP,对应的直接数字是0),你要注意使用与上位同样的停止位;
2、WINCE端收发缓冲不能清零(我的调试确实如此),有书本《Windows CE程序设计》(外国人写,北京大学出版)上说,WINCE设置缓冲大小的API函数SetupComm不是很有用(中文原文如此),实际上缓冲的情况由驱动决定;
3、WINCE端是半双工,即不支持重叠I/O,发的同时不能收,收的同时不能发;
4、楼主对协议没有理解错;
5、更多是驱动问题,上位程序不是楼主写,对驱动就更不了解了。


很遗憾,我不能查看更不可能修改驱动程序,研华连WINCE都不让我们安装。我只能耗时间来调试了。大陆只是支持工程师,没有办法解决我的问题,我可是跑了N多趟天安数码城了(研华大陆公司总部)。台湾回归本来就是敏感话题,台湾研华工程师不可能到大陆来,沟通只能由大陆支持工程师转达,并且每次提个问题没有三个月没有回复。

希望我的问题,楼主的问题,在这里都能得到帮助。
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

19
 
引用 6 楼 haoxuesheng1106 的回复:
另外还有一点需要补充的就是我的串口初始化中有一个变量叫做“串口接收/发送定时器”,现在发现如果改变这个值的大小的时候,运行结果会有一些改变,但是也是接收几组之后就会接收不全或者乱码,大家知道这个量是用来干嘛的么


串口设置中,有延时设置这项,设置有点复杂。简单意思是,你设置比如1秒,用读取函数读1秒后不管有没有收到字符,读取函数都返回。如果没有设置此值,则读取函数没有读到数据时,会一直读下去(这样会出问题),当然,良好的系统就算你没有设置,它都有默认值。在Windows API中,它叫“超时设置”。

我只是简单地解释,不全面,为了让楼主更好地理解。
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

20
 
引用 17 楼 yhp1888 的回复:
我遇到了楼主同样的问题!但我是连续运行,有的4-8小时后死机,有的不死机,收发只是偶尔有乱码,调试半个月还没有彻底解决!
我的系统用在机器上,研华的WinCE主板PCM-4386,上位eVC应用程序自己写,下位用51兼容单片机VRS51L3174,硬件由本公司一个变态电子工程师做(无法沟通,一谈就是说别人的软件问题),程序我自己写。不同的机器出现的程度不一样。建议几条,希望楼主解决问题的同时,有……


谢谢您的建议和意见,说实话您列出来的几个建议,我能确定的只是第三个,应该没有重叠I/O,发的同时没有收,收的同时也没有发,我的收发是分别调用不同的函数完成,分别先后调用的。
其他的关于停止位,我检查了一下,现在看上去设置是一致的,上位机和下位机都用的是one stop,但是里面具体是怎么回事,具体是0还是1就不知道了,麻烦问一下这个怎么看呢?
协议方面我也不知道到底搞清楚没有,现在的现象就是能够按正常连接上,也可以正常通讯一段时间(不定),后来就乱掉了,而且我发的数据格式都是一样的,就是说每包发多少个,怎么开始怎么结尾都是一样的,一开始连上了,后来又断了。
我用的通讯芯片是MAX3111e,里面也用到了缓冲区,但是没自己设置什么时候清0,到底怎么工作的真说不清楚,这个需要自己设置么?

新手,硬件方面了解不多,谢谢大家啦
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表