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++ - 我可以在 DLL 中组织类吗?

c++ - Arduino 中的预定义数组

serial-port - Pharo:从 Arduino 串口读取字节

c++ - 如何在 Windows 上将串行数据从 Python 脚本发送到 Arduino - 没有用

arduino - 带有 ESP8266 的 RC522 不工作 Arduino uno

c++ - QT qml 按钮虽然被禁用但发出信号被点击

c++ - boost::serialization Archive::register_type 如何工作?

尝试从 vector 中删除时,C++ 访问冲突读取位置 0x003AE000

arduino - 如何将Arduino Uno用作FTDI程序员?

c++ - memcpy - 获取临时数组错误的地址