为什么 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
转换为 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);
}
两者都未经测试,但您明白了。
我正在尝试通过 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
转换为 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);
}
两者都未经测试,但您明白了。