2014-12-27 8 views
0

Я хочу вычислить время между передачей и получением. Мой таймер начнет подсчет, как только я начну передавать, тогда таймер остановится, как только я получу ответ. Я использую C++ на моем arduino uno. Основываясь на моем коде, я просто измеряю задержку, что плохо. то, что я пытаюсь измерить, это прошедшее время между передачей и получением. Я надеюсь, что вы можете мне помочь.Временная разница между двумя событиями

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

Я сделал то, что вы сказали sam, теперь im get - нулевое значение. Я действительно не знаю, в чем проблема. Я надеюсь, что вы можете мне помочь. [image] (http://postimg.org/image/r3587q3wf/) Это выходное изображение при использовании задержки после времени начала. [image] (http://postimg.org/image/wsq25rzgf/) – Rafael

+0

millis() предполагает, что ваше разрешение часов равно миллисекундам. Есть только 1000 миллисекунд в секунду. Вполне возможно, что код, который вы пытаетесь измерить, занимает менее миллисекунды для запуска. –

+0

Что я должен делать сам? должен ли я использовать код для определения времени? что, если я изменю millis() в micros()? – Rafael

1

Все происходит во время задержки (задержка 1000 мс). Сообщение принимается и сохраняется в буфере, ожидая, пока вы его прочитаете, пока находитесь в задержке. Теперь вы измеряете время выполнения нескольких строк кода и занимает менее миллисекунды, поэтому вы получаете 0мс время.