【问题标题】:C++ Void Call TimeoutC++ 无效调用超时
【发布时间】:2017-01-23 16:55:45
【问题描述】:

我在 Raspberry Pi 上的 C++ 应用程序出现问题。此脚本应在终止前打印一次以厘米为单位的距离。但它还应该检查超声波传感器是否连接,如果没有,脚本应该中断。我怎么能那样做?有没有办法为 getCM() 方法设置超时或者有其他想法来解决这个问题? 这是代码:

...

void setup() {
    wiringPiSetup();
    pinMode(TRIG_R, OUTPUT);
    pinMode(ECHO_R, INPUT);

    digitalWrite(TRIG_F, LOW);
    delay(30);
}

int getCM() {

    digitalWrite(TRIG_R, HIGH);
    delayMicroseconds(20);
    digitalWrite(TRIG_R, LOW);

    //Wait for echo start
    while(digitalRead(ECHO_R) == LOW);

    //Wait for echo end
    long startTime = micros();
    while(digitalRead(ECHO_R) == HIGH);
    long travelTime = micros() - startTime;

    int distance = travelTime / 58;

    return distance;
}
int main(void) {

    setup();

    printf("Distance: %dcm\n", getCM());

    return 0;
}

提前致谢!
蒂姆

【问题讨论】:

  • 我希望人们停止将 C++ 程序称为“脚本”。

标签: c++ raspberry-pi timeout


【解决方案1】:

提前检查超声波传感器,如果不了解传感器的更多信息,没有人可以提出太多建议。如果通信纯粹是位切换,如果没有更多硬件,您可能无法分辨。

对于第二部分,超时getCM,在digitalRead 循环中添加一个额外条件以强制退出。例如:

int timeout = <read timeout goes here>;
while((digitalRead(ECHO_R) == LOW)&&(--timeout));
if (!timeout)
{
    return -1; // Should never be able to read less than blanking distance 
               // from an ultrasonic sensor. -1 is certainly out of range.
}

main 中,您可以打印出 -1 或检查 -1 并打印出更好的错误消息。为了更清楚起见,第二个循环可以return -2; 失败,这样你就知道失败了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-14
    相关资源
    最近更新 更多