2017-01-23 7 views
0

ラズベリーパイのC++アプリケーションに問題があります。このスクリプトは、終端の前に一度cmで距離を表示する必要があります。しかし、超音波センサーが接続されているかどうかを確認し、そうでない場合はスクリプトが壊れるようにする必要があります。どうすればいい? getCM()メソッドのタイムアウトを設定する方法はありますか?これを解決する別のアイデアがありますか? コード:C++ Voidコールタイムアウト

... 

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

ありがとうございます!
ティム

+0

私は人がC++プログラム "スクリプト"の呼び出しをやめることを望みます。 – PaulMcKenzie

答えて

0

超音波センサーを事前にチェックすることで、センサーの詳細を知らずに誰も示唆することができません。コミュニケーションが純粋にビットトグルであれば、おそらくそれ以上のハードウェアを知らなければなりません。

2番目の部分では、getCMをタイムアウトし、強制的に終了するためにdigitalReadループに余分な条件を追加します。たとえば、次のように

main
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. 
} 

あなたがプリントアウト-1かをチェック-1、より良いエラーメッセージをプリントアウトすることができます。より明確にするために、2番目のループは失敗時にreturn -2;になる可能性があります。

関連する問題