1串口通信
串口通信是嵌入式系統和電子設備中最常用的?異步串行通信?方式,核心是通過?TX(發送)?和?R(接收)?兩根線實現全雙工數據傳輸。
2通信協議分類
2.1同步/異步通信
同步和異步是串行通信中兩種根本不同的數據傳輸方式,核心區別在于 是否需要共享時鐘信號 來協調數據傳輸。
2.1.1同步通信
同步通信:帶時鐘同步信號,如IIC接口或者SPI接口都屬于同步通信,要求通信雙方必須使用同一個時鐘,相當于發送數據的同時接收數據,同步通信屬于連續串行傳輸數據,一次只傳輸一幀數據,相比于異步通信而言,傳輸效率更高,缺點是時鐘必須一致
2.1.2異步通信
異步通信:不帶時鐘同步信號,如UART接口屬于異步通信,要求通信雙方具有發送端和接收端,由于不要求時鐘同步,所以在通信的時候,通信雙方必須提前約定好通信格式(字符格式)以及通信速率,異步通信以字符為單位進行傳輸,在傳輸一個字符的時候會添加起始位和停止位,通過起始位以及停止位來達到同步的功能。
2.1.3關鍵對比
對比項 | 同步通信 | 異步通信 |
時鐘信號 | 必需(SCL、SCLK) | 無需 |
數據幀格式 | 無起始/停止位,連續傳輸 | 每幀含起始/停止位 |
速度 | 高(SPI可達100Mbps) | 低(通常<1Mbps) |
距離 | 短(通常<1m) | 長(RS485可達1200m) |
復雜度 | 高(需時鐘同步) | 低(僅需波特率一致) |
典型協議 | SPI、I2C | UART、RS232、RS485 |
2.2串行/并行通信
2.2.1串行通信
傳輸原理:數據按位依次順序傳輸,如發送字節0x41(ASCII 'A')的二進制01000001,從LSB或MSB開始逐個傳輸。
優點:節約引腳資源(最少一根線)、傳輸成本低、傳輸距離遠
缺點:傳輸速度慢
應用領域:一般用于工控設備、測量設備、少部分通信設備? USB? COM口
2.2.2并行通信
傳輸原理:多位數據同時通過多根數據線發送。例如,8位數據0x41通過8根線同時傳輸,每根線對應1位。
優點:傳輸速度快
缺點:占用引腳資源、傳輸成本高、傳輸距離近、抗干擾能力弱(串擾)
應用領域:一般大量數據傳輸,并且傳輸距離較近 ?如計算機總線
2.3單工/半雙工/全雙工通信
2.3.1單工/半雙工/全雙工概念對比
模式 | 數據傳輸方向 | 典型協議/硬件 | 優缺點 |
單工 | 單向固定(A→B) | 廣播、遙控器、FM收音機 | 簡單;無法反向傳輸 |
半雙工 | 雙向交替(A→B或B→A,不同時) | RS485、對講機、I2C | 節省線路;需切換方向,效率較低 |
全雙工 | 雙向同時(A→B和B→A可同時進行) | UART、SPI、電話、USB | 高效;需獨立通道,成本略高 |
2.3.2單工/半雙工/全雙工對比
維度 | 單工 | 半雙工 | 全雙工 |
效率 | 最低 | 中等(需切換方向) | 最高(雙向同時) |
成本 | 最低(單線) | 中等(共享線路) | 較高(獨立通道) |
典型場景 | 廣播、遙控 | 工業總線、對講機 | 電話、USB、高速數據傳輸 |
協議舉例 | FM廣播 | RS485、I2C | UART、SPI、以太網 |
3通信接口
? ? ? ? ?通信雙方可以實現按照某一種協議進行通信的前提是:首先雙方都有一個相同的通信接口。該接口還要可以按照通信協議進行數據的收發。
口協議只規定了按照怎樣的順序傳輸,但是數字量如何轉換,
按照什么電平標準到另一個器件,這個不是協議所規定的
RS232,RS485電平是串口通信過程中的一種電平標準,不是協議
例如:
硬件設備和計算機在通信的時候,需要用到電氣轉換芯片(如MAX232),因為硬件平臺一般采用TTL電平信號(采用正邏輯電平,+5V等價于邏輯1,0V等價于邏輯0),但是計算機采用RS232電平信號(采用負邏輯電平,-15V~-3V 表示邏輯1,+3V~+15V 表示邏輯0)。
????????通信時一般數據都是以二進制進行收發,那么電壓信號在什么情況下為邏輯“1”,在什么情況下為邏輯“0”,這時就需要按照相同的電平規范來接收。
TTL電平規范
COMS
RS485電平規范
4串口通信的參數
????????USART或者UART都是全雙工異步通信,由于不需要時鐘同步,所以就必須要求通信雙方要約定字符格式和通信速率。
4.1字符格式
????????字符格式一般都是采用字符幀的形式進行傳輸,字符幀由起始位、數據位、校驗位、停止位組成。具體的說明可以參考STM32中文參考手冊的26.3.1章節。
UART通信的數據幀格式:1位起始位(‘0’),5~8位數據位,1位校驗位,0.5、1、1.5、2位停止位
起始位:告知接收方數據開始發送。
數據位:保存傳輸的數據
校驗位:分為奇校驗、偶校驗和無校驗,若選擇奇校驗,則數據位和校驗位上1的總個數為奇數,若選擇偶校驗,1的個數為偶數。
(1) 起始位:指的是一幀數據的開始 ? 規定為1bit的低電平
(2) 數據位:指的是有效的信息,可以為7bit(標準ASCII碼)或者8bit(拓展ASCII碼)
(3) 校驗位:指的是對于數據位的簡單校驗,可以確保數據正常發送,也可以避免噪聲的影響,校驗分為奇校驗、偶校驗,校驗位也只占1bit。一般不使用校驗位。
(4) 停止位:指的是一幀數據傳輸完成 ? 停止位一般選擇1bit,規定為高電平
4.2通信速率
通信速率指的是單位時間內傳輸的有效的二進制數的個數,也被稱為波特率,單位為bps。常用的波特率有9600bps、115200bps。 可以根據實際需求進行修改。
舉個例子:一般采用的波特率是9600bps,字符格式選擇8bit數據位、無校驗、1bit停止位,然后再加上1bit的起始位,所以一幀字符占10bit,所以單位時間可以傳輸960幀。
5代碼配置
5.1配置步驟
stm32f4xx_tim.c函數中可以查看
===============================================================================
##### How to use this driver #####
===============================================================================
[..]
(#) Enable peripheral clock using the following functions
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USARTx, ENABLE) for USART1 and USART6?
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USARTx, ENABLE) for USART2, USART3,?UART4 or UART5.
? ?1.使能USART
(#) According to the USART mode, enable the GPIO clocks using?
? RCC_AHB1PeriphClockCmd() function. (The I/O can be TX, RX, CTS,?
or/and SCLK).?
2.使能GPIO
(#) Peripheral's alternate function:?
(++) Connect the pin to the desired peripherals' Alternate?
Function (AF) using GPIO_PinAFConfig() function
3.使用GPIO_PinAFConfig()將引腳復用
(++) Configure the desired pin in alternate function by:
4通過以下方式將引腳配置為復用功能
GPIO_InitStruct->GPIO_Mode = GPIO_Mode_AF
? ? ? ? (++) Select the type, pull-up/pull-down and output speed via?
GPIO_PuPd, GPIO_OType and GPIO_Speed members
(++) Call GPIO_Init() function
(#) Program the Baud Rate, Word Length , Stop Bit, Parity, Hardware?
flow control and Mode(Receiver/Transmitter) using the USART_Init()
function.
5對串口參數進行配置USART_Init()
(#) For synchronous mode, enable the clock and program the polarity,
phase and last bit using the USART_ClockInit() function.
對于同步模式,這個不用
? ? ? (#) Enable the NVIC and the corresponding interrupt using the function?
USART_ITConfig() if you need to use interrupt mode.?
6打開串口中斷,配置NVIC
(#) When using the DMA mode?
(++) Configure the DMA using DMA_Init() function
(++) Active the needed channel Request using USART_DMACmd() function
DMA的,這個不用? ?
? ? ? (#) Enable the USART using the USART_Cmd() function.
7打開串口USART_Cmd()
8編寫中斷服務函數
(#) Enable the DMA using the DMA_Cmd() function, when using DMA mode.?
-@- Refer to Multi-Processor, LIN, half-duplex, Smartcard, IrDA sub-sections
for more details
5.2代碼整體
實現電腦對單片機數據發送,并顯示。使用單片機USART1串口中斷方式
mian.c函數
usart.c
5.3出現問題
數據接收區一直是問號
通過打開示例工程,將代碼復制進去可以用,知道配置沒有錯,最后找到問題出在HSE時鐘上,單片機實際使用時鐘為8MHZ,但是stm32f4xx.h文件中是25MHZ時鐘需要修改。
5.4代碼解析
? 5.4.1結構體USART_InitTypeDef USART_InitStructure;變量配置
- USART_BaudRate???????????? 指的是波特率?? ?????????? 常用9600bps? 115200bps
- USART_WordLength??????? 指的是數據位??????? ?? 常用8bit?? 低位先出
- USART_StopBits?????????????? 指的是停止位??????? 常用1bit
- USART_Parity?????????? 指的是校驗位??????? 常用無校驗
- USART_Mode????????? 指的是串口模式 常用收發模式? USART_Mode_Rx | USART_Mode_Tx
- USART_HardwareFlowControl??????? 指的是硬件流控制?? 常用無
5.4.2指定USART中斷源,收到數據就發生中斷
編寫中斷服務函數,一般需要提前設置好串口中斷的觸發條件,一般觸發條件都會設置為接收到數據就發生中斷。
ST公司提供了一個函數可以設置串口中斷源,調用USART_ITConfig()函數
一般在中斷服務函數中需要檢測中斷是否發生(檢測中斷狀態)以及清除中斷狀態即可。
5.4.3中斷服務函數
發送數據
接收數據(需要在中斷服務函數中調用該函數來接收數據)
讀取狀態
狀態寄存器
?USART_GetFlagStatus(USART1,USART_FLAG_TXE) ;//檢測發送寄存器發完,為空
USART_ClearITPendingBit(USART1,USART_IT_RXNE); //清除中斷標志
6藍牙模塊使用
6.1引腳連接
VCC---5V
Trig---觸發信號輸入(模塊輸入單片機發來的信號)----隨便找個引腳配置輸出模式
Echo---回想信號輸出(模塊輸出單片機輸入)---隨便找個引腳配置輸入模式
GND---GND
6.2超聲波原理
Trig連接的單片機引腳配置輸出模式,輸出一個至少10us的觸發信號;第二部模塊來做,完成后通過IO口輸出一個高電平信號給單片機;高電平信號由與測試距離成正比,通過定時器記錄輸入高電平持續時間,根據公式得出距離。
為了超聲波測距更加準確可以采用溫度補償
6.3超聲波距離計算
通過檢測到的高電平持續的時間,計算實際距離
已知測距精度是3mm,聲速按照340米每秒算
得到3mm,用時9us,只需在每9us計數一次,知道有多少個9us,便知有多少個3mm。得到的往返距離再除以2,得到實際距離。
6.4代碼展示
main.c
.main.h
gpio.c
gpio.h
6.5遇到問題
說實話并沒有實現,將代碼復制到示例工程中實現了。但是我工程沒實現,沒有串口發送數據。
且stm32f4xx.h和system_stm32f4xx.c,中時鐘和鎖相環都改過了。
明天可能繼續往下寫,可能繼續找該問題解決方式