【问题标题】:Why does the string output from Arduino look like alien text?为什么 Arduino 输出的字符串看起来像外星文本?
【发布时间】:2019-04-21 19:34:21
【问题描述】:

我正在尝试通过 USB 在 Arduino 和 MATLAB 之间建立串行通信。我有这个基本代码,我将“hello”从 MATLAB 发送到 Arduino,然后我读回它并在 MATLAB 中打印它。然而,从 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 轮流读写。谢谢。

【问题讨论】:

  • 在 MATLAB 端,尝试fprintf(s, '%s\n', 'hello');(注意\n 字符在格式字符串而不是消息字符串中是如何出现的) .

标签: string matlab arduino serial-communication


【解决方案1】:

您的微控制器代码的读取速度比您实际发送字符的速度要快,因此您是从一个空缓冲区读取数据。 Serial.available() 为您准备了一个字符,您读取它,然后读取更多字符,即使接收缓冲区已经为空。 Serial.read() 将在没有可阅读的内容时返回 -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);
}

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

【讨论】:

  • 是的,就是这样。我仍然不熟悉不同的数据/文本类型,所以我不知道那个奇怪的 'y' 字符是从哪里来的。谢谢你的解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-20
  • 2011-02-01
  • 2022-07-26
  • 1970-01-01
  • 2018-11-18
  • 2017-07-31
  • 1970-01-01
相关资源
最近更新 更多