[Armadillo:08748] CAN通信について

Yamamoto email@hidden
2013年 4月 19日 (金) 18:37:43 JST


Yamamotoです。

460でCAN通信の確認をしているのですが

CAN0へのWriteデータはcandumpサンプルプログラムで受信できていることは確認できたの
ですが。
cansendサンプルプログラムで送信したデータが受信できません。

雰囲気的には読み込み不可状態で使用しているようなかんじなのですが、何が悪いのかよ
く解りません

以下がOpenとReadの処理です。
CAN0,CAN1の両方をRead/Writeで使用するので両方のfdsを外部変数に覚えて使い分けるよ
うにしてます。
ほとんどサンプルを利用してます。

何か、不審な点がありましたら教えていただけますでしょうか?

-------------------------------------------------------------------------------
int	CanFds[CAN_COMM_MAX]	= {-1,-1};

int    CanOpen( USHORT usCanNo )
{
    int    slRet   = RET_NG;
    int    slCanfds;                                           /* can raw socket */ 
//  int     nbytes;
//  struct  sockaddr_can    addr;
//  struct  FmCanFrame  frame;
    struct  ifreq       ifr;
    char    ucCanName[2][5]={"can0","can1"};

    if ( usCanNo >= 0 && usCanNo <= 1 )
    {
        /* 正常CAN番号 */
        
        /* オープンCAN(SocketCAN) */
        if ((slCanfds = (int)socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0) 
        {
//          perror("socket");
//          return 1;
        }
        else
        {

            addr.can_family = AF_CAN;

            strcpy(ifr.ifr_name, (char *)&ucCanName[usCanNo][0]);
            if (ioctl( (int)slCanfds, SIOCGIFINDEX, &ifr) < 0) 
            {
//              perror("SIOCGIFINDEX");
//              return 1;
            }
            else
            {
                addr.can_ifindex = ifr.ifr_ifindex;

                /* disable default receive filter on this RAW socket */
                /* This is obsolete as we do not read from the socket at all, but for */
                /* this reason we can remove the receive list in the Kernel to save a */
                /* little (really a very little!) CPU usage.                          */
                setsockopt( (int)slCanfds, SOL_CAN_RAW, CAN_RAW_FILTER, NULL, 0);

                if (bind( (int)slCanfds, (struct sockaddr *)&addr, sizeof(addr)) < 0) 
                {
//                  perror("bind");
//                  return 1;
                }
                else
                {
                    slRet = slCanfds;
                    
                    /* Fds設定 */
                    CanFds[usCanNo] = slCanfds;
                    
                    slRet   = RET_OK;
                }
            }
        }
    }
    else
    {
        /* CAN番号不正 */
    }
    
    Comm_SysLog(LOG_LEVEL_UNT,"%s:%d:%s %d",__FILE__, __LINE__, __FUNCTION__, slRet );  /* ログ出力 */
    return( slRet ) ;
}

int    CanRead( USHORT usCanNo, FMT_CAN_FRAM *bfCanMsg )
{
    int    slRet   = RET_NG;
    fd_set rdfs;
    int nbytes,ret;
    struct  timeval timeout;

    if ( usCanNo >= 0 && usCanNo <= 1 )
    {
        /* 正常CAN番号 */
        
        timeout.tv_sec = 0;
        timeout.tv_usec = 50000;        /* Wait(us) 50ms */

        FD_ZERO(&rdfs);
        FD_SET(CanFds[usCanNo], &rdfs);

printf("select in \n");
        if ((ret = select(CanFds[usCanNo]+1, &rdfs, NULL, NULL, &timeout)) <= 0) {
            /* 受信データなし */
            slRet = 0;
        }
        else
        {
            /* 受信データあり */

printf("read in\n");
//          nbytes = read(CanFds[usCanNo], bfCanMsg, sizeof(FMT_CAN_FRAM));
            nbytes = recv(CanFds[usCanNo], bfCanMsg, sizeof(FMT_CAN_FRAM),0);
            if ( nbytes == sizeof(FMT_CAN_FRAM) )
            {
                /* 正常受信 */
                slRet = nbytes;
            }
            else
            {
                /* 受信サイズ異常 */
            }
        }
    }
    else
    {
        /* CAN番号不正 */
    }
    
    return( slRet ) ;
}
-------------------------------------------------------------------------------





armadillo メーリングリストの案内