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