Arduino:如何使用串行命令退出主循环中的循环?
Arduino: how to exit for loop in Main Loop with serial command?
大家好我是新来的!
我需要通过串行命令在 arduino 板上的主循环中退出 for 循环 运行,但看起来直到主循环结束时都没有考虑串行事件。关于如何解决的任何想法?
我放了一些简化的代码来更好地理解这个问题。
boolean start=false;
boolean abortLoop=false;
String inputString = "";
void setup() {
Serial.begin(9600);
}
void loop() {
if(start){
Serial.println("start");
for(int i =0; i <10; i++){
if(abortLoop)break;
Serial.println(i);
delay(1000);
}
start=false;
abortLoop=false;
}
}
void serialEvent()
{
while (Serial.available())
{
// get the new byte:
char inChar = (char)Serial.read();
// add it to the inputString:
inputString += inChar;
//Serial.println(inputString);
// if the incoming character is a newline, set a flag
// so the main loop can do something about it:
if (inChar == '\n')
{
inputString = inputString.substring(0, inputString.length() - 1);
//Serial.println(inputString);
//Serial.println(inputString.length());
if (inputString[0] == 's')
{
Serial.println("start");
start = true;
}
if (inputString[0] == 'a')
{
abortLoop=true;
Serial.println("abort");
}
inputString = "";
}
}
}
如果在循环中间发送命令a,循环会一直进行到结束。
结果是:
start
start
0
1
2
3
4
5
6
7
8
9
abort
abort
在这种情况下,命令被发送了 2 次。
解决方案非常简单。你唯一要做的就是在for循环中调用你的函数,否则函数无法执行。
...
for(int i =0; i <10; i++){
serialEvent();
if(abortLoop)break;
Serial.println(i);
delay(1000);
}
...
而且我觉得如果你也在这里调用你的函数会更好:
...
void loop() {
serialEvent();
if(start){
...
奇怪的是没有必要,但在我看来它更好。并且 start 被打印了两次,因为你调用了它两次。来过一次:
void loop() {
if(start){
Serial.println("start");
for(int i =0; i <10; i++){
还有一次在这里:
if (inputString[0] == 'a')
{
abortLoop=true;
Serial.println("abort");
}
所以你可以删除其中一个。
大家好我是新来的! 我需要通过串行命令在 arduino 板上的主循环中退出 for 循环 运行,但看起来直到主循环结束时都没有考虑串行事件。关于如何解决的任何想法? 我放了一些简化的代码来更好地理解这个问题。
boolean start=false;
boolean abortLoop=false;
String inputString = "";
void setup() {
Serial.begin(9600);
}
void loop() {
if(start){
Serial.println("start");
for(int i =0; i <10; i++){
if(abortLoop)break;
Serial.println(i);
delay(1000);
}
start=false;
abortLoop=false;
}
}
void serialEvent()
{
while (Serial.available())
{
// get the new byte:
char inChar = (char)Serial.read();
// add it to the inputString:
inputString += inChar;
//Serial.println(inputString);
// if the incoming character is a newline, set a flag
// so the main loop can do something about it:
if (inChar == '\n')
{
inputString = inputString.substring(0, inputString.length() - 1);
//Serial.println(inputString);
//Serial.println(inputString.length());
if (inputString[0] == 's')
{
Serial.println("start");
start = true;
}
if (inputString[0] == 'a')
{
abortLoop=true;
Serial.println("abort");
}
inputString = "";
}
}
}
如果在循环中间发送命令a,循环会一直进行到结束。 结果是:
start
start
0
1
2
3
4
5
6
7
8
9
abort
abort
在这种情况下,命令被发送了 2 次。
解决方案非常简单。你唯一要做的就是在for循环中调用你的函数,否则函数无法执行。
...
for(int i =0; i <10; i++){
serialEvent();
if(abortLoop)break;
Serial.println(i);
delay(1000);
}
...
而且我觉得如果你也在这里调用你的函数会更好:
...
void loop() {
serialEvent();
if(start){
...
奇怪的是没有必要,但在我看来它更好。并且 start 被打印了两次,因为你调用了它两次。来过一次:
void loop() {
if(start){
Serial.println("start");
for(int i =0; i <10; i++){
还有一次在这里:
if (inputString[0] == 'a')
{
abortLoop=true;
Serial.println("abort");
}
所以你可以删除其中一个。