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(),会怎么样?因为在几秒钟内有一百万微秒,所以你更有可能得到有意义的结果。