1

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

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

49
255
50
255

为什么我得到两个 255 我已经阅读了 arduino.cc 上的文档,它说它只读取一个字节。有任何想法吗?

最终目标是读取串行线上的两个字节并将它们移出到移位寄存器的 IE 是十进制 5 和 6 的字节值通过了第一个第三个 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);
}
4

2 回答 2

7
    if (Serial.available() > 0) {
            byte low = Serial.read();
            byte high = Serial.read();
            //...

这是您的代码中的一个错误。很可能会跳闸,串口没那么快。Serial.available() 仅返回 1 的几率如此之高。您可以读取字节,但如果没有要读取的数据,Serial.read() 将返回 -1。这使得高等于0xff。简单的解决方法是:

    if (Serial.available() >= 2)
于 2013-07-09T12:32:00.890 回答
0

我从程序中读取时遇到了同样的问题......

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

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

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
}
于 2015-01-03T04:17:20.900 回答