【问题标题】:Enabling Newline or Carriage return启用换行符或回车符
【发布时间】:2021-07-05 18:31:30
【问题描述】:

我正在阅读一些机器人代码,并且遇到了像 Newline 和 Carriage 这样的东西。那两件事是什么?我找不到任何与代码本身相关的有用用法。 这是代码

// !! make sure you have enabled Newline or Carriage return
#define _mode 0 // (0) used for calibration and testing, (1) uses serial as input
void handle_serial() {
  //: reads and stores the serial data
  int i = 0; float buff[3] = {0, 0, 0};
  String s_buff = "";
  while (Serial.available()) {
    char c = Serial.read();
    if (c == 13 || c == 32 || c == '\n') {
      buff[i] = s_buff.toFloat();
      s_buff = "";
      i++;
    } else
      s_buff += c;
  }

  if (_mode == 0)
    commands_exe(buff[0], buff[1], buff[2]);
  else if (_mode == 1)
    if (state == 4) {
      _direction = {buff[0], buff[1]};
      turn = buff[2];
    }
}

【问题讨论】:

  • 你应该烧掉这段代码。也可能是项目中的大多数其他代码。
  • 为什么?我不明白?
  • 我试图删除代码并运行程序,但出现错误。我不认为它一文不值
  • 如果你看13'\r'32' '(空格),唯一正确显示的字符文字是'\n'。代码显示if (whitespace) { ... } else { add c to s_buff } 在调用s_buff.toFloat() 之前,没有验证s_buff 是否持有有效值。事实上,如果接收到的第一个字符是空白,它将尝试对空字符串进行转换。这只是鼓励您重新开始的几个原因...

标签: c arduino esp32 arduino-esp32


【解决方案1】:

换行和马车。这两件事是什么?

这是两个控制字符。通常表示为转义序列"\n"(换行)和"\r"(回车)

https://en.wikipedia.org/wiki/Carriage_return

https://en.wikipedia.org/wiki/Newline

两者都有历史原因。回车将打印头移回行首。新行移到下一行。

这仍然在计算机中用于移动光标或在读取文本文件时进行换行。

这段代码的想法是读取字节,直到收到换行符、空格或回车符。然后将直到那时收到的字节转换为浮点数。

但正如 cmets 所暗示的,这种实现方式很糟糕,原因有很多。主要是它很容易出错。

例如,如果您没有及时收到空格、换行符或回车,您可能会超出缓冲区的边界。

它还经常用于终止串行命令,以便计算机知道他何时收到完整的命令,同时允许在终端中很好地显示它们。由发送者确保发送正确的数据,这通常是一个非常糟糕的主意。

你可以从这个 sn-p 中学到的唯一一件事就是如何不去做。

【讨论】:

    猜你喜欢
    • 2023-02-21
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多