我正在使用socketcan的广播管理器在CAN总线上写一些消息:
struct bcm_message{
struct bcm_msg_head msg_head;
struct can_frame frame[5];
};
int main(){
int s;
struct sockaddr_can addr;
struct ifreq ifr;
struct bcm_message msg;
s = socket(PF_CAN, SOCK_DGRAM, CAN_BCM);
strcpy(ifr.ifr_name, "can1");
ioctl(s, SIOCGIFINDEX, &ifr);
addr.can_family = AF_CAN;
addr.can_ifindex = ifr.ifr_ifindex;
connect(s, (struct sockaddr *)&addr, sizeof(addr));
msg.msg_head.opcode = TX_SETUP;
msg.msg_head.can_id = 0x180;
msg.msg_head.flags = SETTIMER|STARTTIMER|TX_CP_CAN_ID;
msg.msg_head.nframes = 5;
msg.msg_head.count = 5;
msg.msg_head.ival1.tv_sec = 0;
msg.msg_head.ival1.tv_usec = 100000;
msg.msg_head.ival2.tv_sec = 0;
msg.msg_head.ival2.tv_usec = 0;
msg.frame[0].can_dlc=8;
memcpy(msg.frame[0].data,(__u8[]){0x00,0x28,0xFF,0x00,0x00,0x01,0xFF,0x00},8);
msg.frame[1].can_dlc=8;
memcpy(msg.frame[1].data,(__u8[]){0x00,0x32,0xFF,0x00,0x00,0x01,0xFF,0x00},8);
msg.frame[2].can_dlc=8;
memcpy(msg.frame[2].data,(__u8[]){0x00,0x3C,0xFF,0x00,0x00,0x01,0xFF,0x00},8);
msg.frame[3].can_dlc=8;
memcpy(msg.frame[3].data,(__u8[]){0x00,0x46,0xFF,0x00,0x00,0x01,0xFF,0x00},8);
msg.frame[4].can_dlc=8;
memcpy(msg.frame[4].data,(__u8[]){0x00,0x50,0xFF,0x00,0x00,0x01,0xFF,0x00},8);
write(s, &msg, sizeof(msg));
while(1){}
return 0;
}
此代码可以正常工作,并且仅以100ms的间隔发送一次五个消息,但这不是我想要的。我想一次发送五个消息(从帧[0]到帧[4]),然后继续仅以100ms的间隔仅发送最后一个帧(帧[4])。所以bcm应该发送:
frame[0]
frame[1]
frame[2]
frame[3]
frame[4]
frame[4]
frame[4]
frame[4]
....
....
如果我将iva2.tv_usec设置为100000,它将继续发送所有帧,而我只想发送最后一个。我该怎么办?我已经读到添加TX_COUNTEVT标志,当计数达到零时,bcm将生成TX_EXPIRED消息。也许我可以处理此TX_EXPIRED消息并根据需要手动修改bcm传输?而且,以防万一,在哪里以及如何处理此TX_EXPIRED消息?还有另一种更简单的方法可以达到我的目标吗?
答案 0 :(得分:0)
您必须将msg
分为两个实例,分别为bcm_message
。
在第一个中,您将帧配置为0到3。如果只希望一次发送这些消息,则SETTIMER
和STARTTIMER
并不是必须的。
在第二个实例中,您只需配置代码中的frame[4]
。
然后,您可以设置iva2.tv_usec
仅适用于该帧。