问题描述
我实现了一个 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)。谢谢大家