好吧,我已经用Arduino在谷歌上搜索了从Serial中获取字符串,甚至连复制和粘贴示例都没有运气。
我正在尝试从序列中获取字符串。这是我的代码:
void setup() {
Serial.begin(9600);
Serial.write("Power On");
}
void loop()
{
while(!Serial.available());
while (Serial.available() > 0) {
Serial.write(Serial.read());
}
Serial.println();
}
它一个字符一个字符地打印出来。
我也试过
char* read(int len) {
while (!Serial.available());
char str[len];
int i = 0;
while (i < len) {
str[i] = ' ';
int inByte = Serial.read();
Serial.println(inByte);
if (inByte == -1) {
return str;
} else {
str[i++] = inByte;
}
}
return str;
}
它一次返回1个字符(serial.print(inByte)每隔一次返回-1)。为什么Serial会拆分每个字符?
如果我输入"hello"并调用serial.read(),它会给出一个字符,然后说什么都没有,然后给出另一个字符并说什么也没有。
我想明白了。
当您以9600波特(Serial.begin(9600);
)打开串行时,它的读/写速度为每秒9600字节。这意味着它最快可以达到每毫秒不到10个字节。我不知道操作速度是多少,但Arduino似乎收到了警报,并在第二个字节到达之前读取了第一个字节。因此,您必须添加一个delay(1)
来"等待"同一流"中的另一个字节到达。
String read() {
while (!Serial.available()); //wait for user input
//there is something in the buffer now
String str = "";
while (Serial.available()) {
str += (char) Serial.read();
delay(1); //wait for the next byte, if after this nothing has arrived it means the text was not part of the same stream entered by the user
}
return str;
}
你可能会问,既然你在拖延,你怎么知道用户是否只是打字很快?在这里你无法避免它,因为Serial本质上被限制在一定的速度下。然而,用户必须以几乎不可能的速度输入,才能将两个输入混淆为一个输入。
我不能访问这里的Arduino源文件,但由于明显的原因,下面的代码行不会给你一个完整的字符串(如果不是那么明显,请告诉我):
int inByte = Serial.read();
此外,使用
Serial.write()
您将以字节为单位发送。这是的opsite
Serial.println()
其中你将发送完整的句子。
我会尝试使用Serial.print()或println(),而不是Serial.write().
您可以查看参考资料:
http://arduino.cc/en/Serial/Write
http://arduino.cc/en/Serial/Println
即使这篇文章很旧,我也会发布我的答案,以防有人在谷歌上搜索到这里。
对于从串行读取字符串,您可以使用以下内容:
String str;
while (Serial.available() > 0) {
str = Serial.readString();
}
工作起来很有魅力!
通过UART传输数据时存在延迟。请尝试使用Serial.timedRead()。代码如下。
void setup() {
Serial.begin(9600);
Serial.write("Power On");
}
void loop()
{
while(!Serial.available());
while (true) {
int byte = Serial.timedRead();
if(byte == -1)
break;
Serial.write(byte);
}
Serial.println();
}
我写了这个简单的串行完整消息中继器。它不需要String
对象,也不需要像前面的回答那样进行任何类型的延迟。
工作原理
它接收字符并将它们存储在缓冲器中,直到接收到终止字符n
或