使用單片機串口常看到波特率這個名詞,並根據它來調整串口的時鍾。
波特率其實並非直接反映了串口傳輸速率(時鍾頻率),實際上,比特率更能直接反應信號的傳輸速率(時鍾頻率)。
比特率:
每秒鍾通過信道傳輸的信息量稱為位傳輸速率,也就是每秒鍾傳送的二進制位數,簡稱比特率。比特率表示有效數據的傳輸速率,用b/s 、bit/s、比特/秒,讀作:比特每秒。
波特率:
波特率反映的是每秒傳輸的數據元個數。
嚴格說來,波特率與比特率的關系也可換算成:比特率=波特率*單個調制狀態對應的二進制位數。如果數據不壓縮,波特率等於每秒鍾傳輸的數據位數,如果數據進行了壓縮,那么每秒鍾傳輸的數據位數通常大於調制速率,使得交換使用波特和比特/秒偶爾會產生錯誤。兩相調制(單個調制狀態對應1個二進制位)的比特率等於波特率;四相調制(單個調制狀態對應2個二進制位)的比特率為波特率的兩倍;八相調制(單個調制狀態對應3個二進制位)的比特率為波特率的三倍;依次類推。
最終,回到實際使用中來,在嵌入式的串口通信中,比特率和波特率往往相同(比如在S3C2440中,所說的波特率 = 比特率)。
對於我們常用的串口,我們經常用波特率來表示傳輸速度,而這時其值就是比特率,通過S3C2440的串口通信得以證明:
在S3C2440的datasheet里面有說到,
“For example, if the baud-rate is 115200 bps and UART clock is 40 MHz, UBRDIVn is:
UBRDIVn = (int)(40000000 / (115200 x 16) ) -1
= (int)(21.7) -1 [round to the nearest whole number]
= 22 -1 = 21”
按照它的介紹,在設置寄存器使其波特率等於115200 ,然后用邏輯分析儀采樣。
#define UART_BAUD_RATE 115200 // 波特率 #define UART_BRD ((UART_CLK / (UART_BAUD_RATE * 16)) - 1) void uart0_init(void) { ... UBRDIV0 = UART_BRD; // 波特率為115200 }
邏輯分析儀采樣結果如下: 可以看出實際采集結果==理論值。 理論上1 bit時間 = 1/ 115200 = 8.68us;
串口傳輸2個字節0x0f的采樣圖
串口通訊的數據格式
停止位可能是1、1.5、2 bit