两个事件之间的计时持续时间

时间:2014-12-27 15:12:21

标签: c++ time arduino stopwatch

我想计算发送和收到之间的时间。一旦我开始发送,我的计时器将开始计数,然后一旦收到响应,计时器就会停止。我在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();                   

  }           
    }              

  }                
  }               

2 个答案:

答案 0 :(得分:1)

你说&#34;根据我的代码,我只测量延迟,这不好。&#34;

好的,好的:

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

好吧,如果你不想在你的经过时间中包含延迟,那么在延迟()后的开始时间,而不是之前。

这似乎太明显了,所以我怀疑你真的在问别的事情。您需要显示您正在获得的输出,您认为错误的原因以及您期望得到的输出。

答案 1 :(得分:1)

在延迟期间(1000毫秒延迟),每件事都会发生。收到消息并将其存储在缓冲区中,等待您在延迟时读取它。您现在正在测量几行代码的执行时间,这需要不到一毫秒的时间,这就是您获得0ms时间的原因。