RS232串口大数据量通讯的问题

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

对了我的串口在数据收发的时候用的是轮询的方式,只要有数据就接收
...全文
837 30 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
haoxuesheng1106 2010-06-25
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 yhp1888 的回复:]
引用 13 楼 haoxuesheng1106 的回复:
我现在的做法是通过while(1)反复调用串口接收函数RX();只要接收缓冲区内有新数就接收,否则就跳出循环,收到的数先放到一个临时的数组中,等一包数据接收完毕之后再做处理,这样做可能会带来一个问题就是串口发送的时间和DSP接受的时间配合可能会出问题,但是现在调试的结果是,当我调到某些合适的值后,数据可以正常接收,在数据小于150KB的时……
[/Quote]


谢谢
那我再看一下while(1)中的代码,不过里面已经减到最小了,就是一个数据接收函数R(),中间是间接收到的数据验证处理代码的代码,最后一个数据发送函数T()。我再看看程序结构是不是还有什么问题,是不是哪里时间积累会导致接收错位
haoxuesheng1106 2010-06-25
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 wjcapple 的回复:]
引用 7 楼 haoxuesheng1106 的回复:
引用 4 楼 91program 的回复:
只有一个解释,你的纠错协议有问题,出现错误不能正确的纠正.


谢谢提醒,你说的纠错协议有问题是什么意思,能具体说一下么。
我现在是没接受到一包数据之后进行16bit和验证(协议要求,不可改),如果正确则DSP返回正确接收命令,上位机继续发送下一包数据;如果验证不正确,则DSP返回错误命……
[/Quote]

纠错协议?
不好意思,您说的纠错协议是什么意思呢?
我理解的就是收到数据之后校验一下,对的话就用,向上位机返回发送成功信息;不对的话就向上位机返回发送错误信息,上位机从新发送。现在就是这么做的,没有专门的纠错协议,这个算么?因为我在协议中也没有看到相关的专门纠错部分。

谢谢您的建议
wjcapple 2010-06-23
  • 打赏
  • 举报
回复
建议不要一个一个的读取,这样读的时间比较长,可以尝试一次全部读取
wjcapple 2010-06-23
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 haoxuesheng1106 的回复:]
引用 4 楼 91program 的回复:
只有一个解释,你的纠错协议有问题,出现错误不能正确的纠正.


谢谢提醒,你说的纠错协议有问题是什么意思,能具体说一下么。
我现在是没接受到一包数据之后进行16bit和验证(协议要求,不可改),如果正确则DSP返回正确接收命令,上位机继续发送下一包数据;如果验证不正确,则DSP返回错误命令,上位机重新发送刚才那包数据;最多重复5次。不知道这样子……
[/Quote]
纠错协议你都没有发上来,别人怎么具体说哈?
yhp1888 2010-06-23
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 haoxuesheng1106 的回复:]
我现在的做法是通过while(1)反复调用串口接收函数RX();只要接收缓冲区内有新数就接收,否则就跳出循环,收到的数先放到一个临时的数组中,等一包数据接收完毕之后再做处理,这样做可能会带来一个问题就是串口发送的时间和DSP接受的时间配合可能会出问题,但是现在调试的结果是,当我调到某些合适的值后,数据可以正常接收,在数据小于150KB的时候还可以,再大的时候就会乱掉,纠正不回来。
大家帮我分析一下可能是什么原因呢
[/Quote]
又仔细看了一遍,觉得楼主要重新审校一下while(1)中的代码了。
yhp1888 2010-06-23
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 haoxuesheng1106 的回复:]
谢谢,我好像有点你明白了,不过你这里说的“不管有没有收到字符都返回”是个什么意思,就是到了时间都要跳出读取函数,等待下一次在调用么,那如果我把那个值设为0,是不是几乎就不执行数据读取函数了?[/Quote]
是的。

设为0秒,它读取一次,有也返回,没有也返回,就是它不等待。
haoxuesheng1106 2010-06-22
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 fpcc 的回复:]
这个东西应该看你的设置情况了。
[/Quote]

那里的设置呢?比方说……
fpcc 2010-06-22
  • 打赏
  • 举报
回复
这个东西应该看你的设置情况了。
haoxuesheng1106 2010-06-22
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 yhp1888 的回复:]
引用 6 楼 haoxuesheng1106 的回复:
另外还有一点需要补充的就是我的串口初始化中有一个变量叫做“串口接收/发送定时器”,现在发现如果改变这个值的大小的时候,运行结果会有一些改变,但是也是接收几组之后就会接收不全或者乱码,大家知道这个量是用来干嘛的么


串口设置中,有延时设置这项,设置有点复杂。简单意思是,你设置比如1秒,用读取函数读1秒后不管有没有收到字符,读取函数都返……
[/Quote]

