CAN BUS Linux Socketcan 上的套接字读取错误?

问题描述

我实现了一个 CAN 总线通信,用于使用 linux 进行写入和读取操作。我正在使用 socketCan 库。 写入功能正常工作。我的阅读功能有问题:

int can_receive(void)
{
    struct can_frame frameRead;
    //struct sockaddr_can addr;
    //struct ifreq ifr;
    //struct timeval tv;

    //socklen_t len = sizeof(addr);
    int8_t nbytesReceive;
    //nbytesReceive = 16;
    LE_INFO("while");
    /*
    while(nbytesReceive != -1)
    {
        if((nbytesReceive = recvfrom(sdr,&frameRead,sizeof(struct can_frame),(struct sockaddr *)&addr,&len)) != sizeof(struct can_frame))
        {
            LE_INFO("Socket reading error,nbytesReceive = %d",nbytesReceive);
            return SOCK_READING_ERROR;
        }
        else
        {
            ifr.ifr_ifindex = addr.can_ifindex;
            ioctl(sdr,SIocgIFNAME,&ifr);
            ioctl(sdr,SIocgSTAMP,&tv);
            LE_INFO( "     Receive message %02X %02X %02X %02X %02X %02X %02X %02X %02X",frameRead.can_id,frameRead.data[0],frameRead.data[1],frameRead.data[2],frameRead.data[3],frameRead.data[4],frameRead.data[5],frameRead.data[6],frameRead.data[7] );
        }
    }*/
    LE_INFO("SDR is: %d ",sdr);
    nbytesReceive = read(sdr,sizeof(frameRead));
    
    LE_INFO("nbytes is: %d ",nbytesReceive);
      while(nbytesReceive != 0)
      
    {

        if ((nbytesReceive = read(sdr,sizeof(frameRead))) != sizeof(frameRead))
        {
            LE_INFO("Socket reading error,nbytesReceive);
            return SOCK_READING_ERROR;
        }
        else
        {
            LE_INFO("Receive message %X %X %X %X %X %X %X %X %X",frameRead.data[7]);
}
                     
    }
    return 0;

}

我以两种方式实现 while 以了解会发生什么(一种是注释)。 我总是获得套接错误,所以while循环的第一个条件。我以这种方式初始化了 CAN_socket:

// SOCKET FOR READING
sdr = socket(PF_CAN,SOCK_RAW,CAN_RAW);
LE_INFO("sdr è: %d",sdr);
if ((sdr = socket(PF_CAN,CAN_RAW)) < 0)

{
    LE_INFO("sdr errato");
    return SOCKET_ERROR;
}

addr.can_family = AF_CAN;

strcpy(ifr.ifr_name,name);
if (ioctl(sdr,SIocgIFINDEX,&ifr) < 0)
{
    return SOCK_IOCTL_ERROR;
}

addr.can_ifindex = ifr.ifr_ifindex;


if (bind(sdr,sizeof(addr)) < 0)
{
    return SOCK_BINDING_ERROR;
}

// Filter
struct can_filter rfilter[7]; int i = 0;
rfilter[i].can_id  = CHG_TX_STS;
rfilter[i].can_mask = CAN_SFF_MASK | CAN_EFF_FLAG | CAN_RTR_FLAG; i++;
rfilter[i].can_id   = CHG_TX_ACT;
rfilter[i].can_mask = CAN_SFF_MASK | CAN_EFF_FLAG | CAN_RTR_FLAG; i++;
rfilter[i].can_id   = BMS_CHRGR_CTL;
rfilter[i].can_mask = CAN_SFF_MASK | CAN_EFF_FLAG | CAN_RTR_FLAG; i++;
rfilter[i].can_id   = BMS_SOC_DATA;
rfilter[i].can_mask = CAN_SFF_MASK | CAN_EFF_FLAG | CAN_RTR_FLAG; i++;
rfilter[i].can_id   = BMS_BATTP_DATA;
rfilter[i].can_mask = CAN_SFF_MASK | CAN_EFF_FLAG | CAN_RTR_FLAG; i++;
rfilter[i].can_id   = BMS_BATP_DATA;
rfilter[i].can_mask = CAN_SFF_MASK | CAN_EFF_FLAG | CAN_RTR_FLAG; i++;
rfilter[i].can_id   = BMS_BATU_DATA;
rfilter[i].can_mask = CAN_SFF_MASK | CAN_EFF_FLAG | CAN_RTR_FLAG; i++;
setsockopt(sdr,SOL_CAN_RAW,CAN_RAW_FILTER,&rfilter,sizeof(rfilter));

// SET SOCKET BUFFER SIZE
setsockopt(sdr,SO_RCVBUF,(char *)&sock_buf_size,sizeof(sock_buf_size));

有人可以帮助我理解我错在哪里,因为我什么都看不懂吗?我想通过candump命令澄清在therminal上我可以正确读取CAN信号,所以问题出在软件上e。 任何帮助表示赞赏 问候。

解决方法

对不起,我解决了。 必须设置延迟时间,因为在编写代码时,生成的条件直接是错误的条件。通过设置延迟,我可以接收我发送的请求生成的消息(错误也存在,因为我在运行时没有其他消息运行,是模拟器而不是真正的 ECU)。谢谢大家