文章

Receive CAN messages with Timestamps with NTCAN

refer to NTCAN Application Developers Manual document charpter

  • 3.9 Timestamps
  • 6.2.4 CMSG_T
  • 4.3.5 canReadT()

example code

ts_rx.c:程序展示如何使用canReadT()和CMSG_T读取接收到的CAN消息中timestamp数据,如何计算收到的CAN消息的相对时间。 首先在程序开头处读取一次timestamp(T)和timestamp frequency(F),然后用T/F算出设备从启动以来到现在所经过的时间(秒),将其存入Last变量,作为之后收到CAN消息的相对时间的时间基准。

/* Request timestamp/tick frequency of interface */
retvalue = canIoctl(rxhandle, NTCAN_IOCTL_GET_TIMESTAMP_FREQ, &timestampFreq);
if (retvalue != NTCAN_SUCCESS) {
    printf("Gathering timestamp frequency failed with %d\n", retvalue);
    canClose(rxhandle);
    return(-1);
}
retvalue = canIoctl(rxhandle, NTCAN_IOCTL_GET_TIMESTAMP, &timestamp);
if (retvalue != NTCAN_SUCCESS) {
    printf("Gathering timestamp frequency failed with %d\n", retvalue);
    canClose(rxhandle);
    return(-1);
}
last=(double)timestamp/(double)timestampFreq;

使用canReadT()接收CAN消息,消息存入CMSG_T结构中。

CMSG_T cmsg_t;
retvalue = canReadT(rxhandle, &cmsg_t, &lenRcv, NULL);

收到信息后,计算出相对于Last变量的相对时间(秒),并且将新时刻存入Last变量作为下一个接收到的CAN消息计算相对时间使用。

printf("=====================================\n");
printf("Timestamp(T): %lld (ticks)\n", cmsg_t.timestamp);
printf("TimestampFreq(F): %lld (ticks per second)\n", timestampFreq);
printf("T/F(Last)= %f (seconds)\n", last);
printf("T/F(Now)= %f (seconds)\n", (double)cmsg_t.timestamp/(double)timestampFreq);
printf("Diff b/w Now & Last= %f (seconds)\n", (double)cmsg_t.timestamp/(double)timestampFreq-last);
last=(double)cmsg_t.timestamp/(double)timestampFreq;
printf("=====================================\n");

执行过程

可以在demo system的notebook PC中,使用CANreal工具向总线发送消息。

bobtu@debian:~/ntcantest$ ./ts_rx 
Send CAN msg with 11-bit ID=0 to Exit Program!
=====================================
Timestamp(T): 688380134930 (ticks)
TimestampFreq(F): 80000000 (ticks per second)
T/F(Last)= 8596.994075 (seconds)
T/F(Now)= 8604.751687 (seconds)
Diff b/w Now & Last= 7.757612 (seconds)
=====================================
Id of received message: 601!
Len of received message: 8!
Byte 0 of received message :23!
Byte 1 of received message :0!
Byte 2 of received message :16!
Byte 3 of received message :1!
Byte 4 of received message :8!
Byte 5 of received message :1!
Byte 6 of received message :50!
Byte 7 of received message :22!

=====================================
Timestamp(T): 688380158379 (ticks)
TimestampFreq(F): 80000000 (ticks per second)
T/F(Last)= 8604.751687 (seconds)
T/F(Now)= 8604.751980 (seconds)
Diff b/w Now & Last= 0.000293 (seconds)
=====================================
Id of received message: 581!
Len of received message: 8!
Byte 0 of received message :80!
Byte 1 of received message :0!
Byte 2 of received message :16!
Byte 3 of received message :1!
Byte 4 of received message :2!
Byte 5 of received message :0!
Byte 6 of received message :1!
Byte 7 of received message :6!

=====================================
Timestamp(T): 688561246443 (ticks)
TimestampFreq(F): 80000000 (ticks per second)
T/F(Last)= 8604.751980 (seconds)
T/F(Now)= 8607.015581 (seconds)
Diff b/w Now & Last= 2.263601 (seconds)
=====================================
Id of received message: 601!
Len of received message: 8!
Byte 0 of received message :40!
Byte 1 of received message :0!
Byte 2 of received message :18!
Byte 3 of received message :1!
Byte 4 of received message :0!
Byte 5 of received message :0!
Byte 6 of received message :0!
Byte 7 of received message :0!

=====================================
Timestamp(T): 688561267093 (ticks)
TimestampFreq(F): 80000000 (ticks per second)
T/F(Last)= 8607.015581 (seconds)
T/F(Now)= 8607.015839 (seconds)
Diff b/w Now & Last= 0.000258 (seconds)
=====================================
Id of received message: 581!
Len of received message: 8!
Byte 0 of received message :43!
Byte 1 of received message :0!
Byte 2 of received message :18!
Byte 3 of received message :1!
Byte 4 of received message :81!
Byte 5 of received message :1!
Byte 6 of received message :0!
Byte 7 of received message :0!