gpt4 book ai didi

c - 由于 Arduino Due 上的指针而导致无限循环

转载 作者:行者123 更新时间:2023-11-30 17:12:33 31 4
gpt4 key购买 nike

我使用 Dan Royer 的代码作为基础在 Arduino Mega 2560 上实现了一个缓冲区。该代码在 Mega 上运行得非常好,但我想使用 Arduino Due 的增强功能和强大功能(它使用 ARM 而不是标准 Atmel 微处理器)。

在到期日,我在处理缓冲区内容时总是陷入无限循环,因为到达缓冲区末尾时它不会退出。有谁知道为什么会发生这种情况?您对如何防止这种情况有什么想法吗?

给出的命令将是 GCode,例如:“G01 X20.5 Y30;”

这就是缓冲区的填充方式:

char buffer[MAX_BUF];  // where we store the message until we get a ';'
int sofar; // how much is in the buffer

while(Serial.available() > 0) { // if something is available
char c=Serial.read(); // get it
if(sofar<MAX_BUF-1) buffer[sofar++]=c; // store it
if(c==';') {
// entire message received
// we got a message and it ends with a semicolon
buffer[sofar]=0; // end the buffer so string functions work right
processCommand(); // do something with the command
}

然后,processCommand() 调用一个函数,该函数在缓冲区中搜索特定字符并返回直接位于该字符后面的 float :

/**
* Look for character /code/ in the buffer and read the float that immediately follows it.
* @return the value found. If nothing is found, /val/ is returned.
* @input code the character to look for.
* @input val the return value if /code/ is not found.
**/
float parsenumber(char code,float val) {
char *ptr=buffer;
while(ptr && *ptr && ptr<buffer+sofar) {
if(*ptr==code) { // if /code/ is found
return atof(ptr+1); // return the float behind it
}
ptr=strchr(ptr,' ')+1; // else increment pointer to next char after a space
}
return val; // if the end of the buffer is reached, return the default value
}

现在,这段代码在 Arduino Mega 上运行得很好,但在 Due 上,while 循环由于某种原因永远不会退出。

这就是它在 Mega 上的工作原理:

GCode: G1;
Parsenumber: code:F val:288.46
####
ASCII Code at ptr: 71.00
String at ptr: G1;
String at buffer end:
#####
ptr incremented
ASCII Code at ptr: 0.00
String at ptr:
String at buffer end:
#####
End of Parse: return 288.46

但这就是到期日的情况:

GCode: G1;
Parsenumber: code:F val:288.46
#####
ASCII Code at ptr: 71.00
String at ptr: G1;
String at buffer end:
#####
ptr incremented
ASCII Code at ptr: 128.00
String at ptr: € q
String at buffer end:
#####
ptr incremented
ASCII Code at ptr: 113.00
String at ptr: q
String at buffer end:
#####
ptr incremented
ASCII Code at ptr: 8.00
String at ptr:
String at buffer end:
#####
ptr incremented
ASCII Code at ptr: 128.00
String at ptr: € q
String at buffer end:
#####
ptr incremented
ASCII Code at ptr: 113.00
String at ptr: q
String at buffer end:
#####

等等...

因此,在我看来,退出条件 ptr<buffer+sofar从未遇见过。不幸的是我无法使用 Arduino 打印内存地址。有人知道吗?

最佳答案

我发表评论以允许结束问题:

使用 ptr=strchr(ptr,' ')+1; 递增指针是未定义的行为,因为 strchr 找不到它返回的字符NULL

在将其分配给 ptr 之前,您应该检查 strchr 返回。

可能在 Atmel 平台上,地址 NULL+1 处有一个 0x00,可以使您的代码正常运行。

另一种可能性(我对 Arduino 很菜鸟)是,如果找不到 char,Atmel 库中的 strchr 实现不会返回 NULL。我看到 strchr 实现,如果找不到字符,返回的值是字符串的最后一个字符。

关于c - 由于 Arduino Due 上的指针而导致无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31451153/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com