You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

LabVIEW与Arduino串口通信控制继电器问题求助

问题描述

我制作了LabVIEW VI,通过串口与Arduino通信控制继电器。在Arduino IDE中发送指令时继电器响应迅速,但在LabVIEW中,必须在VISA Write子VI前添加至少1.6秒延迟才能正常触发继电器。尝试调高波特率到更高数值,问题没有改善,求解决方法。

附Arduino代码:

int Relay1 = 4;
int Relay2 = 2;
int incomingByte1;

void setup() {
  pinMode(13, OUTPUT);     //Set Pin13 as output
  digitalWrite(13, HIGH);  //Set Pin13 High
  pinMode(Relay1, OUTPUT); //Set Pin4 as output
  pinMode(Relay2, OUTPUT); //Set Pin2 as output 
  Serial.begin(9600); //Start serial communication at 9600 baud
}
void loop() {
  incomingByte1 = Serial.parseInt();
  if (incomingByte1 == 2)
  {digitalWrite(Relay1, LOW);
  digitalWrite(Relay2, HIGH);
  Serial.println("DOWN");    //Actuate relays to negative polarity
  }
  else if (incomingByte1 == 3)
  {digitalWrite(Relay1, HIGH);
  digitalWrite(Relay2, LOW);
  Serial.println("UP");    //Actuate relays to positive polarity
  }
  else {Serial.println(incomingByte1);}
  }
解决方案

问题核心是Arduino代码中Serial.parseInt()的默认超时机制,以及LabVIEW打开串口时Arduino的重启特性导致的等待:

1. 修改Arduino代码,替换Serial.parseInt()

Serial.parseInt()默认会等待1秒来收集完整的数字输入,LabVIEW打开串口时Arduino会自动重启,此时立刻发送指令会被parseInt的超时逻辑阻塞,必须等超时结束才能处理下一次输入。换成直接读取单字节的方式,彻底避免超时等待:

int Relay1 = 4;
int Relay2 = 2;
int incomingByte1;

void setup() {
  pinMode(13, OUTPUT);
  digitalWrite(13, HIGH);
  pinMode(Relay1, OUTPUT);
  pinMode(Relay2, OUTPUT);
  Serial.begin(9600);
  // 可选:等待USB串口连接完成(仅适用于带USB的Arduino)
  while (!Serial);
}

void loop() {
  // 检查串口缓冲区是否有数据可读
  if (Serial.available() > 0) {
    // 读取单个ASCII字符,转换为数字(比如"2"的ASCII码是50,减48得到数字2)
    incomingByte1 = Serial.read() - '0';
    
    if (incomingByte1 == 2) {
      digitalWrite(Relay1, LOW);
      digitalWrite(Relay2, HIGH);
      Serial.println("DOWN");
    } else if (incomingByte1 == 3) {
      digitalWrite(Relay1, HIGH);
      digitalWrite(Relay2, LOW);
      Serial.println("UP");
    } else {
      Serial.println(incomingByte1);
    }
  }
}

2. LabVIEW端配套调整

  • 打开串口后,先执行一次VISA Read读取并丢弃缓冲区的初始乱码(Arduino重启时可能发送的无用数据),再发送控制指令。
  • VISA Write发送的内容改为字符串格式的单个数字(比如发送"2"或"3",而非二进制数字值),匹配Arduino代码的ASCII读取逻辑。
  • 无需添加1.6秒延迟,最多保留100ms以内的短延迟(用于等待Arduino串口初始化完成)即可。

3. 备选方案(保留Serial.parseInt()的情况)

如果不想修改读取逻辑,可以在Arduino的setup()中缩短parseInt的超时时间:

void setup() {
  // ... 其他初始化代码
  Serial.begin(9600);
  Serial.setTimeout(100); // 将超时从默认1秒改为100毫秒
}

这种方式能减少等待时间,但不如直接读取单字节可靠。

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

火山引擎 最新活动