2017-03-22 70 views
-3

它是我第一次來這裏。我的代碼是假設使兩個超聲波傳感器同時使用mbed功能。但是,我似乎無法讓兩個類都在同時運行的代碼中使us_right()和void us_left()無效。請幫助:(C++:兩個類不同時運行

#include "mbed.h" 
DigitalOut triggerRight(p9); 
DigitalIn echoRight(p10); 
DigitalOut triggerLeft(p13); 
DigitalIn echoLeft(p14); 
//DigitalOut myled(LED1); //monitor trigger 
//DigitalOut myled2(LED2); //monitor echo 
PwmOut steering(p21); 
PwmOut velocity(p22); 
int distanceRight = 0, distanceLeft = 0; 
int correctionRight = 0, correctionLeft = 0; 
Timer sonarRight, sonarLeft; 

float vo=0; 

// Velocity expects -1 (reverse) to +1 (forward) 
void Velocity(float v) { 
    v=v+1; 
    if (v>=0 && v<=2) { 
     if (vo>=1 && v<1) {     // 
      velocity.pulsewidth(0.0014); // this is required to 
      wait(0.1);      // 
      velocity.pulsewidth(0.0015); // move into reverse 
      wait(0.1);      // 
     }         // 
     velocity.pulsewidth(v/2000+0.001); 
     vo=v; 
    } 
} 

// Steering expects -1 (left) to +1 (right) 
void Steering(float s) { 
    s=s+1; 
    if (s>=0 && s<=2) { 
     steering.pulsewidth(s/2000+0.001); 
    } 
} 

void us_right() { 
    sonarRight.reset(); 
    sonarRight.start(); 
    while (echoRight==2) {}; 
    sonarRight.stop(); 
    correctionRight = sonarLeft.read_us(); 
    triggerRight = 1; 
    sonarRight.reset(); 
    wait_us(10.0); 
    triggerRight = 0; 
    while (echoRight==0) {}; 
    // myled2=echoRight; 
    sonarRight.start(); 
    while (echoRight==1) {}; 
    sonarRight.stop(); 
    distanceRight = ((sonarRight.read_us()-correctionRight)/58.0); 
    printf("Distance from Right is: %d cm \n\r",distanceRight); 
} 

void us_left() { 
    sonarLeft.reset(); 
    sonarLeft.start(); 
    while (echoLeft==2) {}; 
    sonarLeft.stop(); 
    correctionLeft = sonarLeft.read_us(); 
    triggerLeft = 1; 
    sonarLeft.reset(); 
    wait_us(10.0); 
    triggerLeft = 0; 
    while (echoLeft==0) {}; 
    // myled2=echoLeft; 
    sonarLeft.start(); 
    while (echoLeft==1) {}; 
    sonarLeft.stop(); 
    distanceLeft = (sonarLeft.read_us()-correctionLeft)/58.0; 
    printf("Distance from Left is: %d cm \n\r",distanceLeft); 
} 

int main() { 
    while(true) { 
     us_right(); 
     us_left(); 
    } 
    if (distanceLeft < 10 || distanceRight < 10) { 
      if (distanceLeft < distanceRight) { 
       for(int i=0; i>-100; i--) {  // Go left 
        Steering(i/100.0); 
        wait(0.1); 
       } 
      } 
      if (distanceLeft > distanceRight) { 
       for(int i=0; i>100; i++) {  // Go Right 
        Steering(i/100.0); 
        wait(0.1); 
       } 
      }    
    } 
     wait(0.2); 
} 
+2

類不運行。函數運行。 –

+1

你爲什麼期望它們同時運行?我的例子中沒有看到與線程相關的代碼。 –

回答

0

您需要使用一些機制來創建新的線程或進程。你的實現是連續的,沒有什麼你就告訴該代碼同時運行。

您應該採取看看一些線程庫(並行線程例如,或者如果你有機會獲得C++ 11,有沒有線程功能)或如何創建新的進程,以及某種消息傳遞這些過程之間的接口。

0

創建兩個線程,每個超聲波傳感器一個線程:

void read_left_sensor() { 
    while (1) { 
     // do the reading 
     wait(0.5f); 
    } 
} 

int main() { 
    Thread left_thread; 
    left_thread.start(&read_left_sensor); 

    Thread right_thread; 
    right_thread.start(&read_right_sensor); 

    while (1) { 
     // put your control code for the vehicle here 
     wait(0.1f); 
    } 
} 

您可以使用全局變量來寫讀取傳感器時,在你的主循環閱讀。內存是共享的。

0

你的第一個問題是,你已經把你的無限while(true)循環之外的代碼。這後面的代碼將永遠不會運行。但是,也許你知道這一點。

int main() { 

    while(true) { 
     us_right(); 
     us_left(); 
    } // <- Loops back to the start of while() 

    // You Never pass this point!!! 

    if (distanceLeft < 10 || distanceRight < 10) { 
      // Do stuff etc. 
    } 
    wait(0.2); 
} 

但是,我認爲你期待us_right()和us_left()正好在同一時間發生。你不能在順序環境中做到這一點。

揚Jongboom是在暗示着你可以使用線程正確。這允許'OS'爲每段代碼運行指定時間。但它仍然不是真正平行的。每個功能(類別是不同的東西)將有機會運行。一個會運行,當它結束時(或等待中),另一個功能將有機會運行。當您使用mbed時,我建議您的項目是MBED OS 5項目 (您在開始新項目時選擇此選項)。否則,您需要使用RTOS庫。有一個使用線程的眨眼示例應該總結得很好。 Here is more info

線程對於沒有經驗的人來說可能是危險的。所以,堅持一個簡單的實施開始。確保你瞭解什麼/爲什麼/你是如何做的。

旁白:從硬件角度來看,並行運行的超聲波傳感器實際上並不理想。他們都播放相同的頻率,並可以聽到對方。同時觸發它們,它們會相互干擾。

試想兩個人在一個封閉的房間喊的話。如果他們輪流做,他們會說什麼很明顯。如果他們同時喊叫,那將非常困難!

因此,實際上,不能夠並行運行可能是一件好事。