Arduino 不能足够快地处理串行
Arduino can't process serial fast enough
所以我的 Arduino 处理总共 128 个字节需要将近 200 毫秒。整个过程不写串口只用了25ms。
为什么我的 Arduino 瓶颈如此之大?
Arduino
setColor
只是使用 FastLED 库设置 ledstrip 的颜色。
void loop() {
if(Serial.available() == 4){
int led = Serial.read();
int r = Serial.read();
int g = Serial.read();
int b = Serial.read();
setColor(led, r, g, b);
Serial.write(1);
if(Serial.available() > 0) Serial.read();
}
}
C#
在一个循环中,我正在执行以下操作来写入数据:
attempt:
if (Port.isReady) {
strip.Send(new byte[] { id, c.R, c.G, c.B });
Port.isReady = false;
} else {
goto attempt;
}
public void Send(byte[] bytes) {
port.Write(bytes, 0, bytes.Length);
}
我使用以下方法阅读了 Arduino 的回复:
private const int DONE = 1;
public void SerialPortDataReceived(object sender, SerialDataReceivedEventArgs e) {
Console.WriteLine("- Serial port data received -");
Console.WriteLine("Nr. of bytes: {0}", port.BytesToRead);
if (port.ReadByte() == DONE) {
isReady = true;
}
port.DiscardInBuffer();
}
好吧,这完全取决于您的波特率。如果您的波特率为 9600,则每秒可以接收 9600 位,即 1200 字节。
所以 128/1200 = 0.1066 = 107 毫秒花费在接收 128 个字节上。
波特率越高,读取时间越短。
那你问为什么要花 200 毫秒?
我的猜测是因为对 setColor()
的调用很多
您每 4 个字节调用一次,即 32 次。
我不知道该函数的执行时间,但如果它大约是 2-3 毫秒,那么你很快就达到了 200 毫秒。
所以我的 Arduino 处理总共 128 个字节需要将近 200 毫秒。整个过程不写串口只用了25ms。 为什么我的 Arduino 瓶颈如此之大?
Arduino
setColor
只是使用 FastLED 库设置 ledstrip 的颜色。
void loop() {
if(Serial.available() == 4){
int led = Serial.read();
int r = Serial.read();
int g = Serial.read();
int b = Serial.read();
setColor(led, r, g, b);
Serial.write(1);
if(Serial.available() > 0) Serial.read();
}
}
C#
在一个循环中,我正在执行以下操作来写入数据:
attempt:
if (Port.isReady) {
strip.Send(new byte[] { id, c.R, c.G, c.B });
Port.isReady = false;
} else {
goto attempt;
}
public void Send(byte[] bytes) {
port.Write(bytes, 0, bytes.Length);
}
我使用以下方法阅读了 Arduino 的回复:
private const int DONE = 1;
public void SerialPortDataReceived(object sender, SerialDataReceivedEventArgs e) {
Console.WriteLine("- Serial port data received -");
Console.WriteLine("Nr. of bytes: {0}", port.BytesToRead);
if (port.ReadByte() == DONE) {
isReady = true;
}
port.DiscardInBuffer();
}
好吧,这完全取决于您的波特率。如果您的波特率为 9600,则每秒可以接收 9600 位,即 1200 字节。
所以 128/1200 = 0.1066 = 107 毫秒花费在接收 128 个字节上。
波特率越高,读取时间越短。
那你问为什么要花 200 毫秒?
我的猜测是因为对 setColor()
的调用很多
您每 4 个字节调用一次,即 32 次。
我不知道该函数的执行时间,但如果它大约是 2-3 毫秒,那么你很快就达到了 200 毫秒。