[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 メーリングリストの案内