我正在尝试在两个Arduino之间进行串行通信。
我使用了此circuit diagram,并且此代码运行良好;
void setup() {
Serial.begin(9600);
}
void loop() {
if (Serial.available()) {
switch(Serial.read())
{ case 'A':
digitalWrite(13,HIGH);
break;
case 'B':
digitalWrite(13,LOW);
break;
}
}
}
但是我不想使用开关盒。我想使用if条件。我正在尝试这段代码;
void setup() {
Serial.begin(9600);
}
void loop() {
if (Serial.available()) {
if(Serial.read()=='A')
{
digitalWrite(13,HIGH);
}
else if(Serial.read()=='B')
{
digitalWrite(13,LOW);
}
}
}
但是它不起作用。我的问题是;为什么在开关盒中起作用,但在if条件下不起作用。我的错在哪里你能解决吗?
谢谢。
答案 0 :(得分:0)
我已经尝试了两种代码,但我认为问题在于数据读取。这是我的测试代码。 发件人代码:
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.println("A"),
delay(1000);
Serial.println("B"),
delay(1000);
}
接收方代码:
int data;
void setup() {
Serial.begin(9600);
pinMode(13, OUTPUT);
}
void loop() {
if (Serial.available()) {
data = Serial.read();
if(data=='A')
{
digitalWrite(13,HIGH);
}
else if(data=='B')
{
digitalWrite(13,LOW);
}
}
}
当您尝试测试从串行通信读取的数据时,将缓冲区保存到变量然后执行所有控制任务始终是一个好习惯。这样,您可以相信数据始终是相同的。这里有更严格的解释。
当您执行一个if语句(如您所测试的语句)时,实际上并没有在一个循环中测试相同的值。if(Serial.read()=='A')
和else if(Serial.read()=='B')
实际上在两个不同的时间测试了来自串行的两个不同的读数。如果改为使用data = Serial.read()
进行单个读数,然后将存储在变量中的读数与期望值(例如data == 'A'
)进行比较,则读数将只执行一次,并在所有循环中“保持不变”。
请注意,在我的测试中,它是使用char('')而不是(“”)进行比较的。
希望我已经帮助您解决了问题。让我们知道它对您有用