做一個類似京東的網(wǎng)站免費發(fā)布推廣的平臺
STM32 兩個單片機之間的通信
原創(chuàng)?HS?平凡靈感碼頭?2025年03月04日 11:25?廣東
以上我們就是有A B兩個板子來進行通信,A板將接收按鍵的鍵值,然后發(fā)送給B板,B板接收鍵值,然后判斷鍵值控制LED翻轉(zhuǎn),然后把鍵值按字符形式發(fā)送給PC
主函數(shù)展示
#define?SENDAint?main(){init(115200);init_Usart2(115200);Key_Init();led_init();u8 key;u8 data;while(1){#ifdef SENDA ? ?//發(fā)送版key = key_an();if(key !=?0xff) send_Uart2(key);#else?//接收板data = rece_Uart2();switch(data){case?1: LED1_OVERTURN ; send_Uart(data+48);?break;case?2: LED2_OVERTURN ; send_Uart(data+48);?break;case?3: LED3_OVERTURN ; send_Uart(data+48);?break;case?4: LED4_OVERTURN ; send_Uart(data+48);?break;}#endif}return?0;}
關(guān)鍵代碼解釋
條件編譯
ifdef?SENDA
??// 發(fā)送端代碼
#else
??// 接收端代碼
#endif
通過是否定義?SENDA
?宏,編譯不同的代碼段,實現(xiàn)同一份代碼適配發(fā)送/接收兩種硬件。就是先把A板發(fā)送端的代碼燒錄進去,接著我們把定義的#define?SENDA注釋掉,就可以把接受端的代碼燒錄進去,接著就連接兩個板子的PA2和PA3。就可以完成通信了。
按鍵檢測:
?=?key_an(); ?// 獲取鍵值,0xff 表示無按鍵
if?(key !=?0xff)?send_Uart2(key);?// 發(fā)送有效鍵值
發(fā)送端通過?key_an()
?掃描按鍵,檢測到按鍵后通過 UART2 發(fā)送鍵值。
LED 控制:
case?1: LED1_OVERTURN; send_Uart(data+48);?break;
LED1_OVERTURN
?是翻轉(zhuǎn) LED1 狀態(tài)的宏,send_Uart(data+48)
?將接收到的數(shù)字轉(zhuǎn)為 ASCII 字符(如?1
?→?'1'
)通過主串口(如 UART1)發(fā)送,可能用于調(diào)試輸出。
1. 單片機通信的關(guān)鍵技術(shù)
(1) 硬件接口
單片機之間的通信依賴于?物理層接口,常見的硬件接口包括:
- UART(串口通信)
:常用于點對點通信,簡單易用,如?PA2(TX) ? PA3(RX)。
- I2C(兩線通信)
:適合多個設(shè)備通信,比如傳感器數(shù)據(jù)采集。
- SPI(高速通信)
:常用于高速數(shù)據(jù)傳輸,如屏幕驅(qū)動、SD 卡等。
- CAN(車載總線)
:用于汽車、工業(yè)控制,抗干擾能力強。
- RS485(長距離通信)
:適合多機通信,抗干擾能力強。
本次實驗采用?UART(串口通信),是一種最基礎(chǔ)、最常用的通信方式。
(2) 通信協(xié)議
通信協(xié)議?規(guī)定了數(shù)據(jù)的格式、傳輸順序、錯誤校驗等。常見的協(xié)議包括:
- 自定義協(xié)議
:簡單易用,比如本實驗中直接傳輸?按鍵鍵值。
- 標(biāo)準(zhǔn)協(xié)議
:
- Modbus(工業(yè)控制協(xié)議)
- MQTT(物聯(lián)網(wǎng)協(xié)議)
- Zigbee(無線通信協(xié)議)
在本實驗中,我們使用的是?簡單的自定義協(xié)議:
-
發(fā)送端(A 板):按鍵值?→ 通過 UART 發(fā)送
-
接收端(B 板):解析鍵值?→ 控制 LED 并反饋給 PC
(3) 數(shù)據(jù)格式與編碼
- ASCII 編碼
:如?
1 → '1'
(data + 48
)。 - 二進制數(shù)據(jù)
:直接傳輸數(shù)值,如?
0x01, 0x02
。 - 幀格式
:
- 幀頭
(表示數(shù)據(jù)起始)
- 數(shù)據(jù)
(按鍵值)
- 校驗
(確保數(shù)據(jù)正確性)
- 幀頭
在本實驗中:
-
直接使用?單字節(jié)數(shù)據(jù)?傳輸?按鍵值,簡單高效。
(4) 波特率、數(shù)據(jù)格式
- 波特率(Baud rate)
:決定數(shù)據(jù)傳輸速率,本實驗使用?
115200
。 - 數(shù)據(jù)格式
:
- 數(shù)據(jù)位
:8 位
- 停止位
:1 位
- 校驗位
:無校驗(更簡單)
- 數(shù)據(jù)位
不同設(shè)備通信時,波特率、數(shù)據(jù)格式必須匹配,否則可能發(fā)生數(shù)據(jù)丟失或亂碼。
(5) 數(shù)據(jù)檢測與錯誤處理
- 數(shù)據(jù)幀校驗(Checksum)
:可以防止數(shù)據(jù)傳輸錯誤。
- 超時機制
:如果長時間未收到數(shù)據(jù),需要重新發(fā)送。
- 去抖動處理
:防止按鍵抖動導(dǎo)致誤觸發(fā)。
在本實驗中,簡單處理:
- 接收數(shù)據(jù)后判斷是否為有效按鍵值
(
1~4
)。 - 發(fā)送 ASCII 數(shù)據(jù)給 PC,方便調(diào)試
。
2. 學(xué)習(xí)重點
(1) 串口通信(UART)
-
熟練掌握?UART 初始化、發(fā)送、接收。
-
掌握?串口調(diào)試助手?的使用。
-
理解?波特率、數(shù)據(jù)格式、校驗方式。
(2) 按鍵掃描
-
理解?按鍵去抖動?方法(延時法、狀態(tài)機法)。
-
能夠?檢測按鍵狀態(tài)?并發(fā)送數(shù)據(jù)。
(3) LED 控制
-
掌握?GPIO 端口控制。
-
學(xué)習(xí)?LED 翻轉(zhuǎn)(OVERTURN)實現(xiàn)。
(4) 代碼優(yōu)化
-
掌握?條件編譯(#ifdef),便于在?發(fā)送端/接收端?之間切換。
-
學(xué)習(xí)?如何設(shè)計通信協(xié)議(如加幀頭、校驗)。
(5) 調(diào)試技巧
- 串口調(diào)試助手
:用于觀察數(shù)據(jù)是否正確。
- printf 調(diào)試
:在 PC 端輸出接收數(shù)據(jù),便于分析問題。
- 邏輯分析儀
:用于檢查信號是否正確(高級調(diào)試)。
3. 進階學(xué)習(xí)方向
如果掌握了基本的 UART 通信,可以進一步學(xué)習(xí):
- I2C、SPI 通信
:用于 LCD 顯示、傳感器讀取等。
- RS485、CAN 通信
:用于工業(yè)總線、多設(shè)備通信。
- 無線通信(BLE、Wi-Fi、LoRa)
:用于物聯(lián)網(wǎng)應(yīng)用。
- 嵌入式操作系統(tǒng)(RTOS)
:用于多任務(wù)通信管理。