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

时间:2019-04-21 19:34:21

标签: string matlab arduino serial-communication

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

1 个答案:

答案 0 :(得分:3)

您的微控制器代码读取速度比物理发送字符快,因此您从空缓冲区读取数据。 Serial.available()为您准备了一个字符,您先阅读它,然后即使接收缓冲区已经为空,也阅读了更多字符。没有任何内容可读取时,Serial.read()将返回-1。将-1强制转换为char的是0xFF,或使用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);
}

两者都未经测试,但您知道了。