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

如何在C++串口通信中实现3秒超时等待传感器响应?

解决串口无响应停滞问题:添加3秒超时机制

你的问题出在没给串口接收加超时判断——当前代码会一直卡在while (c < 8)循环里,除非收满8个字节。要实现3秒超时退出,用Arduino的millis()函数记录等待起始时间,在循环里同时检查是否收够数据和是否超时两个条件即可。

修改后的完整代码如下:

float Sensor::getTemperature(){
    bool legit_measurement = false;
    byte response[8];
    byte receiveArray[8];
    byte requestArray[] = {0x72, 0x07, 0x02, 0x00, 0x04, 0x00, 0x7F}; // 单次请求温度指令

    _serial.write(requestArray, sizeof(requestArray));
    
    int c = 0;
    unsigned long startMillis = millis(); // 记录等待起始时间
    const unsigned long timeout = 3000; // 超时时间:3000毫秒=3秒

    // 循环条件:未收满8字节 且 未超时
    while (c < 8 && (millis() - startMillis) < timeout){
        if(_serial.available() > 0){
            response[c] = _serial.read();
            Serial.print("RESPONSE: ");
            Serial.println(response[c], HEX);
            c ++;
        }
        // 可选:加微小延迟,避免空循环占用过多CPU资源
        delay(1);
    }

    // 循环退出后判断是正常收完还是超时
    if(c == 8){
        legit_measurement = true;
        // 此处添加温度数据解析逻辑,根据传感器协议调整
        float temperature = (response[3] << 8 | response[4]) / 100.0;
        return temperature;
    } else {
        // 超时处理:返回错误值或标记测量无效
        Serial.println("传感器无响应,超时退出");
        return -999.0; // 用特殊值表示超时,可按需调整
    }
}

关键说明:

  • millis()返回开机到当前的毫秒数,是无符号长整型,约50天后才会溢出,完全适配传感器场景
  • 循环同时满足两个条件才会继续:未收满8字节、未超过3秒超时时间
  • 超时后可根据需求自定义处理逻辑,比如返回错误值、打印提示信息
  • 可选的delay(1)能减少空循环对CPU的占用,不影响数据接收效率

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 06:01:01