• 【c++基础】测试SocketCAN的收发功能


    前言

    code

    /*
     * cantest.c
     *
     *  Created on: 2017-5-16
     *      Author: simon
     */
    
    #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>
    
    
    int main(int argc, char *argv[])
    {
        int s, nbytes;
        char *array[2] = {"-r", "-s"};
        struct sockaddr_can addr;
        struct ifreq ifr;
        struct can_frame frame;
        struct can_filter rfilter[1];
    
    
        /* handle (optional) flags first */
        if(argc != 3) {
            fprintf(stderr, "Usage:  %s <-r> <can interface name> for receiving
    or <-s> <can interface name> for sending
    ", argv[0]);
            exit(1);
        }
        /* create socket */
        if ((s = socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0)
        {
            perror("Create socket failed");
            exit(-1);
        }
    
        /* set up can interface */
        strcpy(ifr.ifr_name, argv[2]);
        printf("can port is %s
    ",ifr.ifr_name);
        /* assign can device */
        ioctl(s, SIOCGIFINDEX, &ifr);
        addr.can_family = AF_CAN;
        addr.can_ifindex = ifr.ifr_ifindex;
        /* bind can device */
        if(bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0)
        {
            perror("Bind can device failed
    ");
            close(s);
            exit(-2);
        }
    
        /* configure receiving */
        if(!strcmp(argv[1],array[0]))
        {
            /* set filter for only receiving packet with can id 0x1F */
            rfilter[0].can_id = 0x1F;
            rfilter[0].can_mask = CAN_SFF_MASK;
            if(setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, &rfilter, sizeof(rfilter)) < 0)
            {
                perror("set receiving filter error
    ");
                close(s);
                exit(-3);
            }
            /* keep reading */
            while(1){
                nbytes = read(s, &frame, sizeof(frame));
                if(nbytes > 0)
                {
                    printf("%s ID=%#x data length=%d
    ", ifr.ifr_name, frame.can_id, frame.can_dlc);
                    for (int i=0; i < frame.can_dlc; i++)
                        printf("%#x ", frame.data[i]);
                    printf("
    ");
                }
            }
        }
        /* configure sending */
        else if(!strcmp(argv[1],array[1]))
        {
            /* configure can_id and can data length */
            frame.can_id = 0x1F;
            frame.can_dlc = 8;
            printf("%s ID=%#x data length=%d
    ", ifr.ifr_name, frame.can_id, frame.can_dlc);
            /* prepare data for sending: 0x11,0x22...0x88 */
            for (int i=0; i<8; i++)
            {
                frame.data[i] = ((i+1)<<4) | (i+1);
                printf("%#x ", frame.data[i]);
            }
            printf("Sent out
    ");
            /* Sending data */
            if(write(s, &frame, sizeof(frame)) < 0)
            {
                perror("Send failed");
                close(s);
                exit(-4);
            }
        }
        /* wrong parameter input situation */
        else
        {
            printf("wrong parameter input
    ");
        }
    
        close(s);
        return 0;
    }
    View Code

    参考

    1. SocketCAN_test_receive_send;

    做自己该做的事情,做自己喜欢做的事情,安静做一枚有思想的技术媛。
    版权声明,转载请注明出处:https://www.cnblogs.com/happyamyhope/
  • 相关阅读:
    2019软工实践_作业4_1(结对编程实现博客)
    2019软工实践_作业3_2(团队介绍博客)
    跨域资源共享CORS
    解决IntelliJ无法导入maven包的问题
    IntelliJ IDEA中各种小图标的含义
    IntelliJ 发布Maven项目时所需的Jar没有打包的问题
    IntelliJ跳转到抽象方法的实现
    IntelliJ IDEA利用Maven下载所需的JAR包到项目中
    Java编程思想代码环境配置
    查看window用户登录日志
  • 原文地址:https://www.cnblogs.com/happyamyhope/p/13163166.html
Copyright © 2020-2023  润新知