|
發布時間: 2023-8-23 01:53
正文摘要:比如有一串數據傳過來,字節和字節之前無時間間隔,我應該控制我的串口中斷函數運行時間在多少以內才能使下一個數據能正常被接收,是1/baud嗎。 另外還有個問題,如果晶振頻率算出來的串口中斷時間有浮點數誤差,那 ... |
| 感謝各位的解答,各位講的都對我有所幫助 |
|
串口通訊到底有沒有累積誤差?對時鐘精度到底有何要求?_串口誤差容忍_liuxd3000的博客-CSDN博客 https://blog.csdn.net/liuxd3000/article/details/128396918 波特率誤差,上面鏈接講得很清楚了。下面的回答基于波特率為9600,1位停止位,無校驗的情形。 第1個問題: 單串口收到一字節數據時,只要在小于10/baud(約1.04ms)時間取出,就不會影響下一字節接收。很多單片機有串口緩存,這時間等于10/baud*(緩存數量+1),例如新唐的m0有16字節收發緩存。只要在17.7mS內處理不會出錯。 第2個問題: 只要收發波特率的偏差小于4.5%,就不會有問題。任意數量的數據通訊都不會有問題。 |
|
波特率誤差 只要小于 2% 就可以忽略,不會影響傳輸。 起始位的作用,就是用來對齊的,所以,“誤差累計” 是不存在的。 停止位,在實際通信的過程中,尤其是目標設備為單片機時,是可以不存在的,即大多時候,你發送完停止位之后,可以立刻發送起始位。 但是,在設備傳輸需求中又是普遍存在的,比如某設備要求2位停止位,代表他 每接受完一個字節數據后,必須有 兩個位的間隔才能繼續接收下一個字節。通常出現在性能比較差的 老設備中。 |
| 樓主明顯對停止位理解有誤,停止位只是插入一個固定的間隔時間,只是時間概念,并不存在實際的數據位。發送端要發送固定停止位時間,接收端并不檢測停止位,只檢測起始位。就算兩端波特率有誤差,累積到停止位就算完事兒,從起始位開始從零開始累積。 |
| 主要是和波特率有關。比如9600波特率,最短字節間距大約1mS有足夠的時間存入緩存,并等待接收下一字節。具體起始停止位那是硬件的事 |
yzwzfyz 發表于 2023-8-23 11:30 非常非常感謝您的耐心回復。 請問幀和幀之間一般都存在停止位嗎?即使是連續發送的數據。 我主要是不太理解第四步,即起始位修正誤差的問題。如果幀和幀之間沒有停止位的間隔,我不理解誤差是如何消除的。如果主機發送的數據幀和幀之間無間隔(終止位緊接著起始位),又假設誤差較大,那么RI置位有可能發生在第一個幀的終止位的后段,甚至第二個幀的起始位的前段,這樣的話,單片機開始檢測rxd跳變的時間不就在第二個幀的起始位中前段嗎,第二個幀的起始位這一比特時間不就縮短了嗎,如此一來,當發送的幀特別多,不就會出問題嗎。 本人大一剛剛開始自學入門,暫時在家沒有各種電子儀器實測信號,如果問題太過繁瑣簡單,還請多多諒解。 |
wulin 發表于 2023-8-23 07:59 非常非常感謝您的回復。 但是我還是不太理解起始位修正誤差的說法,如果主機發送的數據幀和幀之間無間隔(終止位緊接著起始位),又假設誤差較大,那么RI置位有可能發生在第一個幀的終止位的后段,甚至第二個幀的起始位的前段,這樣的話,單片機開始檢測rxd跳變的時間不就在第二個幀的起始位中前段嗎,第二個幀的起始位這一比特時間不就縮短了嗎,如此一來,當發送的幀特別多,不就會出問題嗎。 本人大一剛剛開始入門,實驗條件可能不足,暫時在家沒有各種電子儀器實測信號,如果問題太過繁瑣簡單,還請多多諒解。 |
|
樓主的想法是對的,的確如此: 實際上:A向B串行通訊時,是允許波特率有誤差的。 1、每幀,A會先發起始脈沖,而后再發數據。對方B會據此脈沖的邊沿,進行同步,再依據自己波特率,每間隔一個周期,下載一位數據,由于兩方存在周期誤差(波特率誤差),積累N位后,必然會發生錯位現象。 2、如果雙方波特率完全一致,這個N=∞,如果誤差太大,N會很小。 3、好在還未發生錯位時(下載的位數 < N),一幀就結束了,數據就不會出錯。 4、下一幀會重新同步,積累的誤差被清除重來。 硬件上通常采三取二。如你圖中所示,當積累誤達到30%寬度左右時(估計值),采樣箭頭會出界。 設A方=9600,B方=9640,誤差約=1-9640/9000 = 0.416%,即每個脈沖會移位(誤差前移或后移)0.4%。 當起始脈沖同步后,第幾個脈沖采樣會出界呢? 30% ÷ 0.416% = 72,在第72個脈沖之后,采樣會出界而錯。 一個字節通常有:需要 11至13個脈沖(起始+數據+校驗+停止)。如此算來:即使5個字節不進行同步,也不會出錯。 以上是估算,并不是樓主所要的直接答案。 不過樓主可以以12個脈沖為界,估算出當頻率偏差多少時會出錯。 不過要注意:以上參數要以手冊上的數據為參考。這樣才準確一些。 手冊上會說明,當接到起始脈沖邊沿后多久會進行數據采樣(圖中的三個采樣脈沖),以及這三個采樣脈沖的間隔。這樣就計算得更準確一點了。 也有一次采樣就認定的(以手冊上說的為準)。 這些主要定義允許誤差取多少?(極限是50%,保守取10%,上例取的是30%)。 |
| 硬件串口,只管中斷、接收。 |
| UART是異步通信,無特殊情況下,一幀數據是10bit,傳輸時間只跟波特率相關。幀與幀之間的間隔時間不一定是相同的,會受到其它中斷的影響。 |
| 接收到數據觸發中斷,32和51是這樣,什么情況下中斷要靠計算時間才能進入? |
| 你好。串行數據無論是發送或是接收過程中,每個位每個字節是有間隔的。波特率的定義就是----串行口每秒鐘發送或是接收的二進制的位數,就叫這個串口的波特率。特別是在不定長數據傳輸過程中,兩個字節的間隔超過一定值,就認為是這一組數據傳輸完畢! |
Kankanxi 發表于 2023-8-23 02:59 1.一幀數據至少包含起始位、數據位、結束位。連續接收一串數據,串口中斷周期就是接收一幀數據的時間,中斷函數運行時間必須小于或遠小于中斷周期。否則會丟失數據或不能及時處理數據。 2.異步通訊天然存在頻率和相位誤差,只要誤差在可控范圍就不會有問題。每一幀的起始位信號就相當于修正一次誤差。不存在積累誤差一說。 |
謝謝各位大佬的回復了![]() |
| 另外,如果晶振頻率是11.0592MHz的話,雖然除盡了,但是誤差是不是在持續積累呢?我想問這種誤差積累到什么程度會出錯誤,另外,如何計算誤差。 |
| 比如說晶振頻率是12MHz |