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

C++ 两个事件之间的计时持续时间,c++,time,arduino,stopwatch,C++,Time,Arduino,Stopwatch,我想计算从发送到接收之间的时间。一旦我开始发送,我的计时器将开始计数,然后一旦我收到响应,计时器将停止。我正在我的arduino uno上使用C++。根据我的代码,我只是测量延迟,这不好。我试图测量的是我发送和接收之间经过的时间。我希望你能帮助我 我的代码 #include <VirtualWire.h> const int transmit_pin = 12; const int receive_pin = 11;

我想计算从发送到接收之间的时间。一旦我开始发送,我的计时器将开始计数,然后一旦我收到响应,计时器将停止。我正在我的
arduino uno
上使用
C++
。根据我的代码,我只是测量延迟,这不好。我试图测量的是我发送和接收之间经过的时间。我希望你能帮助我

我的代码

#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();                   

  }           
    }              

  }                
  }               
#包括
const int transmission_pin=12;
const int receive_pin=11;
字符*控制器;
未签名的长时间启动、完成、已过;
无效设置(){
//接收机设置
Serial.begin(9600);//仅调试
vw_设置_接收_引脚(11);
vw_接收_启动();
//发射机设置
pinMode(13,输出);
vw_设置_ptt_反转(真);
vw_设置_发送_引脚(12);
vw_设置(1000);//数据传输速度Kbps
}         
void displayResult()
{         
浮子h、m、s、ms;
长时间未签名;
经过=完成启动;
h=整数(已用时间/3600000);
超过=已用%3600000;
m=整数(超过/60000);
超过=超过%60000;
s=整数(超过/1000);
ms=超过%1000;
Serial.print(“原始运行时间:”);
Serial.println(已用);
串行打印(“运行时间:”);
连续打印(h,0);
连续打印(“h”);
串行打印(m,0);
连续打印(“m”);
连续打印(s,0);
连续打印;
串行打印(ms,0);
序列号。打印号(“ms”);
Serial.println();
}         
void loop(){
//发射机
数字写入(13,1);
控制器=“1”;
vw_发送((uint8_t*)控制器,strlen(控制器));
vw_wait_tx();//等待整个消息完成
开始=毫秒();
延迟(1000);//用于去盎司
Serial.println(“开始…”);
//接受者
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8\u t buflen=大众最大消息长度;
if(vw_get_message(buf,&buflen)){//非阻塞
digitalWrite(13,0);//闪烁一盏灯以显示收到的好消息
对于(inti=0;i
你说“根据我的代码,我只是在测量延迟,这不好。”

好吧,那么:

start=millis();         
delay(1000); // for debounce
好的,如果您不想在经过的时间中包含延迟,那么在延迟()之后,而不是之前取开始时间


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

在延迟期间(1000毫秒延迟),每件事都会发生。消息被接收并存储在缓冲区中,等待您在延迟期间读取。您现在正在测量几行代码的执行时间,这不到一毫秒,这就是为什么您得到0毫秒的时间。

我按您说的做了sam,现在我得到的是零值。我真的不知道是什么问题。我希望你能帮助我。这是在开始时间之后使用延迟时的输出图像。millis()表示时钟的分辨率以毫秒为单位。一秒钟只有1000毫秒。您试图测量的代码运行不到一毫秒是完全可能的。sam,我该怎么办?我应该用密码来确定时间吗?如果我将millis()改为micros(),会怎么样?因为在几秒钟内有一百万微秒,所以你更有可能得到有意义的结果。