緊接著上一篇博文,,,
4 撰寫串口中斷函式
當中斷發生的時候,程式就會執行中斷服務函式,我們在中斷服務函式中撰寫相應的邏輯代碼就可以了,
5串口資料接收和發送
這里需要介紹幾個串口發送接收的函式
HAL_UART_Transmit();//串口發送資料,使用超時管理機制
HAL_UART_Receive();//串口接收資料,使用超市管理機制
HAL_UART_Transmit_IT();//串口中斷模式發送
HAL_UART_Receive_IT();//串口中斷模式接收
HAL_UART_Transmit_DMA();//串口DMA模式發送
HAL_UART_Transmit_DMA();//串口DMA模式接收
接下來講解幾個
串口發送資料
HAL_UART_Transmit(UART_HandleTypdef *huart,uint8_t *pData,uint16_t Size,uint32_t Timeout);
/**
功能:串口發送指定長度的資料,如果超時沒有發生完成,則不在發送,并回傳超時標志
引數: UART_HandleTypdef *huart :串口別名 UART_HandleTypeDef huart1; 別名就是huart1
*pData:需要發送的資料
Size:發送的位元組數
Timeout:最大發送時間,發送時間超出的話停止發送
**/
串口中斷接收資料
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
/**
功能:串口中斷接收,以中斷方式接收指定長度資料,大致程序就是設定資料存放位置,接收資料長度,然后使能串口中斷,接收到資料時,會觸發串口中斷
在然后,串口中斷函式處理,知道接收到指定長度資料,,而后關閉中斷,進入中斷接識訓呼函式,不在觸發接收中斷,所以說是只會觸發一次中斷,
引數:UART_HandleTypeDef *huart 和發送函式一樣的意思,串口的別名
*pData:接收到的資料存放的地址
Size:接收的位元組數
**/
6.串口中斷回呼函式
在HAL庫生成的代碼檔案中,stm32l0xx_it.c檔案里面存放的就是各個中斷函式,只需找到對應的串口中斷,外部中斷或者定時器中斷,右擊到函式定義,就能在中斷函式定義里面找到中斷回呼函式,發送串口中斷回呼一般是*HAL_UART_TxCpltCallback(UART_HandleTypeDef huart);
HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart);
接收串口中斷回呼一般是*HAL_UART_RxCpltCallback(UART_HandleTypeDef huart);
HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
只需要在你需要添加的地方重寫一下這個函式就可以了,要注意包含頭檔案,下面是我的一個串口接收中斷回呼,僅供參考
oid HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(Uart1_Rx_Cnt >= 255) //溢位判斷
{
Uart1_Rx_Cnt = 0;
memset(RxBuffer,0x00,sizeof(RxBuffer));
HAL_UART_Transmit(&huart1, (uint8_t *)"資料溢位", 10,0xFFFF);
}
else
{
RxBuffer[Uart1_Rx_Cnt++] = aRxBuffer; //接收資料轉存
if((RxBuffer[Uart1_Rx_Cnt-1] == 0x0A)&&(RxBuffer[Uart1_Rx_Cnt-2] == 0x0D)) //判斷結束位
{
HAL_UART_Transmit(&huart1, (uint8_t *)&RxBuffer, Uart1_Rx_Cnt,0xFFFF); //將收到的資訊發送出去
while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);//檢測UART發送結束
Uart1_Rx_Cnt = 0;
memset(RxBuffer,0x00,sizeof(RxBuffer)); //清空陣列
}
}
HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1); //再開啟接收中斷
}
7.串口發送重定義
? 每次通過串口發送資料的時候,都去呼叫HAL_UART_Transmit函式,會感覺到些許麻煩,每次都需要配置四個引數,與我們初學C語言時的printf函式對比起來就方便性就差太多了,所以我一般都是將HAL_UART_Transmit函式重定義到printf,就使用printf就可以直接發送了,
? 將以下代碼撰寫在uart.c中
//串口輸出重定義到printf
int fputc(int ch, FILE *C)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
return ch;
}
**注意:**頭檔案需要包含標準庫,也就是stdio.h,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/297372.html
標籤:其他
