#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <linux/can.h>
#include <linux/can/raw.h>
#include<pthread.h>
int can_recv()
{
int sock_fd, i;
unsigned long nbytes, len;
struct sockaddr_can addr;
struct ifreq ifr;
/*为了能够接收CAN报文,我们需要定义一个CAN数据格式的结构体变量*/
struct can_frame frame;
/*建立套接字,设置为原始套接字,原始CAN协议 */
sock_fd = socket(PF_CAN,SOCK_RAW,CAN_RAW);
/*以下是对CAN接口进行初始化,如设置CAN接口名,即当我们用ifconfig命令时显示的名字 */
strcpy(ifr.ifr_name,"can0");
ioctl(sock_fd, SIOCGIFINDEX, &ifr);
printf("can0 can_ifindex = %x\n",ifr.ifr_ifindex);
/*设置CAN协议 */
addr.can_family = AF_CAN;
addr.can_ifindex = 0;
/*将刚生成的套接字与网络地址进行绑定*/
bind(sock_fd, (struct sockaddr*)&addr, sizeof(addr));
while(1){
/*开始接收数据*/
nbytes = recvfrom(sock_fd, &frame, sizeof(struct can_frame), 0, (struct sockaddr *)&addr, &len);
/*get interface name of the received CAN frame*/
ifr.ifr_ifindex = addr.can_ifindex;
ioctl(sock_fd, SIOCGIFNAME, &ifr);
printf("\nReceived a CAN frame from interface %s\n",ifr.ifr_name);
/*将接收到的CAN数据打印出来,其中ID为标识符,DLC为CAN的字节数,DATA为1帧报文的字节数*/
printf("CAN frame:\n ID = %x\n DLC = %x\nDATA = ",frame.can_id,frame.can_dlc,frame.data);
for(i =0; i < frame.can_dlc;i++){
printf("0x%x,",frame.data[i]);
}
printf("\n");
sleep(1);
}
close(sock_fd);
return 0;
}
int can_send()
{
int sock_fd, i;
unsigned long nbytes, len;
struct sockaddr_can addr;
struct ifreq ifr;
/*为了能够接收CAN报文,我们需要定义一个CAN数据格式的结构体变量*/
struct can_frame frame;
/*建立套接字,设置为原始套接字,原始CAN协议 */
sock_fd = socket(PF_CAN,SOCK_RAW,CAN_RAW);
/*以下是对CAN接口进行初始化,如设置CAN接口名,即当我们用ifconfig命令时显示的名字 */
strcpy(ifr.ifr_name,"can0");
ioctl(sock_fd, SIOCGIFINDEX, &ifr);
printf("can0 can_ifindex = %x\n",ifr.ifr_ifindex);
/*设置CAN协议 */
addr.can_family = AF_CAN;
addr.can_ifindex = ifr.ifr_ifindex;
/* bind the socket to a CAN interface */
bind(sock_fd, (struct sockaddr *)&addr, sizeof(addr));
/* Set the filter rules */
setsockopt(sock_fd, SOL_CAN_RAW, CAN_RAW_FILTER, NULL, 0);
/* generate CAN frames */
frame.can_id = 1;
frame.can_dlc = 8;
for(i = 0; i < frame.can_dlc; i++) {
frame.data[i] = 255-i;
}
/* send CAN frames */
//while(1) {
nbytes = write(sock_fd, &frame, sizeof(frame));
if (nbytes < 0) {
perror("can raw socket write");
close(sock_fd);
return 1;
}
/* paranoid check ... */
if (nbytes < sizeof(struct can_frame)) {
fprintf(stderr, "read: incomplete CAN frame\n");
close(sock_fd);
return 1;
}
sleep(1);
//}
close(sock_fd);
return 0;
}
/**
* @brief: main function
* @Param: argc: number of parameters
* @Param: argv: parameters list
*/
int main(int argc, char *argv[])
{
system("ip link set can0 down");
sleep(1);
system("ip link set can0 type can bitrate 500000");
sleep(1);
system("ip link set can0 up");
sleep(1);
can_recv();
return 0;
}
socket can 应用程序
最新推荐文章于 2024-07-29 22:14:17 发布