c++缓冲区溢出或损坏的变量

标签 c++ arduino

当传递意外消息时,这段代码会导致缓冲区溢出吗?此外,预期的消息是简单的“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 .

最佳答案

您只是在读取无限量的值,而不检查您的缓冲区是否已满。从您的代码:

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;
}

关于c++缓冲区溢出或损坏的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54767297/

相关文章:

c++ - boost::circular_buffer 如何处理覆盖移位

arduino - LM35(温度传感器)的摄氏转换系统是什么?

python - 单精度大端浮点值到 Python 的 float ( double ,大端)

c - 如何直接发布到 Google Docs 表单

c++ - 带有 ESP8266 和 C++ 代码的 Arduino

Arduino返回的PHP串口数据

c++ - 根据用户输入用字母填充 vector ,并将开始和结束放在四肢上

c++ - 如何从 IBM i 文件中获取成员列表?

c# - 为什么在着色器中顺序很重要?

c++ - 链接提取和插入、包围