Uart進行的串列埠收發

guaiti發表於2021-01-02

Uart進行的串列埠收發


使用hal庫來完成,使用快取陣列進行儲存

HAL_Uart_Transmit(&huart1,TXT,sizeof(TXT),1);
第一個引數是要使用的串列埠控制程式碼地址,比如要使用U(S)ART1,引數就設定為U(S)ART1的控制程式碼地址&huart1
第二個引數是要傳送的資料緩衝區首地址
第三個引數是傳送的資料長度,這裡可以直接用sizeof()函式獲取傳送緩衝區的長度
第四個引數是超時時間,單位是ms,如果超過設定的時間,則函式返回HAL_TIMEOUT,如果設定為HAL_MAX_DELAY,處理器就會一直等到資料傳送完成再執行下一條語句。

(設定USART1為非同步模式,無硬體流控)

TXT陣列為uint8_t,按asc碼儲存,即char

使用printf過載函式以便於串列埠輸出

複製程式碼
#include “stdio.h”

#ifdef GNUC
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
複製程式碼
串列埠接收

HAL_Uart_Receive_IT(&Uart1,TXT,sizeof(TXT))
HAL_Uart_Transmit_IT(&Uart1,TXT,sizeof(TXT))

第一個引數時要使用的串列埠控制程式碼地址
第二個引數是傳送/接受緩衝區的首地址,用於存放要傳送/接收的資料
第三個引數是傳送/接受緩衝區長度

前三個引數和阻塞方式完全一致,為什麼沒有超時時間了呢?
因為中斷(IT)方式配置完成暫存器之後不需要再佔用CPU,會在接受完成後觸發中斷。

(使uart全域性中斷

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
HAL_UART_Transmit(&huart1,TXT,sizeof(TXT),100);
HAL_UART_Receive_IT(&huart1,TXT,sizeof(TXT));
}
接受後傳送回串列埠

這裡想要取出TXT的值可以在trans前操作,注意TXT為u8即字串陣列,故按索引取出,取數字注意減‘0’;

同時陣列注意多開兩位,回車為\r\n,佔兩位。

相關文章