⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cantest.c

📁 ATEML AT91SAM9260测试程序。包括 can测试
💻 C
字号:
/* * cantest.c */#include <stdio.h> #include <netinet/in.h>#include <netdb.h>#include <arpa/inet.h>#include <netinet/ip.h>#include <net/if.h>#include <sys/socket.h>#include <sys/ioctl.h>#include <features.h>         /* for the glibc version number */#if __GLIBC__ >= 2 && __GLIBC_MINOR >= 1#include <netpacket/packet.h>#include <net/ethernet.h>     /* the L2 protocols */#else#include <asm/types.h>#include <linux/if_packet.h>#include <linux/if_ether.h>   /* The L2 protocols */#endif#include "can.h"void can_show_header(struct can_frame_header *header){    printf("Header: id=%d srr=%d ide=%d eid=%d rtr=%d rb1=%d rb0=%d dlc=%d\n",	   header->id,	   header->srr,	   header->ide,	   header->eid,	   header->rtr,	   header->rb1,	   header->rb0,	   header->dlc);}intmain(int argc, char **argv){        int	fd;    int	dummy;    int ret;    int len;    int can_id = 1;    struct sockaddr_ll	ll,ll_recv;    struct ifreq	ifr;    struct can_frame    buf;        struct can_frame frame = {	.header = {	    .id = can_id,	    .srr = 0,	    .ide = 0,	    .eid = 0,	    .rtr = 0,	    .rb1 = 0,			.rb0 = 0,	    .dlc = 8,	},	.data = {'C','a','n','T','e','s','t',0},    };    if (argc != 2) {	fprintf(stderr, "usage: %s <iface>.\n", argv[0]);	exit(1);    }            fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));    if (fd == -1) {	perror("socket");	exit(1);	    }        len = sizeof(struct sockaddr_ll);        memset(&ll, 0, len);    memset(&ifr, 0, sizeof(struct ifreq));    strncpy(ifr.ifr_name, argv[1], sizeof(ifr.ifr_name));        dummy = socket(AF_INET, SOCK_DGRAM, 0);    if (dummy == -1) {	perror("dummy");	exit(1);    }    ret = ioctl(dummy, SIOCGIFINDEX, &ifr);    printf("index %d <--> %s as loopback mode\n", ifr.ifr_ifindex, ifr.ifr_name);    ll.sll_family = AF_PACKET;    ll.sll_ifindex = ifr.ifr_ifindex;    ll.sll_protocol = htons(ETH_P_ALL);    if (bind(fd, (struct sockaddr *) &ll, sizeof(struct sockaddr_ll)) == -1) {	perror("bind");	exit(1);    }    printf("binding pf_packet to %s interface.\n", ifr.ifr_name);            while(1) {		memset(&buf, 0, sizeof(struct can_frame));	memset(buf.data, 0, 8);		char data[8];	memset(data, 0, 8);	sprintf(data, "%d", can_id);	memcpy(frame.data, data, 8);	frame.header.id = can_id;	can_id++;	if (can_id > 9999999) {	    can_id = 1;	}	frame.header.dlc = strlen(data);		if (send(fd, &frame, sizeof(struct can_frame), 0) == -1) {	    perror("send");	}		sleep(5);		if (recv(fd, &buf, sizeof(struct can_frame), 0) == -1) {	    perror("recv");	}		can_show_header(&buf.header);	memset(buf.data+buf.header.dlc, 0, 8-buf.header.dlc);	printf("RECV: %s\n", buf.data);	    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -