一、串口通信基礎概念
串口通信(Serial Communication)是一種在計算機和外部設備之間進行數據傳輸的通信方式。它通過串行方式逐位傳輸數據,是最基本和常用的通信接口之一。
主要特點
1.?串行傳輸
(1)數據按位順序傳輸,一次只能傳輸一位
(2)相比并行通信,串口通信使用更少的線路
(3)傳輸距離可以更遠,抗干擾能力更強
2. 異步通信
(1)發送方和接收方使用獨立的時鐘
(2)通過起始位和停止位來同步數據
(3)不需要共享時鐘信號
二、通信基礎?
1.時鐘信號劃分
1.1通信方式
異步通信
無需時鐘信號,數據通過起始位和停止位同步。
同步通信
需要時鐘信號同步數據傳輸。
1.2傳輸方式
同步傳輸
(1)發送方和接收方使用相同的時鐘
(2)數據傳輸效率高需要時鐘同步機制
異步傳輸
(1)發送方和接收方使用獨立的時鐘
(2)通過起始位和停止位同步
(3)實現簡單,但效率較低
(4)但是并不是說通信的過程不同步(UART)
2.數據傳輸方式
2.1通信方式
串行通信
使用串行傳輸的方式傳輸數據
并行通信
使用并行傳輸的方式傳輸數據
2.2傳輸方式
串行傳輸
(1)數據按位順序傳輸
(2)只需要一條傳輸線
(3)傳輸距離遠,成本低
(4)速度相對較慢
并行傳輸
(1)多位數據同時傳輸
(2)需要多條傳輸線
(3)傳輸距離短,成本高
(4)速度相對較快
3.通信方向劃分
單工:要么收,要么發,只能做接收設備或者發送設備。比如收音機
一根信號線只能單向發送或單向接收
半雙工:可以收,可以發,但是不能同時收發, 比如對講機
一根信號線可以接收數據也可以發送數據,但是兩者不能同時進行
全雙工:可以在同一時刻既接收,又發送。 手機
兩根信號線,一根發送數據,另一根接收數據,真正實現同時收發數據,速度快
4.常見通信總結
通信標準 | 引腳說明 | 通信方式 | 通信方向 |
---|---|---|---|
UART(通用異步收發器) | TXD:?發送端<br>RXD: 接受端<br>GND: 公共地 | 異步通信 | 全雙工 |
單總線(1-wire) | DQ:?發送/接受端 | 異步通信 | 半雙工 |
SPI | SCK: 同步時鐘<br>MISO: 主機輸入,從機輸出<br>MOSI: 主機輸出,從機輸入<br>SS: 片選 | 同步通信 | 全雙工 |
I2C | SCL: 同步時鐘<br>SDA: 數據輸入/輸出端 | 同步通信 | 半雙工 |
?三、UART
1.通用同步/異步收發器
USART:通用同步/異步收發器是一種集成在微控制器或通信芯片中的硬件模塊,它幾支持同步通信,也支持異步 通信,但是在STM32中一般是同步
2.串口通信協議
2.1.概念
串口通信協議是一種數據逐位(bit)依次傳輸的通信方式,常用于點對點的短距離數據交換。
最常見的串口通信協議是RS-232、RS-485等。
2.2.基本特性
異步通信:無需專用時鐘線,數據幀通過起始位和停止位同步。
全雙工:可以同時進行收發(如UART)。
點對點:一般只連接兩個設備。
2.3.基本屬性
波特率:衡通信速度,表示美妙傳送點bit的個數
數據位:表示通信中實際數據位的個數,一般是5、7、8位
起始、停止位:數據包從起始位開始,到停止位結束。停止位置在的典型的值為1,1.5和2位。
2.4.奇偶校驗位:在串口通信中一種簡單的檢錯方式(在每個數據字節后面增加1位校驗位,用于檢測數據在傳輸過程中是否發生了單比特錯誤。)
3.USART結構圖

3.1.發送流程:
(1)CPU將數據寫入USART_TDR(2)硬件自動將TDR數據復制到移位寄存器(3)移位寄存器逐位將數據發送到TX引腳
3.2.接收流程:
(1)數據到達RX引腳(2)移位寄存器逐位收集數據(3)數據完整后硬件自動轉義至RDR
4.相關寄存器
4.1. 數據接收寄存器(Receive?Data?Register)
(1)作用:用于存放USART接收到的數據。
(2)工作原理:當USART模塊收到一個字節的數據后,會自動將其存入數據接收寄存器。CPU可以從該寄存器讀取數據。
(3)數據接收寄存器32位代表的含義:
4.2. 數據發送寄存器(Transmit Data?Register)
(1)作用:用于存放即將通過USART發送的數據。
(2)工作原理:CPU將要發送的數據寫入該寄存器,USART模塊會自動將其發送出去。如圖:
(3)數據發送寄存器32位代表的含義:
4.3. 中斷和狀態寄存器(Interrupt?and?Status?Register)
(1)作用:用于指示USART的各種狀態(如發送完成、接收完成、溢出、錯誤等),并控制中斷的使能與響應。
(2)中斷和狀態寄存器32位代表的含義:
(3)常見標志位:
TXE(Transmit Data Register Empty):發送寄存器空,可以寫新數據
RXNE(Read?Data Register?Not Empty):接收寄存器非空,有新數據可讀
TC(Transmission?Complete):發送完成
ORE(Overrun?Error):溢出錯誤
(4)例如第七位是寄存是發送寄存器是否為空的狀態:
4.4. 波特率寄存器(Baud Rate Register)
(1)作用:用于設置USART通信的波特率(即每秒傳輸的比特數)。
(2)波特率寄存器32位代表的含義:
4.5.總結
寄存器名稱 | 作用 | 常見寄存器名 | 典型操作 |
---|---|---|---|
數據接收寄存器 | 存放接收到的數據 | RDR | 讀取數據 |
數據發送寄存器 | 存放待發送的數據 | TDR | 寫入數據 |
中斷和狀態寄存器 | 狀態指示和中斷控制 | ISR | 判斷狀態/響應中斷 |
波特率寄存器 | 設置通信速率 | BRR | 設置波特率 |
五、實現串口通信
關鍵在于:通過寄存器實現輸出數據,每一個代碼
還有代碼必須寫在特定位置才行
1.一秒發送一字節數據
2.封裝進函數可以直接調用輸出
3.修改自寫函數實現通信功能
打開連接串口,燒錄程序后,復位后,串口就可以接收到數據。
六、ptintf重定向
int printf(const char * format,...)
printf函數底層調用的是fputc函數,fputs是將要發送的數據寫入到標準輸出流stdout
int fputc(int /*c*/, FILE * /*stream*/)
因此如果想讓printf將數據輸出到串口,需要重寫fputc
1.添加串口通信
2.設置代碼輸出名字和格式
3.勾選選項
4.為你的STM32工程啟用 MicroLIB 微型C庫
5.導入庫函數
6.重寫函數
七、scanf重定向
1.添加頭文件
2.重寫fgetc函數
八、HAL庫函數
1.串口發送函數
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout)
功能:以阻塞模式通過串口發送數據
參數:UART_HandleTypeDef * huart 設備的句柄(用的是哪個串口)uint8_t * pData 要輸出的緩存區首地址 (要發的數據)uint16_t Size 發送的數據量 (發送多少個字節的數據)uint32_t Timeout 超時時間 (給他發送的最長時間)
返回值:發送狀態

2.串口接收函數
和重定向的scanf最大區別在于:這個函數不會阻塞進程,缺點就是有時候可能會取不到值。
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)功能:以阻塞模式通過串口接收數據參數:UART_HandleTypeDef * huart 設備的句柄uint8_t * pData 輸入緩存區首地址 uint16_t Size 接收的數據量uint32_t Timeout 超時時間(會等待這些時間來接收數據)返回值:接收狀態
