amobbs.com 阿莫电子技术论坛

标题: 傻孩子:我终于找到了RS485时,高波特率,大数据量时通讯不好的解决方法. [打印本页]

作者: ba_wang_mao    时间: 2010-2-24 17:31
标题: 傻孩子:我终于找到了RS485时,高波特率,大数据量时通讯不好的解决方法.
现象:
    我的程序 定时中断=12ms,中断服务程序大约执行时间=0.5ms  
    我用MODSCAN32软件读取保持寄存器,寄存器数量=125,即:
        上位机发送8字节的请求命令,从机返回254字节的应答命令,发送通讯间隔=100ms.

   A.RS232测试结果
    (1).波特率在9600,19200,38400时,通讯质量非常好,成功率100%. 但是当波特率=57600,115200时,通讯质量说得过去,只达到99.1%左右.
     (2).当屏蔽中断服务程序中的代码,则当波特率=57600,115200时,通讯质量也非常好,成功率100%
   B.RS485测试结果
    (1).波特率在9600,19200时,通讯质量非常好,成功率100%. 但是当波特率=38400,57600,115200时,通讯质量非常差,只达到2%左右.
 
  【1】.虽然中断嵌套能够解决通讯问题,我不想使用中断嵌套.
    因为通讯只是次要工作,而定时中断中的代码是非常重要的代码,我不希望其它中断打断它.
  【2】.数据接收:采用中断+缓存的方法
  【3】.数据发送:采用"空中断"+"完成中断"方式
        由于硬件上可能焊接485芯片,因此数据发送:采用"空中断"+"完成中断"方式.
        即为确保最后一个字节到达上位机,最后一个字节采用发送完成中断发送.

   由于数据发送时,采用了"空中断"+"发送完成中断",根据马潮老师所说的,达到了最佳的流水性性能,即:不停的装载数据发送.
但是却又增加了系统的负荷.导致频繁的产生"数据空中断".

   解决方法1:
        仅仅使用"发送完成中断"发送数据,通讯质量有所好转,在波特率=115200时,通讯成功率至少达到90%
   解决方法2:
        使用"查询方式"发送数据,在波特率=115200时,通讯成功率达到100%


  结论:
        当定时中断中的代码执行时间稍微长时,应该禁止使用"空中断"+"完成中断"方式发送数据,
        最好仅仅使用"完成中断"发送数据.
        只有当仅仅使用"完成中断"发送数据时,通讯质量不好(没有达到100%)时,才在主程序中使用"查询方式"发送数据.
作者: VERY    时间: 2010-2-24 17:36
mark
作者: Gorgon_Meducer    时间: 2010-2-24 17:38
恭喜哈,看来你领悟到了很多对自己有用的东西。

举一反三:
AD里面如果使用autorun模式来连续采样,开启中断的情况下,系统资源可能消耗很大;
使用SPI通讯,如果通讯速率较高,并且开启了中断,则系统资源消耗较大。

对付以上情况,可以参考楼主地分析,使用类似的方法解决。
作者: kingsabbit    时间: 2010-2-24 22:11
软件处理很重要
作者: tingfenghu    时间: 2010-3-7 23:21
mark
作者: wochai    时间: 2010-3-8 14:16
记录
作者: gxy508    时间: 2010-3-8 16:14
mark
作者: hetao7241    时间: 2010-3-8 17:23
学习了。
作者: kbdcj2000    时间: 2010-3-10 09:25
mark
作者: Forever    时间: 2010-3-10 11:09
我一般都用 空中断 + 缓存方式 发送
作者: sonna    时间: 2010-3-11 01:22
mark
作者: xinchangkk    时间: 2010-3-11 08:13
收藏,485 确实有很多地方要用到
作者: tick    时间: 2010-3-11 08:33
mark
作者: banyai    时间: 2010-3-11 09:02
不理解你说的,你的解决方法似乎只是在两个发送字节之间加入了一定的延时。我想可能还是你的通信线路上无法达到最高的通信速度,与软件无关。
作者: ybqwf    时间: 2010-3-23 19:23
mark
作者: l456789    时间: 2010-3-23 20:45
楼主测试过距离有没关系呢?
作者: denglu    时间: 2010-6-10 00:31
mark
作者: wxzhouqing    时间: 2010-6-10 02:50
主程序查询,二字节间的时间可能延长!, 你讲的“通讯成功率”是指PC发送的数据你不回,还是你回的数据PC收的不正确。。
作者: kinggao    时间: 2010-6-30 15:52
记号 谢谢指点
作者: yaya001    时间: 2010-6-30 17:46
mark
作者: liujing0146    时间: 2010-6-30 18:43
mark
作者: gsl8828    时间: 2010-7-30 13:21

