【问题标题】:Timing duration between two events两个事件之间的时间间隔
【发布时间】:2015-02-24 10:32:11
【问题描述】:

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

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

  }           
    }              

  }                
  }               

【问题讨论】:

    标签: c++ time arduino stopwatch


    【解决方案1】:

    你说“基于我的代码,我只是在测量延迟,这不好。”

    好吧,好吧:

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

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

    这似乎太明显了,所以我怀疑你真的在问别的东西。你需要展示你得到的输出,为什么你认为它是错误的,以及你期望得到什么输出。

    【讨论】:

    • 我做了你所说的 sam ,现在我得到的是零值。我真的不知道是什么问题。我希望你能帮助我。 image 这是使用开始时间后的延迟时的输出图像。 image
    • millis() 建议您的时钟分辨率以毫秒为单位。一秒钟只有一千毫秒。您尝试测量的代码完全有可能在不到一毫秒的时间内运行。
    • 我该怎么办?我应该用代码来确定时间吗?如果我将millis() 改为micros() 会怎样?
    • 由于 on 秒内有一百万微秒,因此您更有可能获得有意义的结果。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2013-10-08
      • 1970-01-01
      • 2014-07-12
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 2019-05-23
      • 1970-01-01
      • 2022-06-01
      相关资源
      最近更新 更多