我有一个在 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 个索引?