文章
Scheduling transmit CAN message with NTCAN
refer to NTCAN Application Developers Manual document charpter
- 3.12 Object Mode (Transmit), Scheduling Mode
- 3.9 Timestamps
- 4.2.9 canIoctl(), Tx-Object Mode related I/O controls
- 6.2.7 CSCHED
- 8 Example Source, Scheduling messages(Classical CAN)
example code
schedtx.c :每隔50毫秒发送一条CAN消息,ID为11-bit的001,data在前5秒内显示为"American"的8字节ASCII数据,后5秒更新为"Canadian"的8字节ASCII数据。计数器使用了一个字节,递增方式(NTCAN_SCHED_FLAG_INC8),占据了data域内的第6个字节位置(从第0个字节开始算起)(NTCAN_SCHED_FLAG_OFS6)。计数器初始值为0xA0,结束值为0x20。
CSCHED data type
-
NTCAN_SCHED_FLAG_INC8 (INC16, INC32) 1.1 INC8代表使用8-bit的计数器,递增计数。 1.2 INC16代表使用16-bit的计数器,递增计数。 1.3 INC32代表使用32-bit的计数器,递增计数。
-
NTCAN_SCHED_FLAG_DEC8 (DEC16, DEC32) 2.1 DEC8代表使用8-bit的计数器,递减计数。 2.2 DEC16代表使用16-bit的计数器,递减计数。 2.3 DEC32代表使用32-bit的计数器,递减计数。
-
NTCAN_SCHED_FLAG_OFS0 (OFS0 - OFS7) 3.1 NTCAN_SCHED_FLAG_OFS0代表在发送的CMSG的8个data域中,从第0个data位置开始用来做计数。 3.1.1 如果使用INC8或者DEC8的flag的话,只占用1个byte,也就是只占用第0个data位置用来做计数。 3.1.2 如果使用INC16或者DEC16的flag的话,将占用2个bytes,也就是占用第0个和第1个,共2个data位置用来计数。 3.1.3 如果使用INC32或者DEC32的flag的话,将占用4个bytes,也就是占用第0个到第3个,共4个data位置用来计数。 3.2 NTCAN_SCHED_FLAG_OFS1代表在发送的CMSG的8个data域中,从第1个data位置开始用来做计数。 3.2.1 如果使用INC8或者DEC8的flag的话,只占用1个byte,也就是只占用第1个data位置用来做计数。 3.2.2 如果使用INC16或者DEC16的flag的话,将占用2个bytes,也就是占用第1个和第2个,共2个data位置用来计数。 3.2.3 如果使用INC32或者DEC32的flag的话,将占用4个bytes,也就是占用第1个到第4个,共4个data位置用来计数。
-
time_interval 设定发送消息的间隔时间 4.1 请使用example code中的方式来设定间隔时间。
/*设定间隔为50毫秒*/
uint64_t timestampFreq;
uint32_t time_interval_ms=50;
retvalue = canIoctl(txhandle, NTCAN_IOCTL_GET_TIMESTAMP_FREQ, ×tampFreq);
schedule.time_interval = ((timestampFreq * time_interval_ms) / 1000ULL);
- CSCHED.id值要与CMSG.id的值一样,两者才能在canIoctl NTCAN_IOCTL_TX_OBJ_SCHEDULE时候建立起关联。
cmsg.id = (uint32_t) 1;
schedule.id = (uint32_t) 1;
举例说明
- 在schedtx.c中有如下代码片段。
memset(&cmsg, 0, sizeof(CMSG));
cmsg.id = (uint32_t) 1;
cmsg.len = 8;
strcpy((char *)cmsg.data, "American");
memset(&schedule, 0, sizeof(CSCHED));
schedule.id = (uint32_t) 1;
schedule.flags = NTCAN_SCHED_FLAG_EN|
NTCAN_SCHED_FLAG_INC8|
NTCAN_SCHED_FLAG_OFS6;
schedule.time_start = 0;
schedule.time_interval = ((timestampFreq * time_interval_ms) / 1000ULL);
schedule.count_start = 0xA0;
schedule.count_stop = 0x20;
- 编译执行,用CANreal抓取此程序发送的CAN消息,txt格式logfile和canreal格式logfile。如下面图一所示,注意其中黄色圈内的数字。初始计数值为0xA0。由于设定的是1个字节计数器(NTCAN_SCHED_FLAG_INC8),计数到0xFF时计数器reset从0重新开始计数,直到0x20计数结束。然后重新从0xA0开始计数。
截图
- 图一
