簡體   English   中英

CAN BUS Linux Socketcan 上的套接字讀取錯誤?

[英]Socket reading error on CAN BUS Linux Socketcan?

我使用 linux 實現了 CAN 總線通信,用於寫入和讀取操作。 我正在使用 socketCan 庫。 寫 function 工作正常。 我在閱讀 function 時遇到問題:

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), 0, (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, &frameRead, sizeof(frameRead));
    
    LE_INFO("nbytes is: %d ", nbytesReceive);
      while(nbytesReceive != 0)
      
    {

        if ((nbytesReceive = read(sdr, &frameRead, sizeof(frameRead))) != sizeof(frameRead))
        {
            LE_INFO("Socket reading error, nbytesReceive = %d", nbytesReceive);
            return SOCK_READING_ERROR;
        }
        else
        {
            LE_INFO("Receive message %X %X %X %X %X %X %X %X %X", 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]);
}
                     
    }
    return 0;

}

我以兩種方式實現 while 以了解發生了什么(一種是評論)。 我總是得到套接字錯誤,所以 while loop 的第一個條件 我以這種方式初始化了 CAN_socket:

// SOCKET FOR READING
sdr = socket(PF_CAN, SOCK_RAW, CAN_RAW);
LE_INFO("sdr è: %d", sdr);
if ((sdr = socket(PF_CAN, SOCK_RAW, 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, (struct sockaddr *)&addr, 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, SOL_CAN_RAW, SO_RCVBUF, (char *)&sock_buf_size, sizeof(sock_buf_size));

由於我什么都看不懂,有人可以幫我理解我哪里錯了嗎? 我想通過candump命令澄清在therminal上我可以正確讀取CAN信號,所以問題出在軟件e上。 任何幫助表示贊賞問候。

對不起,我解決了。 有必要設置一個延遲時間,因為在編寫代碼時,生成的條件直接是錯誤的條件。 通過延遲,我可以接收到由我發送的請求生成的消息(錯誤也存在,因為我沒有在運行時運行其他消息,是模擬器而不是真正的 ECU)。 謝謝你們

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM