【发布时间】:2015-12-30 01:55:39
【问题描述】:
我有一个使用 USB 将 RGB 颜色代码发送到 Arduino 的计算机软件。当它们被缓慢发送时它工作正常,但是当它们每秒发送数十个时它会吓坏。我认为发生的事情是 Arduino 串行缓冲区填充得如此之快,以至于处理器无法按照我阅读的方式处理它。
#define INPUT_SIZE 11
void loop() {
if(Serial.available()) {
char input[INPUT_SIZE + 1];
byte size = Serial.readBytes(input, INPUT_SIZE);
input[size] = 0;
int channelNumber = 0;
char* channel = strtok(input, " ");
while(channel != 0) {
color[channelNumber] = atoi(channel);
channel = strtok(0, " ");
channelNumber++;
}
setColor(color);
}
}
例如,计算机可能会发送255 0 123,其中数字用空格分隔。当发送间隔足够慢或缓冲区总是只填充一种颜色代码时,这可以正常工作,例如255 255 255,它是 11 个字节 (INPUT_SIZE)。但是,如果颜色代码不是 11 字节长并且立即发送第二个代码,则代码仍会从串行缓冲区读取 11 个字节并开始组合颜色并将它们弄乱。如何避免这种情况,但要尽可能保持高效?
【问题讨论】:
-
您的意思是字节,而不是位。但是,如果您打算读取的数据并不总是 11 个字节长,那么您就不能只读取 11 个字节并期望一切正常。如果第一条消息是“1 2 3”,第二条消息是“12 3 4”,则输入中的数据将为“1 2 312 3 4”。在我看来,不可能知道它是指“1 2 3”后跟“12 3 4”,还是表示“1 2 31”后跟“2 3 4”?你能改变格式,例如将三个字节作为二进制字节发送,而不是转换为文本?
-
感谢@ThomasPadron-McCarthy!我更改了计算机上的程序以发送 HEX 颜色代码。现在我总是收到六个字节,然后我需要将其转换回 RGB。 pastebin.com/JL31zwWQ
-
不明白怎么是6字节?您应该为每个通道发送 1 个字节,即三个。此外,使用结构将原始输入映射到您的格式化版本。请参阅下面的帖子。
标签: c arduino serial-port embedded usb