在传递意外消息时,此代码会导致缓冲区溢出吗?另外,预期的消息是简单的“ 1”和“ -1”。
char rcv[64] {};
int i = 0;
while (modem.available()) {
rcv[i++] = (char)modem.read();
}
String data_received = rcv;
if (data_received == "") {
Serial.println("Null");
} else {
correction_var = data_received.toInt();
}
由于我的arduino的RTC突然开始表现奇怪,并且我找不到适当的原因,除了在他发疯之前,显然一条消息未能发送到Arduino。此处的这段代码可以处理收到的消息,因此可能某些内容超出了应有的范围,并弄乱了RTC的警报变量?
更新:因此,这都不是缓冲区溢出问题,Ardunino的RTC显然存在某种问题,因为即使在重置代码后,问题仍然存在,这次从头开始,因此我决定创建一个新的线程Here。
答案 0 :(得分:4)
您只需读取无限数量的值,而无需检查缓冲区是否已满。从您的代码中:
char rcv[64] {};
int i = 0;
while (modem.available()) {
rcv[i++] = (char)modem.read();
}
很明显,您的字符数组rcv在接收到64个字符后将溢出。也许一旦接收缓冲区已满,您应该停止阅读?
char rcv[64] {};
int i = 0;
while (modem.available() && i < 64) {
rcv[i++] = (char)modem.read();
}
或者您可以在读取新值之后覆盖最旧的值。
char rcv[64] {};
int i = 0;
while (modem.available()) {
rcv[i % 64] = (char)modem.read();
++i;
}
答案 1 :(得分:2)
如果modem.available()
达到64时i
返回true,则缓冲区将溢出。
此外,String data_received = rcv;
可能会在rcv中寻找空终止符(我不知道String是如何实现的),该终止符可能不存在并且导致String读取rcv
的末尾缓冲。