0

私は arduino を使ってベルを鳴らすプロジェクトを行っています。最初に試したときは、思いどおりに動作しましたが ( )、現在はシリアル ポートをwait(Serial.read())介して 100 を超えるメッセージを送信する必要があります。 04秒。これが私の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 に 1 つの大きな数字を送信するのではなく、いくつかの ASCII バイトを送信しています。Arduino には次のシーケンスが表示されます。

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

各ループで 1 バイトを読み取り、そのミリ秒数待機します。49 または 48 ミリ秒は長い時間ではありません。だからあなたが持っているのは、目で見るのが速いLEDの絶え間ないちらつきです.

次は、バイトを 1 回のフラッシュで送信していることです。しかし、Arduino には 64 バイトの小さな内部バッファーしかありません (利用可能なドキュメントを参照)。残りは単に忘れられています。

大まかに計算してみましょう: 64 バイト * (1 バイトあたり 48 ミリ秒の遅延) は 3072 ミリ秒です。はい、これはもっともらしく聞こえます。

次のことは次のとおりです。32ビットdelayのタイプの引数のみを処理できますunsigned long。これは、待機できる〜4,000,000,000ミリ秒に変換されます。あなたの主張は、Mainこの限界をはるかに超えています。

だから:最も簡単なことは、parseIntの代わりに使用することですread。またMain、正の範囲int(0.. 32767) の数値のみを指定します。またMain、次のringBell.

于 2012-07-25T10:20:41.093 に答える