Arduino - 需要疯狂的0才能使LED持续3秒

che*_*505 0 serial-port arduino

我正在做一个用arduino制作响铃的项目,当我第一次尝试时,它的工作方式我想要它(wait(Serial.read())),但现在我需要0通过串口发送100 多个才能显示4秒 这是我的Java代码: 为长期做准备

Main.ringBell("100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000");

public static void ringBell(String length) throws Exception {
     output.write(length.getBytes());
     output.flush();
}
Run Code Online (Sandbox Code Playgroud)

这是Arduino草图:

int ledPin = 13;

void setup() {
    pinMode(ledPin, OUTPUT);
    Serial.begin(9600);
}

void loop() {
    if(Serial.available() > 0) {
        digitalWrite(ledPin, HIGH);
        delay(Serial.read());
        digitalWrite(ledPin, LOW);
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有人在我的代码中看到错误?如果是这样,请告诉我什么是错的,我会解决它.

谢谢.

A.H*_*.H. 5

你没有向arduino发送一个大数字,而是发送几个ASCII字节.Arduino会看到这个序列:

49, 48, 48, 48, 48, 48, ...
Run Code Online (Sandbox Code Playgroud)

在每个循环中,它将读取一个字节并等待该毫秒数.49或48毫秒不是很长时间.所以你所拥有的是LED的恒定闪烁,这是用眼睛快速看到的.

接下来是:您正在一次刷新中发送字节.但是Arduino只有一个64字节的小内部缓冲区(参见可用的文档).其余的都被遗忘了.

让我们大致计算:64字节*(每字节48毫秒延迟)是3072毫秒.是的,这听起来似乎有道理.

接下来的事情是:delay只能处理unsigned long32位类型的参数,转换为可以等待的约4,000,000,000毫秒.你的论点Main超出了这个限度.

所以:最简单的方法是使用parseInt而不是read.并且Main仅提供正数范围内的数字int(0 .. 32767).Main在发送下一个之前还要做一些延迟ringBell.