0

我正在用 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();
}

这是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);
    }
}

有人在我的代码中看到错误吗?如果是这样,请让我知道出了什么问题,我会修复它。

谢谢你。

4

1 回答 1

5

您不是向 arduino 发送一个大数字,而是向 arduino 发送几个 ASCII 字节。Arduino 会看到这个序列:

49, 48, 48, 48, 48, 48, ...

在每个循环中,它将读取一个字节并等待该毫秒数。49 或 48 毫秒不是很长的时间。因此,您所拥有的是 LED 的持续闪烁,这是用肉眼快速看到的。

接下来是:您正在一次刷新中发送字节。但是 Arduino 只有一个 64 字节的内部缓冲区(参见可用的文档)。其余的就简单地忘记了。

让我们粗略计算一下:64 字节 *(每字节 48 毫秒延迟)为 3072 毫秒。是的,这听起来很合理。

接下来的事情是:delay只能处理unsigned long32 位类型的参数,这意味着您可以等待约 4,000,000,000 毫秒。你的论点Main远远超出了这个限制。

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

于 2012-07-25T10:20:41.093 回答