[英]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.