Arduino串口数据比较异常:如何编写正确的if判断语句
解决Arduino串口接收判断失效的问题
看起来你踩了Arduino串口判断里的两个常见坑——要么是把赋值和比较搞混了,要么是字符与数字的类型不匹配。先给你拆解问题根源,再直接上可用的解决方案:
为什么你的两个if都会触发?
最可能的原因是你把赋值运算符=当成了比较运算符==。比如如果你的代码是这样:
if (incomingByte = 1) { // 这里是赋值,不是比较! lcd.print("LED 1"); } if (incomingByte = 2) { lcd.print("LED 2"); }
赋值语句incomingByte = 1的返回值就是1(非零),所以这个条件永远为真;第二个赋值同理也永远为真,最后LED 2的打印会覆盖之前的内容,导致你看到的结果。
另外如果是用char类型接收,但直接和数字1/2比较,也会出问题——因为串口发送的1是ASCII字符(对应数值49),和数字1完全不是一回事,条件永远不成立,反而可能因为其他逻辑导致误触发。
两种正确的实现方式
方式1:用int接收十进制数字
如果你的上位机发送的是纯十进制数字(比如直接发数字1,而非字符'1'),用Serial.parseInt()读取整数更靠谱:
#include <LiquidCrystal.h> LiquidCrystal lcd(12, 11, 5, 4, 3, 2); int incomingByte; void setup() { Serial.begin(9600); lcd.begin(16, 2); } void loop() { if (Serial.available() > 0) { // 读取串口发来的十进制整数 incomingByte = Serial.parseInt(); // 清空缓冲区,避免换行/回车符干扰下一次判断 while(Serial.available() > 0) Serial.read(); lcd.clear(); // 清屏避免内容重叠 if (incomingByte == 1) { lcd.print("LED 1"); } else if (incomingByte == 2) { lcd.print("LED 2"); } else { lcd.print("Invalid Input"); } } }
方式2:用char接收字符型数字
如果上位机发送的是字符'1'/'2'(比如串口监视器里输入1再发送),要和字符常量(带单引号)比较:
#include <LiquidCrystal.h> LiquidCrystal lcd(12, 11, 5, 4, 3, 2); char incomingByte; void setup() { Serial.begin(9600); lcd.begin(16, 2); } void loop() { if (Serial.available() > 0) { incomingByte = Serial.read(); // 清空缓冲区残留的控制字符 while(Serial.available() > 0) Serial.read(); lcd.clear(); if (incomingByte == '1') { // 注意是'1'不是1! lcd.print("LED 1"); } else if (incomingByte == '2') { lcd.print("LED 2"); } else { lcd.print("Invalid Input"); } } }
额外注意点
- 用
else if替代两个独立的if:这样第一个条件成立时,就不会再判断第二个,避免重复执行打印。 - 每次打印前清屏:
lcd.clear()能避免多次打印的内容重叠,防止你误以为判断逻辑出错。 - 清空串口缓冲区:上位机发送数据时可能附带换行/回车符,读完有效数据后把这些残留字符清掉,避免干扰下一次接收。
内容的提问来源于stack exchange,提问作者TRRRIP Triip
相关产品推荐
相关产品推荐

