You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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");
    }
  }
}

额外注意点

  1. 用else if替代两个独立的if:这样第一个条件成立时,就不会再判断第二个,避免重复执行打印。
  2. 每次打印前清屏:lcd.clear()能避免多次打印的内容重叠,防止你误以为判断逻辑出错。
  3. 清空串口缓冲区:上位机发送数据时可能附带换行/回车符,读完有效数据后把这些残留字符清掉,避免干扰下一次接收。

内容的提问来源于stack exchange,提问作者TRRRIP Triip

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 09:27:45