[Armadillo:08750] Re: CAN通信について

Yamamoto email@hidden
2013年 4月 19日 (金) 19:48:27 JST


Yamamotoです。

済ません。
解決しました。

サンプルからよく確認せずに持ってきていたために、不要な処理がはいってました。
以下がサンプルのオプション設定による設定で不要でした。

>             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);



On Fri, 19 Apr 2013 18:37:43 +0900
Yamamoto <email@hidden> wrote:

> 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 mailing list
> email@hidden
> http://lists.atmark-techno.com/cgi-bin/mailman/listinfo/armadillo
> 





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