谢谢,我好像有点你明白了,不过你这里说的“不管有没有收到字符都返回”是个什么意思,就是到了时间都要跳出读取函数,等待下一次在调用么,那如果我把那个值设为0,是不是几乎就不执行数据读取函数了?
haoxuesheng1106 2010-06-22
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 yhp1888 的回复:]
我遇到了楼主同样的问题!但我是连续运行,有的4-8小时后死机,有的不死机,收发只是偶尔有乱码,调试半个月还没有彻底解决!
我的系统用在机器上,研华的WinCE主板PCM-4386,上位eVC应用程序自己写,下位用51兼容单片机VRS51L3174,硬件由本公司一个变态电子工程师做(无法沟通,一谈就是说别人的软件问题),程序我自己写。不同的机器出现的程度不一样。建议几条,希望楼主解决问题的同时,有……
[/Quote]

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

新手,硬件方面了解不多,谢谢大家啦
yhp1888 2010-06-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 haoxuesheng1106 的回复:]
另外还有一点需要补充的就是我的串口初始化中有一个变量叫做“串口接收/发送定时器”,现在发现如果改变这个值的大小的时候,运行结果会有一些改变,但是也是接收几组之后就会接收不全或者乱码,大家知道这个量是用来干嘛的么
[/Quote]

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

我只是简单地解释,不全面,为了让楼主更好地理解。
yhp1888 2010-06-22
  • 打赏
  • 举报
回复
我遇到了楼主同样的问题!但我是连续运行,有的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多趟天安数码城了(研华大陆公司总部)。台湾回归本来就是敏感话题,台湾研华工程师不可能到大陆来,沟通只能由大陆支持工程师转达,并且每次提个问题没有三个月没有回复。

希望我的问题,楼主的问题,在这里都能得到帮助。
IT铁哥 2010-06-22
  • 打赏
  • 举报
回复
做个标记,学习下。
Will_Shao 2010-06-22
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 haoxuesheng1106 的回复:]
我现在的做法是通过while(1)反复调用串口接收函数RX();只要接收缓冲区内有新数就接收,否则就跳出循环,收到的数先放到一个临时的数组中,等一包数据接收完毕之后再做处理,这样做可能会带来一个问题就是串口发送的时间和DSP接受的时间配合可能会出问题,但是现在调试的结果是,当我调到某些合适的值后,数据可以正常接收,在数据小于150KB的时候还可以,再大的时候就会乱掉,纠正不回来。
大家帮我分析一下可能是什么原因呢
[/Quote]

你的接收缓冲区够不够大?什么时候进入while循环开始接收数据?是接收和处理数据同步进行,还是先处理完当前读出来的数据后,再去读取串口中的数据?
gooogleman 2010-06-21
  • 打赏
  • 举报
回复
如果你的串口驱动性能不好,那么你校验也没有用,
建议修改串口驱动先。以前我的性能不行,现在性能上去了,校验也不用了。
Will_Shao 2010-06-21
  • 打赏
  • 举报
回复
没有办法保证一个数据包不会被分成几次接收,而且一次接收的数据也不一定都属于同一个数据包,所以需要修改你的通讯协议。要在数据包的头部,添加一个数据包长度字段,根据这个长度字段来确定包的结尾在哪里。
haoxuesheng1106 2010-06-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 91program 的回复:]
只有一个解释,你的纠错协议有问题,出现错误不能正确的纠正.
[/Quote]

谢谢提醒,你说的纠错协议有问题是什么意思,能具体说一下么。
我现在是没接受到一包数据之后进行16bit和验证(协议要求,不可改),如果正确则DSP返回正确接收命令,上位机继续发送下一包数据;如果验证不正确,则DSP返回错误命令,上位机重新发送刚才那包数据;最多重复5次。不知道这样子做逻辑上有没有什么漏洞呢,大家帮我分析一下,谢谢了。
haoxuesheng1106 2010-06-21
  • 打赏
  • 举报
回复
另外还有一点需要补充的就是我的串口初始化中有一个变量叫做“串口接收/发送定时器”,现在发现如果改变这个值的大小的时候,运行结果会有一些改变,但是也是接收几组之后就会接收不全或者乱码,大家知道这个量是用来干嘛的么
haoxuesheng1106 2010-06-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 cbyibby 的回复:]
你使用串口通讯来捕捉打印的话,一般数据量大是会出现接受不全或者乱码现象的。可以尝试加大波特率(需硬件支持)或者减少不必要的打印来实现,如循环打印让延时久一点
[/Quote]

谢谢指点

不好意思,你说的捕捉打印是什么意思呢?
另外我的波特率现在已经是115200了,加不上去了
你说的循环打印时间又是什么意思呢,我现在的数据是一个一个接收的,接受的时候个数据之间没有延时(试过加延时,但效果不明显),你说的延时应该加在哪里呢?
谢谢啦
91program 2010-06-21
  • 打赏
  • 举报
回复
只有一个解释,你的纠错协议有问题,出现错误不能正确的纠正.
加载更多回复(9)

19,521

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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