簡體   English   中英

快速串口從處理寫入Arduino

[英]Rapid Serial Port writing to Arduino from Processing

我需要一些幫助來加速寫入串口。 我發現了一些類似的問題,但沒有涉及Processing語言或Java的任何問題,所以我希望有人可以幫我解決這個問題。

編輯

正如John在下面指出的那樣,看起來串行的速度不夠快,無法以我想要的速度發送這么多數據。 有沒有人知道其他可用的arduino接口?

結束編輯

我正在使用arduino控制我連接的400個RGB LED網格。 為了向arduino發送命令,我在Processing中編寫了一個小程序來操作代表LED的大型數組。 然后,我嘗試通過串行發送800字節的數據,每隔20分鍾以115200波特率向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一側的網格。 循環代碼是:

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();
  }
}

現在代碼本身工作正常,但是當串行寫入減慢了一切。 當我在沒有串行寫入的情況下運行Processing代碼時,一切都很好,以預期的速度運行。 但是,當我添加連續寫入時,一切都變得有些不穩定。 CPU沒有最大化或任何其他所以我假設它是我調用的serial.write方法。 我該怎么做才能加速這段代碼或消除序列編寫的滯后?

謝謝你的幫助!

算一算。

115200波特,8-N-1,每秒11,520字節,或86.8 usec /字節。

在20毫秒,您可以發送230.4字節。 發送800個字節大約需要70毫秒。

嘗試每20毫秒以115200波特率發送800個字節是行不通的。

嘗試將Serial.setTimeout(0)添加到arduino sketch的setup()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM