2017-10-08 5 views
0

처음으로 무한 루프를 추가했습니다. Dugme는 루프의 변수입니다. 그러나 나는 그 고리를 깨뜨릴 수 없었다. 그래서 루프에 들어가면 나갈 수 없습니다.Arduino가 while 루프를 깨뜨리는 이유를 디버깅하는 방법은 무엇입니까?

void otoac() 
{ 
    long duration, distance; 
    while(dugme==1) 
    { 
     int distanceR = 0; 
     int distanceL = 0; 
     delay(40); 
     if(distance<=24) 
     { 
      moveStop(); 
      delay(100); 
      moveBackward(); 
      delay(300); 
      moveStop(); 
      delay(200); 
      distanceR = lookRight(); 
      delay(200); 
      distanceL = lookLeft(); 
      delay(200); 
      if(distanceR>=distanceL) 
      { 
       turnRight(); 
       moveStop(); 
      } 
      else 
      { 
       turnLeft(); 
       moveStop(); 
      } 
     } 
     else 
     { 
      moveForward(); 
     } 
     distance = readPing(); 
    } 
} 

'X'를 클릭하면 자동 모드 (응용 프로그램)로 전환되는 코드가 있습니다. 여기에 'X'를 클릭 할 때 'x'(작은 x)를 클릭하면 멈출 필요가 있지만 그 코드는 멈추지 않습니다. 이것은 'x'의 코드입니다. 나는 명령에 while 루프를 추가

뿐만 아니라, 명령, 의미에 모순, 차가 할 것입니다 작업 : YouTube에서

void otokapa() 
{ 
    dugme=0 
    motor1.setSpeed(0); 
    motor2.run(RELEASE); //turn motor1 off 
    motor2.setSpeed(0); 
    motor2.run(RELEASE); //turn motor2 off 
} 

누군가는 저에게이 답을 준 삼각형은 눌러지지 않았고, 이것은 아무 것도 아니다.

더 코드 :

void loop(){ 
    if(Serial.available() > 0){ 
    command = Serial.read(); 
    Stop(); 
    switch(command){ 
    case 'F': 
     forward(); 
     break; 
    case 'B': 
     back(); 
     break; 
    case 'L': 
     left(); 
     break; 
    case 'R': 
     right(); 
     break; 
    case 'G': 
     onsol(); 
     break; 
    case 'I': 
     onsag(); 
     break; 
    case 'H': 
     arkasag(); 
     break; 
    case 'J': 
     arkasol(); 
     break; 
    case 'W': 
     onac(); 
     break; 
    case 'w': 
     onkapa(); 
     break; 
    case 'X': 
     otoac(); 
     break; 
    case 'x': 
     otokapa(); 
     break; 
    } 
    } 
} 

및 dugme : 본질적으로이 모든 코드 int dugme=1; 및 dugme의 상단에

은 무효 otokapa과 otoac while(dugme==1)

+1

C! = C++. 실제로 사용중인 언어로 태그를 지정하십시오. – tambre

+0

그리고'otokapa' 함수는 어디에서 호출합니까? Arduino는 'otac'에서 'otacapa'를 (다른 함수를 통해 직접 또는 간접적으로) 'otokapa'라고 부르지 않는 한 병렬로 실행하지 않습니다. 그러면 'dugme'이 절대 0으로 설정되지 않습니다 (다른 곳에서하지 않는 한). –

+0

게다가 장기 실행 루프는 Arduino에서 어떻게해야하는지가 아닙니다. 'loop' 전역 함수는 루프 안에서 호출 될 것이고, 당신은 * one * 안에있는 것을 처리해야하고,'loop' 함수가 다시 호출되도록 리턴해야합니다. –

답변

0

에 있습니다 무엇 너 문제는 어떻게 생겼어?

int dugme = 1; // one and only definition of this (ODR) 

void otoac() { 
    long duration, distance; 
    while(dugme==1) { 
    } 
} 

void otokapa() { 
    dugme=0; 
} 

void loop(){ 
    if(Serial.available() > 0){ 
    command = Serial.read(); 
    Stop(); 
    switch(command){ 
    case 'X': 
     otoac(); 
     break; 
    case 'x': 
     otokapa(); 
     break; 
    } 
    } 
} 

ODR 위반 가능성이 있습니다.

loopotoac이 동일한 스레드에서 실행되는 경우에는 직렬로 다시 전송되지 않습니다.

+0

예, void otoac 및 otokapa의 추가 코드를 더한 것입니다. 그러나 당신은 이미 그것을 알고 있습니다. 어떻게 해결할 수 있을까요? 응용 프로그램에서 동일한 버튼을 탭하면 코드가 멈추도록해야합니다. 뭔가를 생각해 낼 수 있니? – GesterFromHolland

+0

'loop'에서 직접 otoac을 호출하면 otoac은 자체 스레드에서 실행되어야하며 loop는 'x'를 확인하고 'otokapa'로 중지 할 수 있습니다. – Surt

+0

어느 루프에 있습니까? while 루프에서 무슨 뜻이야? 나를 위해 모범을 보일 수 있습니까? 왜냐하면 나는 그것을 시도했지만 오류가 발생하여 다시 붙어 있습니다. 나는 arduino에 관해서 4 주 수업을했기 때문에 내 지식은 매우 낮습니다. 이미 그것을 고치는 법을 알고 있습니까? 왜냐하면 당신이 어떻게 대답했는지 xD – GesterFromHolland