串口通信数据发快了出错?

[复制链接]
14793|40
 楼主| jin1song 发表于 2012-7-5 18:51 | 显示全部楼层 |阅读模式
串口通信 异或校验,用串口通信助手自动发送,30ms间隔,中间手动发送一次,返回的数据有时候会出错,有时候会停住不返回数据,是什么原因?
原野之狼 发表于 2012-7-5 19:24 | 显示全部楼层
首先 查波特率准不准
然后 看程序能否经受得住大量数据的压力测试
 楼主| jin1song 发表于 2012-7-5 20:57 | 显示全部楼层
看程序能否经受得住大量数据的压力测试

请问怎么看压力测试
dqyubsh 发表于 2012-7-5 21:55 | 显示全部楼层
是不是30ms间隔太短了,弄成300ms再试试。单片机发串口数据,简直慢的要死,你最好用示波器量一下通讯用了多少时间。
airwill 发表于 2012-7-5 22:44 | 显示全部楼层
本帖最后由 airwill 于 2012-7-5 22:45 编辑

我感觉单片机发串口数据倒是没有问题. 问题可能在 PC 端.
原因是 Windows 的时间精度很差, 特别是 30ms间隔, 这个精度特差, 可能也会导致异常情况.
看程序能否经受得住大量数据的压力测试, 那就直接一个大数据包上去, 比如 100KB, 看它的反应吧, 这样可免PC 端定时系统的影响, 也算是最大数据量冲击测试
呆板书生 发表于 2012-7-6 06:01 | 显示全部楼层
PC的定时能力是很低的
dlyt_test001 发表于 2012-7-6 09:52 | 显示全部楼层
看每次发送和返回的字节数,波特率,算一个一次发送和接收需要多长时间。再设置时间间隔。
 楼主| jin1song 发表于 2012-7-6 12:42 | 显示全部楼层
9600的波特率,发送6个字节,返回6个字节,6×8=48,48/9600=7ms,发送和接收一次需要2×7=14ms,那我设置30ms应该没有问题。
晶振是11.0592MHz。
程序里面的几ms的延时要算进来吗?
现在的现象是间隔设的越大出错越少,100ms不会出错,30ms自动发送,发几帧数据就停止了,没有返回数据了,要把电源重开一次才可以继续发送。
请问大家是什么原因?
xxdcq 发表于 2012-7-6 14:35 | 显示全部楼层
pc定时能力很差是因为操作系统时间片轮询的结果!
bjc125 发表于 2012-7-6 15:47 | 显示全部楼层
应该是跟PC关系不大,程序关系处理好了应该不会出现这类问题,很久之前做的几乎无间隔收发都没问题,注意下其他程序段对串口的影响,串口中断程序是否合理,接收缓存是否充足,定时的实现方法等。
如串口发送时是死等标志并且关闭中断连续发6个字节的话肯定会掉一些数据,间隔时间越长只是出现问题的时间间隔长一点而已。死机现象应该是程序跑飞了或者进入某个死循环,最容易在中断里面出现。延时别用delay。
 楼主| jin1song 发表于 2012-7-6 16:27 | 显示全部楼层
本帖最后由 jin1song 于 2012-7-6 16:30 编辑

把我的代码贴上,接收和发送我都用的是查询方式,现在的现象是间隔时间不管是多少ms,如果在自动发送中手动发送一次,串口助手就没有返回数据了。把自动发送停止 ,用手动发送也不能返回。除非把产品的电源重新开一次。看我的程序是否有问题。单片机是c8051f340,发送的数据是六个字节。
  1. void main()
  2. {        
  3.         uint i;        
  4.         uchar a;
  5.         PCA0MD &=~0x40;         
  6.         Init_Device();               
  7.         while(1)
  8.         {                        
  9.                
  10.                 for(a=0;a<6;a++)
  11.                 {        DE=0;                 
  12.                         delay();
  13.                         while(RI0==0);
  14.                         RI0=0;
  15.                         recdata[a]=SBUF0;                                       
  16.                 }
  17.                 if((recdata[4] == recdata[0]^recdata[1]^recdata[2]^recdata[3])&(recdata[5] == 0x22))  //做异或校验
  18.                 {
  19.                         senddata_driver();
  20.                         for(i=0;i<10000;i++);                          
  21.                         transmit_RS485();                                
  22.                         
  23.                 }
  24.   }                 

  25. }
 楼主| jin1song 发表于 2012-7-6 16:31 | 显示全部楼层
10# bjc125

中断全部关掉的,我用的查询方式。
延时为什么不用delay?
7120223 发表于 2012-7-6 16:40 | 显示全部楼层
本帖最后由 7120223 于 2012-7-6 16:50 编辑

接受用中断,发送在主程序中,去掉所有延时函数,用标志来代替,这样会好很多
你电路上不是有LED灯么,吧这个灯加在你认为程序会出现死机的地方,然后看死机了灯是灭的还是亮的就可以找不出来了
 楼主| jin1song 发表于 2012-7-6 16:46 | 显示全部楼层
接受用中断,发送在主程序中,去掉所有延时函数,用标志来代替,这样会好很多
7120223 发表于 2012-7-6 16:40

延时函数用标志代替是什么意思?
7120223 发表于 2012-7-6 17:00 | 显示全部楼层
你的延时没有立即反应的效果,会使某个时候单片机处于死等状态,设个条件,当条件满足立马跳出,这样反应更快,效率更高
joyme 发表于 2012-7-6 17:09 | 显示全部楼层
为什么要延时?
全双工模式下,发送和接收是可以同时进行的,发送不需要延时等待
还有你计算时间的方法是错的,串口通信每个字节是11位或10位,不是8位

不过根本原因还是要用中断接收,查询接收很容易因程序里的延时或其他任务而导致接收失败,而你的程序没有做失败任何有效的失败处理
bjc125 发表于 2012-7-6 17:11 | 显示全部楼层
这程序也太不靠谱了吧
 楼主| jin1song 发表于 2012-7-6 17:44 | 显示全部楼层
本帖最后由 jin1song 于 2012-7-6 17:46 编辑
为什么要延时?
全双工模式下,发送和接收是可以同时进行的,发送不需要延时等待
还有你计算时间的方法是错的,串口通信每个字节是11位或10位,不是8位

不过根本原因还是要用中断接收,查询接收很容易因程序里的延 ...
joyme 发表于 2012-7-6 17:09

因为是rs485通信

程序没有做任何有效的失败处理,是的,我就是想请教怎么做有效的失败处理?
 楼主| jin1song 发表于 2012-7-6 17:47 | 显示全部楼层
17# bjc125
愿闻其详
luck851 发表于 2012-7-6 18:08 | 显示全部楼层
linux下的串口压力测试我一般都用minicom给PC发个几兆的文件,然后再对比源文件是否有错。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:在顺境中感恩,在逆境中依旧心存喜乐,认真的活在当下!

1

主题

250

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部