STM32之UART
UART,是通用異步收發(fā)傳輸器(Universal Asynchronous Receiver/Transmitter),既然是“器”,顯然,它就是個設(shè)備而已,要完成一個特定的功能的硬件,它本身并不是協(xié)議。那么它要完成什么功能呢?它的最基本功能,是串行數(shù)據(jù)和并行數(shù)據(jù)之間的轉(zhuǎn)換。我們知道,計算機中的數(shù)據(jù)以Byte為基本單位,對一個Byte的存取是并行的,即,同時取得/寫入8個bit。而串行通信,需要把這個Byte“打碎”,按照時間順序來收發(fā)以實現(xiàn)串行。
RS232/RS485,是兩種不同的電氣協(xié)議,也就是說,是對電氣特性以及物理特性的規(guī)定,作用于數(shù)據(jù)的傳輸通路上,它并不內(nèi)含對數(shù)據(jù)的處理方式。比如,最顯著的特征是:RS232使用3-15v有效電平,而UART,因為對電氣特性并沒有規(guī)定,所以直接使用CPU使用的電平,就是所謂的TTL電平(可能在0~3.3V之間)。更具體的,電氣的特性也決定了線路的連接方式,比如RS232,規(guī)定用電平表示數(shù)據(jù),因此線路就是單線路的,用兩根線才能達到全雙工的目的;而RS485, 使用差分電平表示數(shù)據(jù),因此,必須用兩根線才能達到傳輸數(shù)據(jù)的基本要求,要實現(xiàn)全雙工,必需用4根線。但是,無論使用RS232還是RS485,它們與UART是相對獨立的,但是由于電氣特性的差別,必須要有專用的器件和UART接駁,才能完成數(shù)據(jù)在線路和UART之間的正常流動。
普通方式的串口
/* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */if(HAL_UART_Receive(&huart1, &c, sizeof(c), 1000) == HAL_OK){if(c == '\r'){HAL_UART_Transmit(&huart1, (uint8_t*)"\n", sizeof("\n"), 1000);}HAL_UART_Transmit(&huart1, &c, sizeof(c), 1000);}}/* USER CODE END 3 */串口使用printf()
#include <stdio.h> #ifdef __GNUC__ int __io_putchar(int ch) {HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 100);if(ch == '\n')HAL_UART_Transmit(&huart1, (uint8_t*)"\r", 2, 100);return ch; } #endif中斷方式UART
先在主函數(shù)中初始調(diào)用一次中斷接收
/* Initialize all configured peripherals */MX_GPIO_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 */HAL_UART_Receive_IT(&huart1, &c, sizeof(c));/* USER CODE END 2 */注冊接收完成的回調(diào)函數(shù),這個函數(shù)是弱函數(shù)
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {if(huart == &huart1){if(c == '\r'){HAL_UART_Transmit_IT(huart, (uint8_t*)"\n\r", sizeof("\n\r"));}else{HAL_UART_Transmit_IT(huart, &c, sizeof(c));}}HAL_UART_Receive_IT(huart, &c, sizeof(c)); }HAL_UART_Transmit_IT只發(fā)送一次數(shù)據(jù),下次發(fā)送需要等待下次中斷
//第二行代碼不會生效,只會發(fā)送"ab",而不會發(fā)生"abcde",或者被覆蓋成"cde"//這與中斷的結(jié)構(gòu)有關(guān)HAL_UART_Transmit_IT(huart, (uint8_t*)"ab", sizeof("ab"));HAL_UART_Transmit_IT(huart, (uint8_t*)"abc", sizeof("abc"));DMA串口
以USART1為例
MX配置完DMA通道的代碼
總結(jié)
以上是生活随笔為你收集整理的STM32之UART的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【QT实现TCP和UDP协议通信(一)】
- 下一篇: IIC、SPI和UART区别