Uart接口的详细解释
我面試的時候一般喜歡問應聘者一個問題:UART與RS232/RS485的區別與聯系?很多人對于這個問題答得都不是很好。還有些人壓根就沒有想過這個問題,一直認為他們是同一個東西,就是咱們俗稱的串口。
?
我剛入嵌入式的大門時,對這個問題也困惑過很久,后來終于弄明白了。跟大家一起分享一下吧。
?
簡單來說,區別在于UART是一種接口,而RS232/RS485是一種總線。UART這個接口,后面可以接TTL電平,這就是我們俗稱的普通的串口。而UART如果接了RS232/RS485的轉換芯片,那么后面的總線上就是按照RS232/RS485規則來傳輸數據。RS232/RS485總線的具體規則我們后續再討論,本篇主要詳解TTL下的情況。UART接TTL電平時,+5V等價于邏輯“1”,0V等價于邏輯“0”。
如下例子主要說明一下UART接TTL電平這種方式是怎么傳輸二進制數據的。這是我在項目中的一個例子,用STM32F429的Uart4口采集TOF模塊測量得到的距離信息。
UART的Rx連接測距模塊TOF的Tx。TOF向UART發送了0x32 0x33 0x6d 0x6d 0x0a?五個字節,對應的ASCII碼是23mm,表示測到的距離。
?
0x32 0x33 0x6d 0x6d 0x0a?對應的示波器上測到波形如下所示,我們來一起分析一下。
?
?
?
?
首先,UART的波特率,配置的是9600。對于串口來說,波特率=比特率,所以串口現在比特率為9600,所以每一個bit需要的時間為100us。所以示波器抓的波形對應的比特流是:
00100110010110011001010110110101011011010010100001
?
對于Uart,我配置的代碼如下:
?
USART_InitStructure.USART_BaudRate = UART4_BAUD; //9600
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No ;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(UART4, &USART_InitStructure);
?
所以Uart的數據位寬為8bit,再加上起始位0,結束為1.所以比特流分割為如下:
0 ?0100 1100??1
0 ?1100 1100 ?1
0 ?1011 0110 ?1
0 ?1011 0110 ?1
0 ?0101 0000 ?1
考慮硬件總線上的數據時序,CPU接收到后的比特序列顛倒: ?
0100 1100 顛倒為 ?0011 0010 ?即為0x32
1100 1100?顛倒為 ?0011 0011 ?即為0x33
1011 0110?顛倒為 ?0110 1101 ?即為0x6d
1011 0110?顛倒為 ?0110 1101 ?即為0x6d
0101 0000?顛倒為 ?0000 1010 ?即為0x0a
?
完美! 發送的0x32 0x33 0x6d 0x6d 0x0a 字節與示波器上測量到的高低電平信號完美相符。
作為嵌入式軟件工程師,對軟硬件的接口分析到這種程度,一般情況下,就夠用了。
-----------------------------上善若水,大智若愚-----------------------------------
總結
以上是生活随笔為你收集整理的Uart接口的详细解释的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UBoot讲解和实践----------
- 下一篇: USB、UART、SPI等总线速率