【发布时间】:2019-03-28 11:19:54
【问题描述】:
我一直试图在 switch 语句条件内连续打印引脚 3 的 PWM 输出,但它只打印一次。我可以在串行监视器中连续打印它直到它满足第二个条件吗?或使用while循环?还是 if else ?
这是我的代码,我也有一个具有类似功能的代码,但它使用 if else 但它仍然只打印一次
void loop() {
// if there's any serial available, read it:
while (Serial.available() > 0) {
int InitVal = Serial.parseInt();
int red = Serial.parseInt();
switch(InitVal) {
case 1:
if (Serial.read() == '\n') {
analogWrite(redPin, red);
Serial.println(red);
Serial.write(red);
}
break;
case 0:
analogWrite(redPin, 0);
Serial.println(0);
Serial.write(0);
break;
}
}
}
我正计划将其与 GUI 相结合。 GUI 将 ascii 发送到 arduino 读取它,然后将输出值发送到 GUI。 示例
1.GUI 发送 [1,123] : 1 = switch 语句的触发点; 123 = PWM 值。
- Arduino 接收指令并打印出 pwm 值
- GUI 接收 pwm 值并显示它
修改后的代码:卡在最后一个 while 循环中,也许我可以在 arduino 中使用线程函数,以便满足/不满足最后一个 while 循环?
void loop() {
int InitVal = 0;
// if there's any serial available, read it:
while (Serial.available() > 0) {
int InitVal = Serial.parseInt();
int red = Serial.parseInt();
switch(InitVal) {
case 1:
if (Serial.read() == '\n') {
InitVal = 1;
//analogWrite(redPin, red);
//Serial.println(red);
// Serial.write(red);
}
break;
case 0:
InitVal = 0;
//analogWrite(redPin, 0);
//Serial.println(0);
//Serial.write(0);
break;
}
if (InitVal) /* when enabled, blink leds */ {
delay(20);
while (InitVal == 1) /* loop forever */{
Serial.println(red);
Serial.write(red);
delay(20);
}
}
}
}
【问题讨论】:
-
输入中的逗号在哪里以及为什么需要它?
-
如果你尝试过这个循环,它在哪里不能满足你的需求?
Serial.available()可以根据来自您设备的数据速率限制连续执行。这是你看到的吗? -
@Lundin arduino.cc/en/Tutorial/ReadASCIIString 我目前正在关注本教程,使用 arduino 代码 Serial.parseInt() 函数来定位由非字母数字字符分隔的值。
-
@ryyker 我目前正在使用串行监视器发送 [1,123](csv 字符串)。我想要的是,如果满足案例 1 或 0,它会不断打印输出。在我的情况下,它只打印一次并再次等待另一个输入。因此,我需要不断地从 GUI 向 arduino 发送数据以便连续打印它?
-
如我所说,如果串行队列中没有任何内容,
serial.available()将停止执行流程。作为测试,在循环底部放置一个 serial.write() 来模拟应该来自 Arduino 的内容。
标签: c user-interface arduino switch-statement