USART全名為通用同步/非同步收發傳輸器(universal synchronous asynchronous receiver transmitter),可以透過串列通訊的方式進行傳輸。
STM32具有全雙工的USART,同時支援同步/非同步與半雙工/全雙工等等模式,STM32已將預設的USART2連接到燒錄器同時連結到電腦上,可以直接使用。
1.HAL_UART_Transmit :輪詢方式,阻塞式發送函數(必須等資料傳送完成後MCU才去做其他事情)
//*huart : 看選擇哪個USART填入對應編號
//*pData : 要傳送的資料Buf指針
//Size : 資料長度
//Timeout : 逾時時間
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout)
2.HAL_UART_Transmit_IT : 中斷方式,非阻塞發送函數
//*huart : 看選擇哪個USART填入對應編號
//*pData : 要傳送的資料Buf指針
//Size : 資料長度
HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size)
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart);
void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart)
//使用中斷方式
//將buf當中的前10筆數據發送到usart2,接著等發送完成後進到回調函數
HAL_UART_Transmit_IT(&huart2,buf,10);
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART2);
{
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);
}
}
//使用輪詢方式
HAL_UART_Transmit(&huart2,buf, 10, 100);
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);
//*huart : 看選擇哪個USART填入對應編號
//*pData : 要接收的資料Buf指針
//Size : 等待接收的資料長度
//Timeout : 逾時時間
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
//*huart : 看選擇哪個USART填入對應編號
//*pData : 要接收的資料Buf指針
//Size : 等待接收的資料長度
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart,uint8_t *pData,uint16_t Size);
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart);
//使用中斷,非阻塞方式
//接收USART2的一個byte,假設是0xFF將板載LED燈反轉
HAL_UART_Receive_IT(&huart2, &buf, 1);
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART2)
{
if(buf == 0xFF)
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);
}
}
//使用輪詢方式
HAL_UART_Receive(&huart2,buf, 1, 100);
HAL_UART_GetState();
//EX
while(HAL_UART_GetState(&huart2) == HAL_UART_STATE_BUSY_TX) //查詢UART是否發送結束
char buf[] = "USART2 初始化中.....\r\n";
char buf1[] = "初始化完成\r\n";
char Receivebuf[7];
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART2_UART_Init();
/* USER CODE BEGIN 2 */
if(HAL_OK == HAL_UART_Transmit(&huart2, (uint8_t*)buf, sizeof(buf), 1000)) //顯示初始化是否成功
{
HAL_Delay(1000);
HAL_UART_Transmit(&huart2, (uint8_t*)buf1, sizeof(buf1), 1000); //顯示初始化成功字串
}
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
if (HAL_OK == HAL_UART_Receive(&huart2, (uint8_t*)Receivebuf, 7, 10000)) //如果成功接收到了資料,則將資料傳送出去
{
HAL_UART_Transmit(&huart2, (uint8_t*)Receivebuf, 7, 10000);
}
HAL_Delay(500);
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
這邊介紹一下我覺得挺好用的調適工具-串口調適助手,可以到Microsoft Store當中去下載~
char Txbuf[] = {"USART 中斷測試\r\n"};
char AckBuf[] = {"收到訊息\r\n"};
char Rxbuf[7];
到.ioc當中將USART中斷開啟
先在main當中寫上Receive_IT與Transmit_IT函數,會先傳送上方Txbuf當中的字串做測試,接著要先啟用Receive_IT否則不會進入接收中斷。
/* USER CODE BEGIN 2 */
HAL_UART_Transmit_IT(&huart2, (uint8_t*)&Txbuf, sizeof(Txbuf));
HAL_UART_Receive_IT(&huart2, (uint8_t*)&Rxbuf, 7);
/* USER CODE END 2 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == huart2.Instance)
{
//這邊也可以將AckBuf改為Rxbuf,就可以看到接收到的訊息~
HAL_UART_Transmit_IT(huart, (uint8_t*)&AckBuf, sizeof(AckBuf));
HAL_UART_Receive_IT(huart, (uint8_t*)&Rxbuf, 7);
}
}
以上內容如果有誤的話,麻煩各位通知我。感謝~