在我的Arduino代码上遇到Serial.read()命令问题。我将它连接到两个连接到LED的74HC595移位寄存器。
我检查是否有串行数据,然后读取两个字节。然后将这些字节传递给一个将它们都移出的方法。当我使用Serial.print检查字节以将它们打印到串行监视器时,我得到了例如
49
255
50
255
为什么我得到两个255's我已经阅读了arduino.cc上的文档,它说它只读取一个字节。有什么想法吗?
最终目标是读取串行线上的两个字节并将它们移出到移位寄存器的IE是十进制5和0的字节值。 6通过第1个第3个LED将点亮一个移位寄存器,然后第2个和第3个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);
}
答案 0 :(得分:7)
if (Serial.available() > 0) {
byte low = Serial.read();
byte high = Serial.read();
//...
这是您的代码中的错误。很可能会跳闸,串口并不那么快。 Serial.available()只返回1的高概率你可以读 low 字节,但如果没有数据要读,Serial.read()将返回-1。这使高等于0xff。简单的解决方法是:
if (Serial.available() >= 2)
答案 1 :(得分: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
}