尝试在 arduino 上使用字符串和串行端口,我的草图出于某种原因跳过了字符
trying to work with strings and serial port on arduino, my sketch skips characters for some reason
我一直在尝试实现我的基于 arduino 的项目和我的电脑之间的串行通信,我需要通过串行向 arduino 发送命令并使用 "if and else" 调用所需的函数(在 parseMessage() 函数中).
我不能使用 delay(),因为我正在使用中断进行多路复用和位角调制,所以我不得不以另一种方式进行串行通信,这是我最接近成功的方法,但我仍然我得到字符滑雪 ps 和一般的不稳定。正如您所知,编码一切都很棒,除非您不知道您的代码有什么问题,所以请帮助我,请互联网之神! ;)
我使用“#”作为字符串清除结尾的原因是我无法确定当 Serial.read() 要求时我发送到 arduino 的命令的所有字符都存在,可能会有更多的方式,因为 atmega328 比串口快 Serial.available() 实际上可能 return -1 在传输过程中。
ps : 哦,我不能使用 String class,它非常昂贵,这个 atmega328 在 8x8 RGBLED 多路复用和 4bit 角度调制下已经是汗流浃背了他以后要做的更多。
ps :我还在学习英语,如果我使用的语法有问题,请原谅我。
void setup() {
Serial.begin(9600);
}
bool dataRTP = false; // data ready to parse
void loop() {
readSerial();
}
char message[64];
int index = 0;
void readSerial() {
if (Serial.available() > 0)
while (Serial.available() > 0)
if (Serial.peek() != '#') // i'm using '#' as end of string declearation.
message[index++] = Serial.read();
else {
message[index++] = '\n';
dataRTP = true;
break;
}
while (Serial.read() != -1) {} // flushing any possible characters off of
if (dataRTP) // UARTS buffer.
parseMessage();
}
void parseMessage() { // just testing here, actual code would be like :
Serial.print(message); // if (!strcmp(message, "this expression"))
index = 0; // callthisfunction();
dataRTP = false; // else ... etc
}
刚刚设法修复了这段代码,似乎从串行 UART 中清除数据毕竟不是一个好主意。一切都解决了。下面是代码现在的样子:
void setup() {
Serial.begin(9600);
}
bool dataRTP = false;
void loop() {
readSerial();
}
char message[64];
int index = 0;
void readSerial() {
if (Serial.available() > 0)
while (Serial.available() > 0)
if (Serial.peek() == '#') {
message[index++] = Serial.read();
message[index++] = '[=10=]';
dataRTP = true;
break;
}
else
message[index++] = Serial.read();
if (dataRTP)
parseMessage();
}
void parseMessage() {
Serial.println(message);
index = 0;
dataRTP = false;
}
我一直在尝试实现我的基于 arduino 的项目和我的电脑之间的串行通信,我需要通过串行向 arduino 发送命令并使用 "if and else" 调用所需的函数(在 parseMessage() 函数中).
我不能使用 delay(),因为我正在使用中断进行多路复用和位角调制,所以我不得不以另一种方式进行串行通信,这是我最接近成功的方法,但我仍然我得到字符滑雪 ps 和一般的不稳定。正如您所知,编码一切都很棒,除非您不知道您的代码有什么问题,所以请帮助我,请互联网之神! ;)
我使用“#”作为字符串清除结尾的原因是我无法确定当 Serial.read() 要求时我发送到 arduino 的命令的所有字符都存在,可能会有更多的方式,因为 atmega328 比串口快 Serial.available() 实际上可能 return -1 在传输过程中。
ps : 哦,我不能使用 String class,它非常昂贵,这个 atmega328 在 8x8 RGBLED 多路复用和 4bit 角度调制下已经是汗流浃背了他以后要做的更多。
ps :我还在学习英语,如果我使用的语法有问题,请原谅我。
void setup() { Serial.begin(9600); } bool dataRTP = false; // data ready to parse void loop() { readSerial(); } char message[64]; int index = 0; void readSerial() { if (Serial.available() > 0) while (Serial.available() > 0) if (Serial.peek() != '#') // i'm using '#' as end of string declearation. message[index++] = Serial.read(); else { message[index++] = '\n'; dataRTP = true; break; } while (Serial.read() != -1) {} // flushing any possible characters off of if (dataRTP) // UARTS buffer. parseMessage(); } void parseMessage() { // just testing here, actual code would be like : Serial.print(message); // if (!strcmp(message, "this expression")) index = 0; // callthisfunction(); dataRTP = false; // else ... etc }
刚刚设法修复了这段代码,似乎从串行 UART 中清除数据毕竟不是一个好主意。一切都解决了。下面是代码现在的样子:
void setup() {
Serial.begin(9600);
}
bool dataRTP = false;
void loop() {
readSerial();
}
char message[64];
int index = 0;
void readSerial() {
if (Serial.available() > 0)
while (Serial.available() > 0)
if (Serial.peek() == '#') {
message[index++] = Serial.read();
message[index++] = '[=10=]';
dataRTP = true;
break;
}
else
message[index++] = Serial.read();
if (dataRTP)
parseMessage();
}
void parseMessage() {
Serial.println(message);
index = 0;
dataRTP = false;
}