打印

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

[复制链接]
13319|40
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jin1song|  楼主 | 2012-7-5 18:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
原野之狼| | 2012-7-5 19:24 | 只看该作者
首先 查波特率准不准
然后 看程序能否经受得住大量数据的压力测试

使用特权

评论回复
板凳
jin1song|  楼主 | 2012-7-5 20:57 | 只看该作者
看程序能否经受得住大量数据的压力测试

请问怎么看压力测试

使用特权

评论回复
地板
dqyubsh| | 2012-7-5 21:55 | 只看该作者
是不是30ms间隔太短了,弄成300ms再试试。单片机发串口数据,简直慢的要死,你最好用示波器量一下通讯用了多少时间。

使用特权

评论回复
5
airwill| | 2012-7-5 22:44 | 只看该作者
本帖最后由 airwill 于 2012-7-5 22:45 编辑

我感觉单片机发串口数据倒是没有问题. 问题可能在 PC 端.
原因是 Windows 的时间精度很差, 特别是 30ms间隔, 这个精度特差, 可能也会导致异常情况.
看程序能否经受得住大量数据的压力测试, 那就直接一个大数据包上去, 比如 100KB, 看它的反应吧, 这样可免PC 端定时系统的影响, 也算是最大数据量冲击测试

使用特权

评论回复
6
呆板书生| | 2012-7-6 06:01 | 只看该作者
PC的定时能力是很低的

使用特权

评论回复
7
dlyt_test001| | 2012-7-6 09:52 | 只看该作者
看每次发送和返回的字节数,波特率,算一个一次发送和接收需要多长时间。再设置时间间隔。

使用特权

评论回复
8
jin1song|  楼主 | 2012-7-6 12:42 | 只看该作者
9600的波特率,发送6个字节,返回6个字节,6×8=48,48/9600=7ms,发送和接收一次需要2×7=14ms,那我设置30ms应该没有问题。
晶振是11.0592MHz。
程序里面的几ms的延时要算进来吗?
现在的现象是间隔设的越大出错越少,100ms不会出错,30ms自动发送,发几帧数据就停止了,没有返回数据了,要把电源重开一次才可以继续发送。
请问大家是什么原因?

使用特权

评论回复
9
xxdcq| | 2012-7-6 14:35 | 只看该作者
pc定时能力很差是因为操作系统时间片轮询的结果!

使用特权

评论回复
10
bjc125| | 2012-7-6 15:47 | 只看该作者
应该是跟PC关系不大,程序关系处理好了应该不会出现这类问题,很久之前做的几乎无间隔收发都没问题,注意下其他程序段对串口的影响,串口中断程序是否合理,接收缓存是否充足,定时的实现方法等。
如串口发送时是死等标志并且关闭中断连续发6个字节的话肯定会掉一些数据,间隔时间越长只是出现问题的时间间隔长一点而已。死机现象应该是程序跑飞了或者进入某个死循环,最容易在中断里面出现。延时别用delay。

使用特权

评论回复
11
jin1song|  楼主 | 2012-7-6 16:27 | 只看该作者
本帖最后由 jin1song 于 2012-7-6 16:30 编辑

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

}

使用特权

评论回复
12
jin1song|  楼主 | 2012-7-6 16:31 | 只看该作者
10# bjc125

中断全部关掉的,我用的查询方式。
延时为什么不用delay?

使用特权

评论回复
13
7120223| | 2012-7-6 16:40 | 只看该作者
本帖最后由 7120223 于 2012-7-6 16:50 编辑

接受用中断,发送在主程序中,去掉所有延时函数,用标志来代替,这样会好很多
你电路上不是有LED灯么,吧这个灯加在你认为程序会出现死机的地方,然后看死机了灯是灭的还是亮的就可以找不出来了

使用特权

评论回复
14
jin1song|  楼主 | 2012-7-6 16:46 | 只看该作者
接受用中断,发送在主程序中,去掉所有延时函数,用标志来代替,这样会好很多
7120223 发表于 2012-7-6 16:40

延时函数用标志代替是什么意思?

使用特权

评论回复
15
7120223| | 2012-7-6 17:00 | 只看该作者
你的延时没有立即反应的效果,会使某个时候单片机处于死等状态,设个条件,当条件满足立马跳出,这样反应更快,效率更高

使用特权

评论回复
16
joyme| | 2012-7-6 17:09 | 只看该作者
为什么要延时?
全双工模式下,发送和接收是可以同时进行的,发送不需要延时等待
还有你计算时间的方法是错的,串口通信每个字节是11位或10位,不是8位

不过根本原因还是要用中断接收,查询接收很容易因程序里的延时或其他任务而导致接收失败,而你的程序没有做失败任何有效的失败处理

使用特权

评论回复
17
bjc125| | 2012-7-6 17:11 | 只看该作者
这程序也太不靠谱了吧

使用特权

评论回复
18
jin1song|  楼主 | 2012-7-6 17:44 | 只看该作者
本帖最后由 jin1song 于 2012-7-6 17:46 编辑
为什么要延时?
全双工模式下,发送和接收是可以同时进行的,发送不需要延时等待
还有你计算时间的方法是错的,串口通信每个字节是11位或10位,不是8位

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

因为是rs485通信

程序没有做任何有效的失败处理,是的,我就是想请教怎么做有效的失败处理?

使用特权

评论回复
19
jin1song|  楼主 | 2012-7-6 17:47 | 只看该作者
17# bjc125
愿闻其详

使用特权

评论回复
20
luck851| | 2012-7-6 18:08 | 只看该作者
linux下的串口压力测试我一般都用minicom给PC发个几兆的文件,然后再对比源文件是否有错。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

1

主题

250

帖子

2

粉丝