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

问题描述 投票:0回答:1

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

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轮流编写和阅读。谢谢。

string matlab arduino serial-communication
1个回答
2
投票

您的微控制器代码读取速度比您实际发送字符的速度快,因此您正在从空缓冲区读取数据。 Serial.available()有一个char给你,你读它,然后你读更多的字符,即使接收缓冲区已经是空的。当没有什么可读的时候,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);
}

两者都没有经过测试,但你明白了。

© www.soinside.com 2019 - 2024. All rights reserved.