#include <stdio.h>
#define LED 13
void setup() {
pinMode(LED, OUTPUT);
Serial.begin(9600);
}
void loop() {
int i;
char command[5];
for (i = 0; i < 4; i++) {
command[i] = Serial.read();
}
command[4] = '\0';
Serial.println(command);
if (strcmp(command, "AAAA") == 0) {
digitalWrite(LED, HIGH);
Serial.println("LED13 is ON");
} else if (strcmp(command, "BBBB") == 0) {
digitalWrite(LED, LOW);
Serial.println("LED13 is OFF");
}
}
我试图用Arduino的Serial读取一个4个字符长的字符串,当它是AAAA时打开一个LED,当它是BBBB时关闭串口。
但是,当我输入“AAAA”时,它会显示“AAAÿ”并且沿途有很多“ÿ”。
我认为我正在正确阅读所有内容,但是它运作得不好,对我做错了什么的想法?
答案 0 :(得分:9)
String txtMsg = "";
char s;
void loop() {
while (serial.available() > 0) {
s=(char)serial.read();
if (s == '\n') {
if(txtMsg=="HIGH") { digitalWrite(13, HIGH); }
if(txtMsg=="LOW") { digitalWrite(13, LOW); }
// Serial.println(txtMsg);
txtMsg = "";
} else {
txtMsg +=s;
}
}
}
答案 1 :(得分:1)
您应该检查是否有可供阅读的内容。如果没有,那么 read()将返回-1。您可以使用 Serial.available()来检查读取缓冲区。
答案 2 :(得分:1)
#define numberOfBytes 4
char command[numberOfBytes];
void serialRX() {
while (Serial.available() > numberOfBytes) {
if (Serial.read() == 0x00) { //send a 0 before your string as a start byte
for (byte i=0; i<numberOfBytes; i++)
command[i] = Serial.read();
}
}
}
答案 3 :(得分:1)
它读取'ÿ',因为缓冲区中没有要读取的字符。其他字符从uart缓冲区中取出堆栈需要一些时间。所以,你不能循环读取字符。在阅读之前,您必须等待另一个角色可用。
此外,这种等待字符的方式不是最好的方法,因为它会阻止主循环。
以下是我在程序中的操作:
String command;
void loop()
{
if(readCommand())
{
parseCommand();
Serial.println(command);
command = "";
}
}
void parseCommand()
{
//Parse command here
}
int readCommand() {
char c;
if(Serial.available() > 0)
{
c = Serial.read();
if(c != '\n')
{
command += c;
return false;
}
else
return true;
}
}