【问题标题】:Moving data from Arduino internal serial buffer into memory将数据从 Arduino 内部串行缓冲区移动到内存中
【发布时间】:2014-10-10 12:36:57
【问题描述】:

this 教程的第一部分解释了如何从 Arduino 的串行端口读取数据,如果你知道你正在接收多少个字符。

代码是这样的:

byte buffer = 0; 

void setup() { 
  Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
}

void loop(){
if (Serial.available() >= 8) { //wait for the internal serial buffer to have all 8 characters in it
  for (int i=0; i<8; i++) {
    buffer[i] = Serial.read(); //move from internal buffer into memory
  }
}

我不明白的部分是下面显示的行:

for (int i=0; i<8; i++) {
buffer[i] = Serial.read();

这不只是将内部串行缓冲区的第一位存储到我的变量“缓冲区”的所有 8 位吗?代码不应该更像这样吗?

for (int i=0; i<8; i++) {
buffer[i] = Serial.read()[i]; 

【问题讨论】:

    标签: c serial-port arduino buffer


    【解决方案1】:

    串行缓冲区是一个队列(谷歌:堆栈与队列)。队列中的字节按接收顺序处理。

    Serial.read() 从队列中取出第一个字节,读取并删除它。下次调用 Serial.read 时,队列中的下一个字节可用。

    顺便说一句,这就是为什么有一个 Serial.peek 命令的原因。它读取队列中的下一个字节但不删除它。您可以使用它来检查队列中的某些内容而无需清除它

    【讨论】:

    • @djUniversal,我正在尝试向 Arduino 发送超过 64 个字节。但它不能阅读更多。我使用 Serial.read() 但缓冲区重载。如果您有任何提示,请。这是我的问题stackoverflow.com/questions/30670717/…
    【解决方案2】:

    UART 通信是面向字节的。您永远不会处理单个位,这就是 UART 硬件的用途。

    所以不,移动整个字节是正确的。

    您的代码有错误,无法编译。 buffer 变量应该是一个数组:

    byte buffer[8];
    

    不,buffer[0] = Serial.read(); 不会以某种方式将一个位涂抹到您的所有 8 位中,它只是将一个 8 位值,所有 8 位从一个地方复制到另一个地方。数组索引运算符从不进行位级访问,C 不是那样工作的。

    8 的检查和循环是因为它想要接收单个 8 字节的消息,它不是“8 位”中的 8。

    【讨论】:

    • 但是它在一个for循环中,所以缓冲区的第一位,也就是缓冲区[1],将被分配所有的serial.read(),然后是缓冲区的第二位,也就是缓冲区[ 2],将分配所有 serial.read() 等。这是不可能的,因为 buffer[i] 是一个位,而 serial.read() 是一个字节。真正让我感到困惑的是 for 循环。你能给我解释一下吗?谢谢。
    • @Blue7 buffer 被宣布为错误,我试图在我的回答中澄清这一点。
    • byte(作为 Arduino 和 C++ 构造)实际上可能使用 [] 提供位级访问,但我不这么认为。无论如何,您链接到的代码的目的是将 8 bytes 从串行端口读取到内存缓冲区中。无需考虑单个位。
    • 对不起,我还是一头雾水。 Serial.read() 在循环的每次迭代中都是相同的。因此,所有 8 个元素都被分配了相同的值。在循环的第一次迭代中,buffer[0] = Serial.read(),在第二次迭代中,buffer[1] = Serial.read()Serial.read() 在两种情况下都是相同的。不是吗?是什么让它改变了?
    • 我会尝试澄清我的问题。我最初把我的位和字节弄混了,但现在很清楚了。我仍然感到困惑的是buffer[i] 的所有8 个元素都被分配了Serial.read()。由于serial.read() 没有改变,所以buffer[i] 的所有8 个元素都被分配了相同的值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-25
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多