为什么 Arduino 输出的字符串看起来像外星文本?

Why does the string output from Arduino look like alien text?

我正在尝试通过 USB 在 Arduino 和 MATLAB 之间建立串行通信。我有这个基本代码,我将 "hello" 从 MATLAB 发送到 Arduino,然后我读回它并在 MATLAB 中打印它。然而,从 Arduino 发送的 "hello" 看起来像一个奇怪的文本。

Arduino:

void setup() {
  Serial.begin(57600);
  Serial.println("ready");
}

void loop() {
  String input;
  if (Serial.available()) {
    char c = Serial.read();    
    while (c != '\n') {
      input += c;
      c = Serial.read();
    }
    Serial.println("I received: " + String(input));
    input = "";
  }
}

MATLAB:

s = serial('COM3');
set(s, 'BaudRate', 57600);
fopen(s);
pause(1);

first = strtrim(convertCharsToStrings(fgetl(s)));
if first == "ready"
    fprintf(s, '%s', 'hello\n');
    for i = 1:10
        tline = strtrim(convertCharsToStrings(fgetl(s)));
        disp(tline);
        if size(tline, 2) > 0
            fprintf(s, '%s', 'hello\n');
        end
    end
end

fclose(s);

MATLAB 中的输出如下所示:

I received: hÿÿÿÿÿÿeÿÿÿÿÿÿÿlÿÿÿÿÿÿÿÿlÿÿÿÿÿÿoÿÿÿÿÿÿÿ

此外,对于改进我的串行通信代码的建设性批评,我将不胜感激。这是我第一次,我正在尝试获得一个简单的设置,其中 Arduino 和 MATLAB 轮流写入和读取。谢谢。

您的微控制器代码读取速度比您实际发送字符的速度快,因此您正在从一个空缓冲区中读取。 Serial.available() 有一个字符给你,你读了它,然后你读了更多的字符,即使接收缓冲区已经是空的。 Serial.read() 会 return -1 当没有什么可读的时候。 -1 转换为 char0xFF,或 Ascii 'ÿ'.

您可以将 loop() 更改为

void loop() {
  String input;
  while (Serial.available()) {
    char c = Serial.read();    
    if (c != '\n') {
      input += c;
    } else {
      Serial.println("I received: " + String(input));
      input = "";
    }
  }
}

或者你可以选择 Arduino 的 Serial.readString():

void setup() {
  Serial.begin(57600);
  Serial.setTimeout(20);
  Serial.println("ready");
}
void loop() {
  String input = Serial.readString();
  Serial.println("I received: " + input);
}

两者都未经测试,但您明白了。