socket can 应用程序

#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; 
}

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值