繁体   English   中英

为什么 UART 继续写入我的 25 字节缓冲区,它停止了哪个字节?

[英]Why does UART keep continuing to write my 25 byte buffer which byte it left off?

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

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

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

uint8_t RxBuffer[25];

使用RxBuffer的内容后,我使用 function 清除这个数组:

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

传入的数据永远不会超过 24 字节 btw。 一切正常,直到收到另一个数据并将其写入RxBuffer 当接收到下一个数据时,会发生一些奇怪的事情, HAL_UART_Receive_IT(&huart3, RxBuffer, sizeof(RxBuffer)); function 开始将数据填充到我的RxBuffer中,它在上次接收时遗漏了哪个字节。

例如;

1 -> RxBuffer 通常用 NULL 初始化

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

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

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

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

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

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 个索引开始?

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

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

这个问题可以通过使用 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() */
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM