微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

socket CAN:使用广播管理器修改循环消息

如何解决socket CAN:使用广播管理器修改循环消息

我想知道是否有办法使用 socket can 的广播管理器来修改循环任务。我正在编写一段从缓冲区读取数据的代码,然后将其写入虚拟罐接口。因此,我想创建一个循环任务,但数据框的内容可能随时更改。我能够创建循环任务,但希望能够在运行时修改结构的数据字段。这是我当前代码的示例:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

#include <net/if.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>

#include <linux/can.h>
#include <linux/can/raw.h>
#include <linux/can/bcm.h>



int main(void)
{

    struct sockaddr_can addr;
    struct ifreq ifr;

    const char *ifname = "vcan0";
    int s;
    if((s = socket(PF_CAN,SOCK_DGRAM,CAN_BCM)) == -1) {
        perror("Error while opening socket");
        return -1;
    }

    strcpy(ifr.ifr_name,ifname);
    ioctl(s,SIocgIFINDEX,&ifr);
    
    addr.can_family  = AF_CAN;
    addr.can_ifindex = ifr.ifr_ifindex;

    printf("%s at index %d\n",ifname,ifr.ifr_ifindex);

    if(connect(s,(struct sockaddr *)&addr,sizeof(addr)) == -1) {
        perror("Error in socket bind");
        return -2;
    }

    struct {
        struct bcm_msg_head bc_manager;
        struct can_frame frame;
    } msg;

    // Transmit data
    msg.bc_manager.opcode=  TX_SETUP;
    // Start timer| Frame id is the same as CAN id
    msg.bc_manager.flags=  SETTIMER|STARTTIMER|TX_CP_CAN_ID;
    msg.bc_manager.ival2.tv_usec = 1000000;
    msg.bc_manager.ival2.tv_sec = 0;
    msg.bc_manager.can_id = 0x123;
    msg.bc_manager.nframes = 1;
    // Number of send iterations
    msg.bc_manager.count = 0;

    msg.frame.can_dlc=8;
    __u8 data_temp[8] = {0x00,0x28,0xFF,0x00,0x01,0x00};
    memcpy(msg.frame.data,data_temp,8);

    int nbytes = write(s,&msg,sizeof(msg));

    printf("Wrote %d bytes\n",nbytes);
    while(1)
    {
        __u8 new_data_temp[8] = {0x00,0x18,0x3F,0x00};
        memcpy(msg.frame.data,new_data_temp,8);
        usleep(3000000);
    }
    
    return 0;
}

当我使用 candump 查看虚拟罐上写的内容时,而不是在第一次发送后看到数据字段发生变化:

 vcan0  123   [8]  00 28 FF 00 00 01 FF 00
  vcan0  123   [8]  00 28 FF 00 00 01 FF 00
  vcan0  123   [8]  00 28 FF 00 00 01 FF 00
  vcan0  123   [8]  00 28 FF 00 00 01 FF 00
  vcan0  123   [8]  00 28 FF 00 00 01 FF 00
  vcan0  123   [8]  00 28 FF 00 00 01 FF 00
  vcan0  123   [8]  00 28 FF 00 00 01 FF 00
  vcan0  123   [8]  00 28 FF 00 00 01 FF 00
  vcan0  123   [8]  00 28 FF 00 00 01 FF 00
  vcan0  123   [8]  00 28 FF 00 00 01 FF 00
...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。