0

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;
}

このコードは正しく機能し、5 つのメッセージを 100 ミリ秒間隔で 1 回送信するだけですが、これは私が望むものではありません。5 つのメッセージ (frame[0] から frame[4] まで) を 1 回送信し、最後のフレーム (frame[4]) のみを常に 100ms の間隔で送信し続けます。したがって、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 メッセージをどこでどのように処理できますか? 私の目的を達成するための別の簡単な方法はありますか?

4

2 に答える 2

0

msgを 2 つのインスタンスに分割する必要がありますbcm_message

最初のものでは、フレーム 0 から 3 を構成します。SETTIMERこれらSTARTTIMERのメッセージを一度だけ送信したい場合は、実際には必要ありません。

2 番目のインスタンスではframe[4]、コードの内容を構成するだけです。次にiva2.tv_usec、そのフレームにのみ適用されるものを設定できます。

于 2019-05-13T11:17:53.413 に答える