在不定長串口數據接收方面,有多種方式可供選擇。以下是幾種常見的方法:1. 基于幀頭幀尾:通過在數據幀的開頭和結尾添加特定的幀頭和幀尾標識來確定數據的起始和結束。在接收端,通過檢測幀頭和幀尾來截取完整的數據幀。這種方法需要約定好幀頭和幀尾的標識,并在接收端進行相應的處理。例如,可以使用特定的字符或字節序列作為幀頭和幀尾標識。
#define FRAME_HEAD 0xAA#define FRAME_TAIL 0x55
uint8_t rxBuffer[100];uint8_t rxIndex = 0;uint8_t frameStarted = 0;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){ if (huart->Instance == USART1) { if (rxData == FRAME_HEAD) { frameStarted = 1; rxIndex = 0; } else if (rxData == FRAME_TAIL && frameStarted) { // 完整的數據幀接收完成,進行處理 // rxBuffer 中保存了完整的數據幀 // 可以進行后續的數據解析和處理操作 frameStarted = 0; } else if (frameStarted) { rxBuffer[rxIndex++] = rxData; }
HAL_UART_Receive_IT(&huart1, &rxData, 1); }}
2. 基于定長數據:如果數據包的長度是固定的,可以通過設定一個固定的字節數來接收數據。在達到指定的字節數后,即可認為接收到了完整的數據。這種方式適用于數據包長度固定且已知的情況。
#define DATA_LENGTH 10
uint8_t rxBuffer[DATA_LENGTH];
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){ if (huart->Instance == USART1) { // 完整的數據包接收完成,進行處理 // rxBuffer 中保存了完整的數據包 // 可以進行后續的數據解析和處理操作
HAL_UART_Receive_IT(&huart1, rxBuffer, DATA_LENGTH); }}
3. 基于超時機制:在串口接收時,可以設置一個超時時間,如果在規定的時間內沒有接收到數據,即認為當前數據接收結束。通過不斷檢查接收狀態和計時器,可以實現超時機制。這種方式適用于數據包長度不確定且無法使用幀頭幀尾方式的情況。
#define TIMEOUT_MS 100
uint8_t rxBuffer[100];uint8_t rxIndex = 0;uint32_t startTime = 0;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){ if (huart->Instance == USART1) { if (rxIndex == 0) { startTime = HAL_GetTick(); }
rxBuffer[rxIndex++] = rxData;
if (rxIndex >= 2 && HAL_GetTick() - startTime >= TIMEOUT_MS) { // 接收超時,數據接收結束 // 進行數據處理操作 rxIndex = 0; }
HAL_UART_Receive_IT(&huart1, &rxData, 1); }}
4. 基于特定字符:可以通過在數據中插入特定的字符來表示數據的開始和結束。接收端可以根據特定的字符來判斷數據的起始和結束。例如,可以使用換行符('\n')或回車符('\r')作為數據的起始和結束標識。
#define START_CHAR '\n'#define END_CHAR '\r'
uint8_t rxBuffer[100];uint8_t rxIndex = 0;uint8_t frameStarted = 0;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){ if (huart->Instance == USART1) { if (rxData == START_CHAR) { frameStarted = 1; rxIndex = 0; } else if (rxData == END_CHAR && frameStarted) { // 完整的數據接收完成,進行處理 // rxBuffer 中保存了完整的數據 // 可以進行后續的數據解析和處理操作 frameStarted = 0; } else if (frameStarted) { rxBuffer[rxIndex++] = rxData; }
HAL_UART_Receive_IT(&huart1, &rxData, 1); }}
5. 基于計數:可以在接收端設置一個計數器,根據接收到的數據逐步增加計數器的值。當達到指定的計數值時,即認為接收到了完整的數據。這種方式適用于在接收到固定數量的數據后即認為數據接收完成的情況。
#define FRAME_LENGTH 10
uint8_t rxBuffer[FRAME_LENGTH];uint8_t rxIndex = 0;uint8_t frameStarted = 0;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){ if (huart->Instance == USART1) { if (frameStarted) { rxBuffer[rxIndex++] = rxData; if (rxIndex == FRAME_LENGTH) { // 完整的數據接收完成,進行處理 // rxBuffer 中保存了完整的數據 // 可以進行后續的數據解析和處理操作 frameStarted = 0; } } else { // 如果接收到起始字符,則開始計數 if (rxData == START_CHAR) { frameStarted = 1; rxIndex = 0; } }
HAL_UART_Receive_IT(&huart1, &rxData, 1); }}
-
數據
+關注
關注
8文章
6909瀏覽量
88849 -
串口
+關注
關注
14文章
1547瀏覽量
76231
發布評論請先 登錄
相關推薦
評論