我正在尝试通过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轮流编写和阅读。谢谢。
您的微控制器代码读取速度比您实际发送字符的速度快,因此您正在从空缓冲区读取数据。 Serial.available()
有一个char给你,你读它,然后你读更多的字符,即使接收缓冲区已经是空的。当没有什么可读的时候,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);
}
两者都没有经过测试,但你明白了。