imx6ul can调试(代码)
下面是我的代码,然后代码呢实际的使用 需要注意,如果重新设置了can的引脚对应关系,需要重新配置设备树文件;
更改设备树文件:https://blog.csdn.net/cao849861802/article/details/111604277
然后注意can0SystemInit和can1SystemInit中的频率,125000,这个可以修改和从机相同的频率用来通信;
can_id这个是表示can的id这个发送接收的对应要注意;
#include <sys/ioctl.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <linux/can.h>
#include <pthread.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#ifndef PF_CAN
#define PF_CAN 29
#endif
#ifndef AF_CAN
#define AF_CAN PF_CAN
#endif
/****************CAN START******************/
int can0fd;
int can1fd;
struct sockaddr_can can0Addr;
struct sockaddr_can can1Addr;
void can0fdCreate()
{
struct ifreq ifr;
int ret = 0;
memset(&ifr,0,sizeof(ifr));
can0fd = socket(PF_CAN,SOCK_RAW,CAN_RAW);
if(can0fd < 0)
{
printf("can0fd create failed \r\n");
return ;
}
strcpy((char *)(ifr.ifr_name),"can0");
ioctl(can0fd,SIOCGIFINDEX,&ifr);
can0Addr.can_family = AF_CAN;
can0Addr.can_ifindex = ifr.ifr_ifindex;
if((ret = bind(can0fd,(struct sockaddr*)&can0Addr,sizeof(can0Addr))) < 0)
{
printf("bind can0fd failed ,error = %d\r\n",ret);
}
}
void can1fdCreate()
{
struct ifreq ifr;
int ret = 0;
memset(&ifr,0,sizeof(ifr));
can1fd = socket(PF_CAN,SOCK_RAW,CAN_RAW);
if(can1fd < 0)
{
printf("can1fd create failed \r\n");
}
strcpy((char *)(ifr.ifr_name),"can1");
ioctl(can1fd,SIOCGIFINDEX,&ifr);
can1Addr.can_family = AF_CAN;
can1Addr.can_ifindex = ifr.ifr_ifindex;
if((ret = bind(can1fd,(struct sockaddr*)&can1Addr,sizeof(can1Addr))) < 0)
{
printf("bind can1fd failed ,error = %d\r\n",ret);
}
}
void can0SystemInit()
{
system("ifconfig can0 down");
system("ip link set can0 type can bitrate 125000 triple-sampling on");
system("ifconfig can0 up");
}
void can1SystemInit()
{
system("ifconfig can1 down");
system("ip link set can1 type can bitrate 125000 triple-sampling on");
system("ifconfig can1 up");
}
int can0BufSend(char *buf,int len)
{
int i = 0;
int nbytes = 0;
struct can_frame frame;
printf("can 0 send buf = %s\r\n",buf);
frame.can_id = 123;
fcntl(fd,F_SETFL,FNDELAY);
while(len > 0)
{
frame.can_dlc = (len >= 8) ? 8 : len;
memcpy(frame.data,buf,frame.can_dlc);
buf = buf + frame.can_dlc;
len = len - frame.can_dlc;
if ((nbytes = write(can0fd, &frame, sizeof(frame))) != sizeof(frame))
{
printf("can0 send buf failed ret = %d\r\n",nbytes);
fcntl(fd,F_SETFL,0);
return nbytes;
}
}
fcntl(fd,F_SETFL,0);
return 0;
}
int can1BufSend(char *buf,int len)
{
int i = 0;
int nbytes = 0;
struct can_frame frame;
printf("can 1 send buf = %s\r\n",buf);
frame.can_id = 124;
while(len > 0)
{
frame.can_dlc = (len >= 8) ? 8 : len;
memcpy(frame.data,buf,frame.can_dlc);
buf = buf + frame.can_dlc;
len = len - frame.can_dlc;
if ((nbytes = write(can1fd, &frame, sizeof(frame))) != sizeof(frame))
{
printf("can1 send buf failed ret = %d\r\n",nbytes);
return nbytes;
}
}
return 0;
}
void *can0Task(void *arg)
{
int nbytes = 0;
struct can_frame frame;
char buf[16];
can0SystemInit();
can0fdCreate();
while(1)
{
memset(&frame,0,sizeof(frame));
if ((nbytes = read(can0fd, &frame, sizeof(frame))) <= 0)
{
printf("can 0 recv failed,return \r\n");
return NULL;
}
if(frame.can_dlc == 0)
continue;
if(frame.can_id == 124)
{
memset(buf,0,sizeof(buf));
memcpy(buf,frame.data,frame.can_dlc);
printf("can 0 recv buf = %s\r\n",buf);
}
}
return NULL;
}
void *can1Task(void *arg)
{
int nbytes = 0;
struct can_frame frame;
char buf[16];
can1SystemInit();
can1fdCreate();
while(1)
{
memset(&frame,0,sizeof(frame));
if ((nbytes = read(can1fd, &frame, sizeof(frame))) <= 0)
{
printf("can 1 recv failed,return \r\n");
return NULL;
}
if(frame.can_dlc == 0)
continue;
if(frame.can_id == 123)
{
memset(buf,0,sizeof(buf));
memcpy(buf,frame.data,frame.can_dlc);
printf("can 1 recv buf = %s\r\n",buf);
}
}
return NULL;
}
void canTask()
{
pthread_t ntid;
pthread_create(&ntid, NULL, can0Task, NULL);
printf("can 0 task start ---------\r\n");
pthread_create(&ntid, NULL, can1Task, NULL);
printf("can 1 task start ---------\r\n");
sleep(5);
can0BufSend("can 0 send",strlen("can 0 send"));
can0BufSend("can 0 send",strlen("can 0 send"));
can0BufSend("can 0 send",strlen("can 0 send"));
sleep(5);
can1BufSend("can 1 send",strlen("can 1 send"));
can1BufSend("can 1 send",strlen("can 1 send"));
can1BufSend("can 1 send",strlen("can 1 send"));
}
/****************CAN stop******************/
int main()
{
canTask();
while(1)
{
sleep(1);
}
return 0;
}
还没有评论,来说两句吧...