问题描述
我有一个 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 时,在这种情况下它也会打印之前的响应。
解决方法
你是如何打印到控制台的?
如果您调用 printf
,0
将不会打印任何内容,因为缓冲区的第一个值是 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));
代替