1

我有一个在 STM32F1 上运行的基于中断(RXNE)的接收周期。我只使用接收命令,即:

HAL_UART_Receive_IT(&huart3, RxBuffer, sizeof(RxBuffer));

因此,我收到一条消息,然后写入我的缓冲区:

uint8_t RxBuffer[25];

使用RxBuffer的内容后,我正在使用此函数清除此数组:

memset(RxBuffer, '\0', sizeof(RxBuffer));

传入的数据永远不会大于 24 字节顺便说一句。在接收到另一个数据并将其写入RxBuffer之前一切正常。当接收到下一个数据时,发生了一些奇怪的事情,并且HAL_UART_Receive_IT(&huart3, RxBuffer, sizeof(RxBuffer));函数开始将数据填充到我的RxBuffer中,它在上次接收时留下了哪个字节。

例如;

1 -> RxBuffer 通常用 NULL 初始化

RxBuffer = {'\0', '\0', '\0', '\0', ... '\0'}(25 字节空)

2 -> 收到第一个数据后,它变成这样

RxBufer = "xc32 CMD1 400 200 50"(总共 20 个字节,最后 5 个字节仍然为 NULL)

RxBuffer = {'x', 'c', '3', '2', ' ', 'C' ... '\0', '\0', '\0'}

memset(...)3 -> 然后我使用函数清除缓冲区内容。

RxBuffer = {'\0', '\0', '\0', '\0', ... '\0'}(再次为 25 字节 NULL)

4 -> 在接收到另一个数据后,如“xc32 CMD2”:

RxBuffer = {'C', 'M', 'D', '2', '\0', '\0', '\0' ... 'x', 'c', '3', '2', ' '}(仍然是 25 个字节的数据,但 UART 开始写入上次中断的字节数据,它变成了一些移位的狗屎..)

它的行为就像一个环形缓冲区。如何正确执行此接收过程以使其每次接收都开始缓冲区的第 0 个索引?

4

2 回答 2

1

因为它是中断例程,所以它在后台工作。并且它将接收数据到这个缓冲区,直到缓冲区结束。

如果您的数据不是固定长度,您应该启用“IDLE”中断并在此中断处理程序中处理数据(或者在 HAL 回调中更好)。然后重新开始接收。

于 2021-08-20T13:32:37.750 回答
0

该问题可以通过使用 DMA 逐字节接收数据来解决。

char rx_buff[10];
HAL_UART_Receive_DMA(&huart1, (uint8_t*)rx_buff, 1);

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    ...
    array[i++] = rx_buff[0];
    /* Then reset buffer using bzero() or memset() */
}
于 2021-08-23T17:56:27.853 回答