我每秒通過 UART 通信從傳感器獲取 10 個位元組。但我不需要所有位元組,實際上只需要某些位元組。現在我要做的是將所有位元組保存到一個陣列中并創建兩個 newuint8_t并從我需要的緩沖區陣列中為它們分配位元組。
有沒有辦法只接收和保存我首先需要的位元組而不是全部 10 個?
uint8_t buffer[10];
HAL_UART_Receive_DMA(&huart4, (uint8_t*)buffer, 10)
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart4)
{
uint8_t value1 = buffer[4];
uint8_t value2 = buffer[5];
.
.
.
}
uj5u.com熱心網友回復:
在 DMA 模式下,您需要提供完整大小的緩沖區。沒有其他方法,因為接收不受核心控制(它是在后臺完成的)并且 DMA 控制器信號結束(如果你想要一半和錯誤條件,則是事務的結束)
uj5u.com熱心網友回復:
只需獲取一個指標即可簡化緩沖區代碼。
uint16_t * value = (uint16_t *) &buffer[4];
但是對于接收時使用 DMA 和 UART 的不需要的位元組,您別無選擇。所有接收到的位元組都必須從 UART 中讀出,否則 UART FIFO 中會存在陳舊資料。
但是,您可以在函式中隱藏一些丑陋之處:
// Explanation of why we only need certain bytes.
uint16_t get_important_rx_data(void)
{
return (uint16_t *) &buffer[4];
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart4)
{
uint16_t * value = get_important_rx_data();
.
.
.
}
這還將提供一些從訊息格式到您的代碼的抽象。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/324788.html
上一篇:單次使用后在宏內部取消定義常量
下一篇:洗掉C中動態分配陣列的最后一個值