作者: twd3621576    时间: 2010-8-11 15:41
17 楼问的好
作者: ming076    时间: 2010-10-6 21:40
mark
作者: jckj    时间: 2010-10-6 23:20
mark
作者: jrcsh    时间: 2010-10-6 23:41
我想说~~~~除非很特殊的场合  要不~~~~  没见过这么高的波特

波特率 常用到的就 9600 / 1000米   2400/1800米   当然对通信物理线路,和接地处理也有要求才能达到好的通信质量。
作者: adai    时间: 2010-10-7 00:24
mark
作者: electricit    时间: 2010-10-7 00:42
我把串口波特率升到了187.5K,跑好三百米,PROFIBUS,运行正常,一般掌握好收发切换时间,任意支持的速度都可以100%的
作者: kneken    时间: 2010-10-7 00:48
mark
作者: EILIANHELL    时间: 2010-10-7 15:45
mark
作者: ye_song    时间: 2010-10-7 21:06
mark
作者: rainyss    时间: 2010-10-8 02:42
中断没问题的,大框架要设计好,别的中断中时延不要超过8us就行了.
当然你的观点也是正确的,不要老盯着中断不放,很多时候查询反而是最有效率的.
我用的方法是使用更快的单片机.
没有万能的方法,变通才是硬道理.
作者: twlkzxy    时间: 2010-10-9 17:12
mk
作者: tiaomiaodu    时间: 2010-11-30 22:34
由于数据发送时,采用了"空中断"+"发送完成中断",
这句话怎么理解的啊。我不懂的
作者: yywin    时间: 2010-12-1 00:06
学习
作者: Shi_Tou    时间: 2010-12-7 11:52
回复【楼主位】ba_wang_mao
-----------------------------------------------------------------------

标记 485啊!
作者: win100    时间: 2010-12-30 10:27
标记。
作者: HuNB    时间: 2010-12-30 10:36
mark
作者: star_tale    时间: 2011-2-13 10:47
mark
作者: mitchell    时间: 2011-2-13 15:13
和高速网卡驱动程序一个道理,频繁的中断反而降低系统效率,特别是大型操作系统。所以,高速网卡的驱动多用查询的方式接收数据包。
作者: more    时间: 2011-2-13 19:13
Mark.
作者: liulj1007    时间: 2011-4-15 16:11
mark
作者: flyingcys    时间: 2011-4-15 22:44
mark
作者: cxbbb    时间: 2011-4-16 00:49
学习
作者: mystar1984    时间: 2011-4-18 08:25
MARK
作者: wxx116zh    时间: 2011-4-18 10:28
mark,学习了
作者: GZLJZ    时间: 2011-4-18 11:15
这个要好好领悟
作者: ljt8015    时间: 2011-4-18 11:33
查询方式的话,即使波特率很高,通信效率就低了啊
作者: ledatou    时间: 2011-4-18 11:40
mark
作者: shamork    时间: 2011-4-18 12:14
mark
作者: zhaoghsea    时间: 2011-4-18 13:29
mark
作者: haimie    时间: 2011-4-18 16:30
mmmk
作者: dengxiaofeng    时间: 2011-4-18 17:18
标记  回去看  现在下班了!!!
作者: Chuda    时间: 2011-4-20 20:11
mark
作者: djw1981    时间: 2011-7-15 13:44
485,学习了。谢谢!
作者: blackhorse21    时间: 2011-7-15 14:06
mark!
作者: myhonour    时间: 2011-7-15 14:07
mark
作者: kupica    时间: 2011-7-15 14:22
不懂空中断是什么意思,还望楼主指教。
作者: prowin    时间: 2011-7-15 16:14
mark!!
作者: zhikai_wu    时间: 2011-7-21 09:22
485搞这么高.用在现场一段时间试下.
作者: 2233223    时间: 2011-7-21 10:40
1382400波特率,100-200米,经常用,无压力
作者: icexiong    时间: 2011-7-21 11:01
可以换成can,or ethernet
作者: canberry00    时间: 2011-8-5 12:02
mark
作者: defineme    时间: 2011-8-17 16:56
我觉得楼主的分析不是真正问题原因所在!
作者: xiaozhe101424    时间: 2011-8-19 11:41
空中断+发送完成中断?
作者: tothen5    时间: 2011-8-20 17:46
485误码问题,很多不是在软件上解决的!
即时采用57600波特率,采用查询方式发送!
作者: 19001579    时间: 2011-8-20 20:38
RS485一般是一次性把数数发完比较好,在进入了装载数据期间就不要中断了,一定要等到装载完成以后,也就是要发完以后才可以中断
还有个小问题,我让楼主测试回来后告诉我
作者: Trylin    时间: 2011-8-20 21:30
mark
作者: zjy9430    时间: 2011-8-21 00:00
mark!
作者: zhunyan    时间: 2011-10-2 13:35
mark
作者: Hello_World    时间: 2011-10-2 14:49
mark
作者: Helloeveryon    时间: 2011-10-3 00:10
MARK
作者: 287355586    时间: 2011-10-9 14:21
回复【楼主位】ba_wang_mao
-----------------------------------------------------------------------

