重用 uint8_t 缓冲区来存储 UART 响应

问题描述

我有一个 uint8_t rxBuffer[200] = {0}; 数组。

缓冲区接收来自 UART 的消息 USART1.Receive(rxBuffer,sizeof(rxBuffer));

我想在这个 rxBuffer 中接收 UART 响应,解析它们,然后重用这个数组来解析进一步的响应。如何清除此缓冲区并重新使用它?

我尝试使用 memset(rxBuffer,sizeof rxBuffer);,但是当我尝试打印出缓冲区内容时,调试控制台上没有打印任何内容

在这里做错了什么?

我将提供我正在尝试做的事情的 sudo 代码

uint8_t rxBuffer[200] = {0};
uint8_t at[] = "AT\r\n";
uint8_t atSetSTA[] = "AT+CWMODE=1\r\n";

DEMO_USART1.Send(at,sizeof(at) - 1);
delay(1000);
DEMO_USART1.Receive(rxBuffer,sizeof(rxBuffer));
print(rxBuffer);
memset(rxBuffer,sizeof rxBuffer)


DEMO_USART1.Send(atSetSTA,sizeof(atSetSTA) - 1);
delay(1000);
DEMO_USART1.Receive(rxBuffer,sizeof rxBuffer)

当我使用 memset 时,控制台没有打印任何内容。当我不使用 memset 时,在这种情况下它也会打印之前的响应。

解决方法

你是如何打印到控制台的?

如果您调用 printf0 将不会打印任何内容,因为缓冲区的第一个值是 rxBuffer

我认为这是因为编译器将 char* 解释为以 null 结尾的 rxBuffer(又名 c 字符串)。这意味着 printf 将打印从地址 0 开始的值,直到达到 printf("Buffer = ["); for (int i = 0; i < sizeof(rxBuffer); i++) { printf("%d",rxBuffer[i]); } printf("]\n"); 的值。

你可能想用类似的东西打印出缓冲区的值

// searchTerms - IEnumerable<TSearch> where one must match for a row
// testFne(row,searchTerm) - test one of searchTerms against a row
// r => searchTerms.Any(s => testFne(r,s))
public static Expression<Func<T,bool>> AnyIs<T,TSearch>(this IEnumerable<TSearch> searchTerms,Expression<Func<T,TSearch,bool>> testFne) {
    var pred = PredicateBuilder.New<T>();
    foreach (var s in searchTerms)
        pred = pred.Or(r => testFne.Invoke(r,s));

    return pred;
}

// searchTerms - IEnumerable<TSearch> where one must match for a row
// testFne(row,searchTerm) - test one of searchTerms against a row
// dbq.Where(r => searchTerms.Any(s => testFne(r,s)))
public static IQueryable<T> WhereAny<T,TSearch>(this IQueryable<T> dbq,IEnumerable<TSearch> searchTerms,bool>> testFne) =>
    dbq.AsExpandable().Where(searchTerms.AnyIs(testFne));

代替

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...