2014-12-27 4 views
0

내가 전송할 때와받을 때 사이의 시간을 계산하고 싶습니다. 타이머가 전송을 시작하면 타이머가 시작되고 응답을 받으면 타이머가 멈 춥니 다. 내 arduino unoC++을 사용하고 있습니다. 내 코드를 기반으로 지연을 측정하고 있습니다. 어느 것이 좋지 않습니다. 내가 측정하려고하는 것은 전송과 수신 사이의 경과 시간입니다. 네가 나를 도울 수 있기를 바랍니다.두 이벤트 사이의 시간 간격

output image

내 코드

#include <VirtualWire.h>   

const int transmit_pin = 12;  
const int receive_pin = 11;     
char *controller;   

unsigned long start, finished, elapsed;   

void setup() {   

    //receiver settings   

    Serial.begin(9600); // Debugging only   
    vw_set_rx_pin(11);   
    vw_rx_start();   

    //transmitter settings   
    pinMode(13, OUTPUT);   

    vw_set_ptt_inverted(true);   
    vw_set_tx_pin(12);   
    vw_setup(1000); // speed of data transfer Kbps   

}   
void displayResult()   
{   
    float h,m,s,ms;   
    unsigned long over;   
    elapsed=finished-start;   
    h=int(elapsed/3600000);   
    over=elapsed%3600000;   
    m=int(over/60000);   
    over=over%60000;   
    s=int(over/1000);   
    ms=over%1000;   
    Serial.print("Raw elapsed time: ");   
    Serial.println(elapsed);   
    Serial.print("Elapsed time: ");   
    Serial.print(h,0);   
    Serial.print("h ");   
    Serial.print(m,0);     
    Serial.print("m ");   
    Serial.print(s,0);   
    Serial.print("s ");   
    Serial.print(ms,0);   
    Serial.println("ms");   
    Serial.println();   
}   

void loop() {   

    //Transmitter   
    digitalWrite(13, 1);   
    controller = "1";   
    vw_send((uint8_t *)controller, strlen(controller));   
    vw_wait_tx(); //Wait until the whole message is go   

start=millis();   
delay(1000); // for debounce   
Serial.println("Started...");   

    //Receiver   
    uint8_t buf[VW_MAX_MESSAGE_LEN];   
    uint8_t buflen = VW_MAX_MESSAGE_LEN;   

    if (vw_get_message(buf, &buflen)) { // Non-blocking   
    digitalWrite(13, 0); //Flash a light to show received good   
    for(int i = 0;i < buflen;i++) {   
    if (buf[i] == '2')   
    {   

finished=millis();   
delay(1000); // for debounce   
displayResult();   

    elapsed=finished-start;       
    Serial.print(start);     
    Serial.println(" milliseconds start");     
Serial.print(finished);     
    Serial.println(" milliseconds finished");      
    Serial.print(elapsed);      
    Serial.println(" milliseconds elapsed");      
    Serial.println();     

    }   
    }    

    }     
    }    

답변

1

당신이 말하는 "내 코드 그냥 좋지 않아 지연을 측정하고 있습니다에 대한 자료." 물론,

확인 : 당신이 당신의 경과 시간의 지연을 포함하지 않는 경우

start=millis();   
delay(1000); // for debounce 

음, 다음 후 지연()가 아닌 이전을 시작 시간 을.

이것은 너무 명백한 것 같습니다. 그래서 나는 당신이 정말로 다른 것에 대해 묻고 있다고 의심합니다. 당신은 당신이 얻는 결과물, 왜 그것이 틀렸다고 생각하는지, 그리고 당신이 얻고 자하는 결과물을 보여줄 필요가 있습니다.

+0

나는 당신이 샘에게 말한 것을했는데, 지금 나는 얻는 것이 0 값이다. 나는 정말로 그 문제가 뭔지 모른다. 네가 나를 도울 수 있기를 바랍니다. [이미지] (http://postimg.org/image/r3587q3wf/) 이것은 시작 시간 이후의 지연을 사용하면 출력 이미지입니다. [이미지] (http://postimg.org/image/wsq25rzgf/) – Rafael

+0

millis()는 시계의 해상도가 밀리 초 단위임을 나타냅니다. 1 초에 1000 밀리 초 밖에 없습니다. 측정하려는 코드가 실행되는 데 1 밀리 초도 채 걸리지 않을 수도 있습니다. –

+0

샘 (Sam)을 어떻게해야합니까? 시간을 결정하는 데 코드를 사용해야합니까? millis()를 마이크로()로 변경하면 어떻게 될까요? – Rafael

1

모든 일은 지연 기간 (1000ms 지연) 동안 발생합니다. 지연 중에 메시지를 읽고 기다리는 동안 버퍼에 메시지가 수신되고 저장됩니다. 이제는 두 줄의 코드 실행 시간을 측정하고 있으며, 이는 밀리 초 미만이므로 0ms 시간을 얻는 것입니다.