分享

小算法撬动大地球

 昵称29273511 2015-12-09


导读

在通讯过程中,时钟的计算尤其重要,有时候小小的误差就能导致通讯异常。本章旨于如何用小算法减小计算产生的误差。

在通讯过程,尤其是像串口等异步通讯过程中,小小的波特率误差就可能导致通讯异常。那么究竟是什么原因导致的呢?可能是时钟源产生的误差,可能是时钟配置有误,也有可能是计算产生的误差。现在我们就减少计算误差这一话题来探讨一个小小的算法——四舍五入除法。


以KE02 uart波特率配置为例:

根据参考手册的说明,uart波特率的配置如下:



这个显然是正确的,但是为什么有时候在某一波特率值下会出现一点点的乱码呢?原因可能就是在计算u16Sbr的时候产生误差。例如如果(SysClk>>4)/Baud计算出来的值是10.96,但赋值给u16Sbr(u16Sbr为无符号短整数)后,u16Sbr的值为10,把小数省略了,从而导致产生误差。我们不妨把计算方法改变一下:



((SysClk>>4) + (Baud>>1))/Baud等于 (SysClk>>4)/Baud+0.5,即a/b+0.5(a为被除数,b为除数)。这里采用了四舍五入除法,当结果的小数位小于4时,加上5也不会进位,从而舍去;当结果的小数位大于等于5时,加上5就会进位。如果(SysClk>>4)/Baud计算出来的值是10.96,那么用四舍五入法后,即(SysClk>>4)/Baud+0.5的值就变成11.46,u16Sbr的值为11,比10更加接近10.96 。这样的四舍五入算法比直接舍去全部小数更加精确,产生的误差也更加小。



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多