在通訊過程中,,時鐘的計算尤其重要,有時候小小的誤差就能導致通訊異常,。本章旨于如何用小算法減小計算產(chǎn)生的誤差,。 在通訊過程,,尤其是像串口等異步通訊過程中,,小小的波特率誤差就可能導致通訊異常。那么究竟是什么原因?qū)е碌哪??可能是時鐘源產(chǎn)生的誤差,,可能是時鐘配置有誤,也有可能是計算產(chǎn)生的誤差?,F(xiàn)在我們就減少計算誤差這一話題來探討一個小小的算法——四舍五入除法,。 以KE02 uart波特率配置為例: 根據(jù)參考手冊的說明,uart波特率的配置如下: 這個顯然是正確的,,但是為什么有時候在某一波特率值下會出現(xiàn)一點點的亂碼呢,?原因可能就是在計算u16Sbr的時候產(chǎn)生誤差,。例如如果(SysClk>>4)/Baud計算出來的值是10.96,,但賦值給u16Sbr(u16Sbr為無符號短整數(shù))后,u16Sbr的值為10,,把小數(shù)省略了,,從而導致產(chǎn)生誤差,。我們不妨把計算方法改變一下: ((SysClk>>4) + (Baud>>1))/Baud等于 (SysClk>>4)/Baud+0.5,即a/b+0.5(a為被除數(shù),,b為除數(shù)),。這里采用了四舍五入除法,當結(jié)果的小數(shù)位小于4時,,加上5也不會進位,,從而舍去;當結(jié)果的小數(shù)位大于等于5時,,加上5就會進位,。如果(SysClk>>4)/Baud計算出來的值是10.96,那么用四舍五入法后,,即(SysClk>>4)/Baud+0.5的值就變成11.46,,u16Sbr的值為11,比10更加接近10.96 ,。這樣的四舍五入算法比直接舍去全部小數(shù)更加精確,,產(chǎn)生的誤差也更加小。 |
|
來自: 昵稱29273511 > 《待分類》