我需要一些帮助来加快写入串行的速度。我发现了一些与此类似的问题,但没有涉及处理语言或 Java,所以我希望有人可以帮助我解决这个问题。
编辑
正如约翰在下面指出的那样,串行似乎不够快,无法以我想要的速度发送这么多数据。有谁知道其他可用的 arduino 接口?
结束编辑
我正在使用 arduino 来控制已连接的 400 个 RGB LED 网格。为了向 arduino 发送命令,我在 Processing 中编写了一个小程序,它操纵一个代表 LED 的大数组。然后,我尝试通过串行以 115200 波特每 20 毫秒向 arduino 发送 800 字节数据来更新网格。每 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();
}
}
现在代码本身工作正常,但是当串行写入减慢一切时。当我在没有串行写入的情况下运行处理代码时,一切都很好,以预期的速度运行。但是,当我添加连续写作时,一切都变得有些不稳定。CPU 没有达到最大值或任何东西,所以我假设它是我正在调用的 serial.write 方法。我能做些什么来加快这段代码的速度或消除串行写入的滞后?
谢谢你的帮助!