我正在尝试通过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轮流编写和读取。谢谢。
答案 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);
}
两者都未经测试,但您知道了。