Serial port 带Serial.read()的Arduino代码返回

Serial port 带Serial.read()的Arduino代码返回,serial-port,arduino,Serial Port,Arduino,我的Arduino代码上的Serial.read命令有问题。我有它连接到两个74HC595的移位寄存器连接到LED的 我检查是否有串行数据,然后读取两个字节。然后将这些字节传递给一个方法,该方法将它们都移出。例如,当我用Serial.print检查字节以将它们打印到串行监视器时 49 255 50 255 我读了arduino.cc上的文档,上面说它只读取一个字节,为什么我会得到两个255。有什么想法吗 最终目标是读取串行线上的两个字节,并将它们移出移位寄存器,即十进制5和6的字节值被传递。第

我的Arduino代码上的Serial.read命令有问题。我有它连接到两个74HC595的移位寄存器连接到LED的

我检查是否有串行数据,然后读取两个字节。然后将这些字节传递给一个方法,该方法将它们都移出。例如,当我用Serial.print检查字节以将它们打印到串行监视器时

49
255
50
255
我读了arduino.cc上的文档,上面说它只读取一个字节,为什么我会得到两个255。有什么想法吗

最终目标是读取串行线上的两个字节,并将它们移出移位寄存器,即十进制5和6的字节值被传递。第一个第三个LED将在一个移位寄存器上点亮,然后第二个和第三个LED将在另一个移位寄存器上点亮

const int dataPin = 8;
const int latchPin = 9;
const int clockPin = 10;

void setup() {
  Serial.begin(9600);
}

void loop() {
  if (Serial.available() > 0) {
    byte low = Serial.read();
    byte high = Serial.read();
    Serial.println(low);
    Serial.println(high);
    sendBytes(low,high);
  }
}

void sendBytes(byte l, byte h) {
  digitalWrite(latchPin,LOW);
  shiftOut(dataPin,clockPin,MSBFIRST,l);
  shiftOut(dataPin,clockPin,MSBFIRST,h);
  digitalWrite(latchPin,HIGH);
}
这是代码中的一个bug。很可能会跳闸,串行端口没有那么快。所以Serial.available只返回1的几率很高。您可以读取低位字节,但如果没有数据可读取,Serial.read将返回-1。这使得high等于0xff。简单的解决方法是:

    if (Serial.available() >= 2)
这是代码中的一个bug。很可能会跳闸,串行端口没有那么快。所以Serial.available只返回1的几率很高。您可以读取低位字节,但如果没有数据可读取,Serial.read将返回-1。这使得high等于0xff。简单的解决方法是:

    if (Serial.available() >= 2)

我在阅读一个程序时也遇到同样的问题

我很幸运地让代码循环直到填满

在接收新的串行数据之前,我刷新串行数据以获取最新的字节

While(Serial.read() != -1);  //clears data in the PC Serial Port
下面是所有这些放在一起的样子

int i = 0;
byte bytes[3];
interval = 150;  //allows for this amount of time to read from serial
long previousMillis = 0;

void loop() {
unsigned long currentMillis = millis();

if(currentMillis - previousMillis < interval && i < 2) {

   if(Serial.available() > 0) {
   bytes[i] = Serial.read(); 
   i++; }
}

if(currentMillis - previousMillis > 1000) {  //waits 1 second to get new serial data
previousMillis = currentMillis;  //resets the timer
i = 0;
While(Serial.read() != -1);  //clears data in the PC Serial Port
}

我在阅读一个程序时也遇到同样的问题

我很幸运地让代码循环直到填满

在接收新的串行数据之前,我刷新串行数据以获取最新的字节

While(Serial.read() != -1);  //clears data in the PC Serial Port
下面是所有这些放在一起的样子

int i = 0;
byte bytes[3];
interval = 150;  //allows for this amount of time to read from serial
long previousMillis = 0;

void loop() {
unsigned long currentMillis = millis();

if(currentMillis - previousMillis < interval && i < 2) {

   if(Serial.available() > 0) {
   bytes[i] = Serial.read(); 
   i++; }
}

if(currentMillis - previousMillis > 1000) {  //waits 1 second to get new serial data
previousMillis = currentMillis;  //resets the timer
i = 0;
While(Serial.read() != -1);  //clears data in the PC Serial Port
}