3

シリアルへの書き込みを高速化するための助けが必要です。これに似た質問がいくつか見つかりましたが、処理言語や Java を扱ったものは何もないので、誰かが私が抱えているこの問題について助けてくれることを願っています。

編集

John が以下で指摘しているように、シリアルでは、私が望む速度でこれほど多くのデータを送信するのに十分な速度がないようです。利用可能な他のarduinoインターフェースを知っている人はいますか?

編集を終了

arduino を使用して、接続した 400 個の RGB LED のグリッドを制御しています。コマンドを arduino に送信するために、LED を表す大きな配列を操作する小さなプログラムを Processing で作成しました。次に、シリアル経由で 115200 ボーで 20 ミリ秒ごとに 800 バイトのデータを arduino に送信して、グリッドを更新しようとしています。20ms ごとに呼び出される処理コードは次のとおりです。

  noStroke();
  int dataPos = 0; // position in LED data array
  byte[] dataLedGrid = new byte[400*2]; // array for bytes to send
  for(int j=0; j<LEDS_TALL; j++) {
    for(int i=0; i<LEDS_WIDE; i++) {
      int pos = j*20+i;
      int r = ledGrid[LEDS_WIDE-i-1][LEDS_TALL-j-1][0], g = ledGrid[LEDS_WIDE-i-1][LEDS_TALL-j-1][1] ,b = ledGrid[LEDS_WIDE-i-1][LEDS_TALL-j-1][2];
      int colorData = ((g & 0x1F) << 10) | ((b & 0x1F) << 5) | (r & 0x1F);
      dataLedGrid[dataPos] = byte(colorData & 0x00FF);
      dataLedGrid[dataPos+1] = byte(colorData & 0xFF00);
      dataPos+=2;

      // draw LED squares on gui
      fill(ledGrid[i][j][0], ledGrid[i][j][1], ledGrid[i][j][2]);
      rect(SIDE_PANEL_WIDTH+(LED_SQUARE_SIDE+LED_SQUARE_SPACING)*i+HORIZONTAL_MARGIN,
      (LED_SQUARE_SIDE+LED_SQUARE_SPACING)*j+VERTICAL_MARGIN, 
      LED_SQUARE_SIDE, LED_SQUARE_SIDE);
    }
  }
  myPort.write(dataLedGrid); // write to serial

arduino には、arduino 側のグリッドを表す 1D 配列 (ディスプレイ) があります。ループコードは次のとおりです。

void loop() {

  unsigned int pos, c1, c2;

  if (Serial.available() > 0) {
    for(byte j=0; j<20; ++j) {
        for(byte i=0; i<20; ++i) {
          c1 = Serial.read();
          c2 = Serial.read();

          pos = i+20*j;
          if(j % 2 != 0)         // it's a square of leds created by a zigzaging line
            pos = 20*(j+1)-i-1;  // so I have to reverse every other line

          Display[pos] = (unsigned int)(c1<<8 | c2);
        }
    }
    show();
  }
}

これでコード自体は正常に動作しますが、シリアル書き込みによってすべてが遅くなります。シリアル書き込みなしで処理コードを実行すると、すべて問題なく、意図した速度で実行されます。しかし、シリアル書き込みを追加すると、すべてが少し途切れ途切れになります。CPU が最大にならないか、何もないので、私が呼び出している serial.write メソッドだと思います。このコードを高速化したり、シリアル書き込みの遅延をなくしたりするにはどうすればよいですか?

ご協力いただきありがとうございます!

4

2 に答える 2

8

計算する。

115200ボーは、8-N-1、11,520バイト/秒、つまり86.8usec/バイトです。

20ミリ秒で、230.4バイトを送信できます。800バイトの送信には約70ミリ秒かかります。

20ミリ秒ごとに115200ボーで800バイトを送信しようとしても、機能しません。

于 2010-11-11T19:07:43.943 に答える
0

arduino スケッチに追加Serial.setTimeout(0)してみてくださいsetup()

于 2013-11-17T15:41:19.530 に答える