Быстрая запись последовательного порта в Arduino из обработки - PullRequest
3 голосов
/ 11 ноября 2010

Мне нужна помощь, чтобы ускорить запись в сериал.Я нашел несколько похожих вопросов к этому, но ничего, что касалось языка обработки или Java, поэтому я надеюсь, что кто-то может помочь мне с этой проблемой, которую я имею.

edit

Как указывает Джон ниже, кажется, что последовательный порт недостаточно быстр для отправки такого большого количества данных с той скоростью, которую я хочу.Кто-нибудь знает о других доступных интерфейсах Arduino?

end edit

Я использую Arduino для управления сеткой из 400 светодиодов RGB, которые я подключил.Для отправки команд в arduino я написал небольшую программу в Processing, которая управляет большим массивом, который представляет светодиоды.Затем я пытаюсь обновить сетку, посылая 800 байтов данных в arduino каждые 20 мс со скоростью 115200 бод по последовательному порту.Код обработки, который вызывается каждые 20 мс:

  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 у меня есть 1D массив (дисплей), который представляет сетку на стороне 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();
  }
}

Теперь сам код работает нормально, но при последовательной записи все замедляется.Когда я запускаю код обработки без последовательной записи, все нормально и работает с намеченной скоростью.Тем не менее, когда я добавляю серийный ввод, все становится слегка прерывистым.Процессор не достигает максимума или чего-то еще, поэтому я предполагаю, что это метод serial.write, который я вызываю.Что я могу сделать, чтобы ускорить этот код или убрать задержку при последовательной записи?

Спасибо за помощь!

Ответы [ 2 ]

8 голосов
/ 11 ноября 2010

Учи математику.

115200 бод, при 8-N-1, 11 520 байт в секунду или 86,8 мкс / байт.

За 20 мсек вы можете отправить 230,4 байта. Отправка 800 байт займет около 70 мсек.

Попытка отправить 800 байт со скоростью 115200 бод каждые 20 мс не будет работать.

0 голосов
/ 17 ноября 2013

Попробуйте добавить Serial.setTimeout(0) к setup() вашего эскиза arduino

...