Почему вывод строки из Arduino выглядит как инопланетный текст? - PullRequest
0 голосов
/ 21 апреля 2019

Я пытаюсь установить последовательную связь между Arduino и MATLAB через USB. У меня есть этот базовый код, куда я посылаю «привет» из MATLAB в 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 по очереди пишут и читают. Спасибо.

1 Ответ

3 голосов
/ 23 апреля 2019

Ваш код микроконтроллера читается быстрее, чем вы физически отправляете символы, поэтому вы читаете из пустого буфера.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 = "";
    }
  }
}

Или вы можете пойти с ArduinoSerial.readString():

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

Оба непроверены, но вы поняли идею.

...