Arduino无法正确读取串行
好的,我已经从串行与Arduino中获取一个字符串,我甚至没有运气,甚至复制和粘贴示例。Arduino无法正确读取串行
我想从串行中获取一个字符串。这里是我的代码:
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] = '\0';
int inByte = Serial.read();
Serial.println(inByte);
if (inByte == -1) {
return str;
} else {
str[i++] = inByte;
}
}
return str;
}
而且它在一个时间(serial.print(inByte)给出-1隔日一次)返回1个字符。为什么串行分割每个字符?
如果我输入“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()
您要发送的每一个字节一个字节。这是从
Serial.println()
oposite其中你将发送完整的句子。
我会尝试使用Serial.print()或println()而不是Serial.write()。
您可以检查出的参考文献:
它通过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 str;
while (Serial.available() > 0) {
str = Serial.readString();
}
就像一个魅力!
String str;
void setup()
{
Serial.begin(9600);
}
void loop()
{
while (Serial.available() > 0){
char c = Serial.read();
str.concat(c);
if (Serial.available() == 0)
{
Serial.print(str);
str = "";
break;
}
}
}
串口很慢。你通常一次只得到一个字节,然后一段时间没有。你需要在你的代码中处理这个问题,你现在没有这样做。 – 2012-03-28 13:08:07