mark
作者: haolaishi    时间: 2011-11-21 23:36
MARK
作者: pcwhy    时间: 2011-11-21 23:52
谢谢了'
作者: qinhya    时间: 2011-11-22 08:32
mark
作者: saluo    时间: 2011-11-22 11:11
mark
作者: taocongrong    时间: 2011-12-29 16:03
mark 还不错
作者: terrorist    时间: 2012-3-8 14:01
Mark
作者: Felix257    时间: 2012-3-8 14:04
好东西
作者: xingzhong    时间: 2012-3-8 15:04
回复【楼主位】ba_wang_mao  
-----------------------------------------------------------------------

mark
作者: yuzr    时间: 2012-3-8 15:07
mark
作者: senbaby2    时间: 2012-3-28 21:14
恩,通讯时候需要了解学习的地方。
作者: wpnx    时间: 2012-3-28 21:23
没有万能的方法,变通才是硬道理!
作者: mimikankan    时间: 2012-3-28 21:33
发送完中断时切换收发状态基本误码率在十万分之一
作者: pisgah    时间: 2012-3-28 21:46
为了高波特率而降低了位元组的传送速率,那高波特率有什么好处?
作者: sheji105    时间: 2012-3-30 17:37
看看波特率精确性情况,总线电阻匹配
作者: lhuan    时间: 2012-5-16 12:52
我在调试是波特率为9600及以下通信率很低,但是在14400以上时通信率为100%,不知道为啥?也是利用马老师的程序。
作者: TW_strivehappy    时间: 2012-5-16 12:59
mark      
作者: wszyjsw2    时间: 2012-5-16 18:58
有人鉴定了 有用吗?
作者: jqfsjt    时间: 2012-5-16 23:22
先标记下,有时间研究下。
作者: just_be_fine    时间: 2012-5-16 23:38
MARK!顶
作者: xiatianzhang    时间: 2012-7-24 09:19
看的不是很明白!
作者: layi.lau1986    时间: 2012-8-14 11:09
请教楼主您一个问题,,我正在传输数据64kpbs 通讯数据很大,能否给点建议呢!!我需要使用485通讯!!
作者: linucos    时间: 2012-8-14 12:31
学习学习!
作者: yfgww    时间: 2012-8-17 23:02
收藏起来
作者: kowajw    时间: 2012-9-10 20:53
mark。。。。。。
作者: jz701209李    时间: 2013-1-29 21:17
学习学习.......
作者: xiangweixx    时间: 2013-2-26 11:28
Mark一下!
作者: liyang121316    时间: 2014-4-21 21:21
lhuan 发表于 2012-5-16 12:52
我在调试是波特率为9600及以下通信率很低,但是在14400以上时通信率为100%,不知道为啥?也是利用马老师的 ...

能给解释下什么叫通信率吗?谢谢!




欢迎光临 amobbs.com 阿莫电子技术论坛 (https://www.amobbs.com/) Powered by Discuz! X3.4