【问题标题】:Rapid Serial Port writing to Arduino from Processing从处理快速串行端口写入 Arduino
【发布时间】:2010-11-11 18:59:05
【问题描述】:

我需要一些帮助来加快写入串行的速度。我发现了一些与此类似的问题,但没有涉及处理语言或 Java,所以我希望有人可以帮助我解决这个问题。

编辑

正如约翰在下面指出的那样,串行似乎不够快,无法以我想要的速度发送这么多数据。有人知道其他可用的 arduino 接口吗?

结束编辑

我正在使用 arduino 来控制已连接的 400 个 RGB LED 网格。为了向 arduino 发送命令,我在 Processing 中编写了一个小程序,它操纵一个代表 LED 的大数组。然后,我尝试通过串行以 115200 波特每 20 毫秒向 arduino 发送 800 字节数据来更新网格。每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();
  }
}

现在代码本身工作正常,但是当串行写入减慢一切时。当我在没有串行写入的情况下运行处理代码时,一切都很好,以预期的速度运行。但是,当我添加连续写作时,一切都变得有些不稳定。 CPU 没有达到最大值或任何东西,所以我假设它是我正在调用的 serial.write 方法。我可以做些什么来加快这段代码的速度或消除串行写入的滞后?

感谢您的帮助!

【问题讨论】:

    标签: java c embedded serial-port processing


    【解决方案1】:

    算一算。

    115200 波特在 8-N-1 下,每秒 11,520 字节,或 86.8 微秒/字节。

    在 20 毫秒内,您可以发送 230.4 个字节。发送 800 字节大约需要 70 毫秒。

    尝试每 20 毫秒以 115200 波特率发送 800 个字节是行不通的。

    【讨论】:

    • 哇,我一定是算错了。关于每 20 毫秒向 arduino 获取 800 个字节的方法有什么想法吗?
    • 请注意,由于协议开销,RS-232 串行端口必须花费大约 10 位时间来发送单个字节。这个开销实际上包含在 John 的数学中。
    • @William,不熟悉可用的接口,但您可以使用 USB 或 SPI。从我在这里看到的数据来看,您需要大约 320 kBaud。
    • @William:如果连续帧之间的差异很小,您可以只发送与前一帧的差异,而不是每次都重新发送整个帧。
    • 115200bps 太慢了,但是 460800bps 或 921600bps 都不是问题。 Widnows 支持这些速度,但主板内置的 RS232 很少支持高于 115200。因此他需要购买具有 921600bps RS232 的 PCI 卡,或支持这些高速的 USBRS232 转换器电缆(如果我记得很好,基于 FTDI 的将做这项工作)。如果在 RX 接收期间 AVR 没有被其他任何东西中断,那么这是可行的。
    【解决方案2】:

    尝试将Serial.setTimeout(0) 添加到您的arduino 草图的setup()

    【讨论】:

    • 嘿...也许您可能想解释一下为什么进行建议的更改会解决问题...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    相关资源
    最近更新 更多