#include <sys/ioctl.h>
#include <net/if.h>
#include <linux/can.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h> //文件控制定义
#ifndef PF_CAN
#define PF_CAN 29
#endif
#ifndef AF_CAN
#define AF_CAN PF_CAN
#endif
#define CAN_COMMAND "ip link set can0 type can bitrate 50000 triple-sampling on"
#define CAN_UP "ip link set can0 up"
#define CAN_DOWN "ip link set can0 down"
#define CAN_PORT "can0"
#define FALSE -1
struct sockaddr_can addr;
//打开CAN接口连接并绑定
int CAN_Open(void)
{
int s;
struct ifreq ifr;
int ret = 0;
//初始化CAN接口,波特率为50K
system(CAN_DOWN);
system(CAN_COMMAND);
usleep(50);
system(CAN_UP);
usleep(50);
//建立socketCAN连接
s = socket(PF_CAN,SOCK_RAW,CAN_RAW);
strcpy((char *)(ifr.ifr_name),CAN_PORT);
ioctl(s,SIOCGIFINDEX,&ifr);
printf("can0 can_ifindex = %x\n",ifr.ifr_ifindex);
//绑定
addr.can_family = AF_CAN;
addr.can_ifindex = ifr.ifr_ifindex;
ret = bind(s,(struct sockaddr*)&addr,sizeof(addr));
if(ret < 0)
{
printf("in bind error \n");
}
return s;
}
//关闭CAN接口连接
int CAN_Close(void)
{
return system(CAN_DOWN);
}
//向CAN接口发送一帧数据
int CAN_Send(int s,int len,char *msg)
{
int i;
int nbytes;
struct can_frame sendf;
if(len < 4)
return -1;
memset(&sendf, 0, sizeof(struct can_frame));
sendf.can_id = (((int)msg[0]<<24) | ((int)msg[1] <<16) | ((int)msg[2]<<8) | (int)msg[3]) | CAN_EFF_FLAG;
printf("frame.can_id = %x\n",sendf.can_id);
for(i=0;i<len-4;i++)
sendf.data[i] = msg[4+i];
printf("frame.data = %s\n",sendf.data);
sendf.can_dlc = len-4;
nbytes = sendto(s,&sendf,sizeof(struct can_frame),0,(struct sockaddr*)&addr,sizeof(addr));
printf("Send a CAN frame from interface num %d\n",nbytes);
return nbytes;
}
//从CAN接口接收一帧数据
int CAN_Recv(int s,char *msg,socklen_t *len)
{
int i;
int nbytes;
struct can_frame recvf;
memset(&recvf, 0, sizeof(struct can_frame));
//nbytes = recvfrom(s,&recvf,sizeof(struct can_frame),0,(struct sockaddr *)&addr,len);
nbytes = recvfrom(s,&recvf,sizeof(struct can_frame),0,NULL,len);
printf("receive a can frame from interface %d\n",addr.can_ifindex);
printf( "--can_id = %x\n"
"--can_dle =%x\n"
"--data=",recvf.can_id,recvf.can_dlc);
for (i = 0; i < recvf.can_dlc; ++i)
printf("%02x ", recvf.data[i]);
if(nbytes < 0)
perror("recv error:");
}
int main(int argc, char **argv)
{
int can_fd;
char senddata[5] = {0x03,0x08,0x00,0x0B,0x01};
char recvdata[20];
char len;
can_fd = CAN_Open();
if(CAN_Send(can_fd,0x05,senddata) > 0)
printf("can send ok");
CAN_Recv(can_fd,recvdata,len);
CAN_Close();
return 0;
}
//int main()
//{
// int s;
// unsigned int nbytes;
// struct sockaddr_can addr;
// struct ifreq ifr;
// struct can_frame sendf, recvf;
// int flag_num = 0;
// char message[1024] = {0};
// unsigned int len;
// int ret = 0,flag = 0;
// int i = 0;
// system(CAN_DOWN);
// system(CAN_COMMAND);
// usleep(50);
// system(CAN_UP);
// usleep(50);
// s = socket(PF_CAN,SOCK_RAW,CAN_RAW);
// strcpy((char *)(ifr.ifr_name),"can0");
// ioctl(s,SIOCGIFINDEX,&ifr);
// printf("can0 can_ifindex = %x\n",ifr.ifr_ifindex);
// addr.can_family = AF_CAN;
// addr.can_ifindex = ifr.ifr_ifindex;
// ret = bind(s,(struct sockaddr*)&addr,sizeof(addr));
// if(ret < 0)
// {
// printf("in bind error \n");
// exit(1);
// }
// while(1)
// {
// printf("Select 1 : send can frame\n");
// printf("Select 2 : receive can frame\n");
// printf("Select 3 : terminate this program\n");
// printf("please input:");
// scanf("%d",&flag_num);
// getchar();
// switch(flag_num)
// {
// case 1:
// memset(&sendf, 0, sizeof(struct can_frame));
// sendf.can_id = 0x123;
// memset(message,'\0',sizeof(message));
// printf("Please input data not exceeding 8 characters:");
// scanf("%[^\n]",message);
// strcpy((char *)sendf.data,message);
// printf("frame.data = %s\n",sendf.data);
// sendf.can_dlc = strlen(sendf.data);
// nbytes = sendto(s,&sendf,sizeof(struct can_frame),0,(struct sockaddr*)&addr,sizeof(addr));
// printf("Send a CAN frame from interface %d num %d\n",ifr.ifr_ifindex,nbytes);
// break;
// case 2:
// memset(&recvf, 0, sizeof(struct can_frame));
// nbytes = recvfrom(s,&recvf,sizeof(struct can_frame),0,(struct sockaddr *)&addr,&len);
// printf("receive a can frame from interface %d\n",addr.can_ifindex);
// printf( "--can_id = %x\n"
// "--can_dle =%x\n"
// "--data=",recvf.can_id,recvf.can_dlc);
// for (i = 0; i < recvf.can_dlc; ++i)
// printf("%c", recvf.data[i]);
// printf("\n");
// break;
// case 3:
// flag = 1;
// break;
// default:
// printf("\nplease select correct number\n");
// }
// if (flag == 1)
// break;
// }
// system(CAN_DOWN);
// return 0;
//}