can/socket can

2023-05-16

1. 概念

参考:Linux-CAN编程详解

can引脚: cn2: 15:CAN1_H 19 CAN1_L


根据每组报文开头的 11 位标识符(扩展帧为29位标识符、CAN 2.0A 规范)解释数据的含义来决定是否接收。

 

CAN状态:

准备状态:
这个节点的处理器将要发送的数据和自己的标识符传送给该节点的 CAN 总线接口控制器

报文状态:
当收到总 线分配时,转为发送报文状态。

接收状态:
数据根据协议组织成一定的报文格式后发出,此时网络上的其他节点处于接收状态。处于接收状态的每个节点对接
收到的报文进行检测,判断这些报文是否是发给自己的以确定是否接收。


层次结构:
对象层:在对象层中可以为远程数据请求以及数据传输提供服务,确定由实际要使用的传输层接收哪一个报文,并且
为恢复管理和过载通知提供手段。
传输层:传输层负责位的定时及同步、报文分帧、仲裁、应答、错误检测和标定、故障界定。
物理层:波特率之类的


报文结构:
数据帧:发送数据
远程帧:请求数据
错误帧:检测到错误则发出
过载帧:提供帧与帧之间的延时

 


ip link set can0 type can bitrate 125000

 流程:

1. 创建socket
2. bind将socket绑定can
3. 设置选项setsockopt
4. read/write

 

常用命令:

在控制台上输入命令:
ifconfig –a
可以得到以下结果:

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope: Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 TX bytes:0

eth0 Link encap:Ethernet HWaddr F6:88:05:8F:72:8C
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 TX bytes:0

can0 Link encap:UNSPEC
UP RUNNING NOARP MTU:16 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:10
RX bytes:0 TX bytes:2
Interrupt:32

 

令来配置 CAN 总线的位速率:


ip link set can0 type cantq 125 prop-seg 6phase-seg1 7 phase-seg2 2 sjw 1  


也可以使用 ip 命令直接设定位速率:


ip link set can0 type can bitrate 125000  


当设置完成后,可以通过下面的命令查询 can0 设备的参数设置:


ip -details link show can0  


当设置完成后,可以使用下面的命令使能 can0 设备:


ifconfig can0 up  


使用下面的命令取消 can0 设备使能:


ifconfig can0 down  


在设备工作中,可以使用下面的命令来查询工作状态:


ip -details -statistics link show can0  

 

2. 测试流程:

1. 启动Linux的can0,并初始化


ifconfig can0 down   //要修改can的参数,必须先down
ip link set can0 type can bitrate 1000000
ifconfig can0 up  

 

2. 测试代码


#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 fd, nbytes;
    struct sockaddr_can addr;
    struct ifreq ifr;
    int ret;
    
    //1. 初始化
    struct can_frame frame[4] = {{0}};
    fd = socket(PF_CAN, SOCK_RAW, CAN_RAW);//创建套接字

    printf("version=6;fd=%d\n", fd);
    
    strcpy(ifr.ifr_name, "can0" );
    ioctl(fd, SIOCGIFINDEX, &ifr); //指定 can0 设备
    addr.can_family = AF_CAN;
    addr.can_ifindex = ifr.ifr_ifindex;
    ret = bind(fd, (struct sockaddr *)&addr, sizeof(addr));//将套接字与 can0 绑定
    printf("ret=%d\n", ret);
    
    //禁用过滤规则,本进程不接收报文,只负责发送
    setsockopt(fd, SOL_CAN_RAW, CAN_RAW_FILTER, NULL, 0);
    //报文1:数据帧:标准帧、ID=0x11;
    frame[0].can_id = 0x11;
    frame[0]. can_dlc = 1;
    frame[0].data[0] = 0x12;
    
    //报文2:数据帧:扩展帧、ID=0x22
    frame[1].can_id = 0x22 | CAN_EFF_FLAG;
    frame[1]. can_dlc = 1;
    frame[1].data[0] = 0x34;

    //报文3:远程帧:ID=0x33;
    frame[2].can_id = 0x33 | CAN_RTR_FLAG;

    //报文4:错误帧:ID=0x44;
    frame[3].can_id = 0x44 | CAN_ERR_FLAG;


    //循环发送两个报文
    //while(1)
    {
        nbytes = write(fd, &frame[0], sizeof(frame[0])); //发送 frame[0]
        if(nbytes != sizeof(frame[0]))
        {
            printf("Send Error frame[0]\n!");
            //break; //发送错误,退出
        }else{
            printf("Send Sucess frame[0]\n!");
        }
        //usleep(10000);
        sleep(1);
        nbytes = write(fd, &frame[1], sizeof(frame[1])); //发送 frame[1]
        if(nbytes != sizeof(frame[1]))
        {
            printf("Send Error frame[1]\n!");
            //break;
        }else{
                printf("Send Sucess frame[1]\n!");
        }
        //usleep(10000);
        sleep(1);
        nbytes = write(fd, &frame[2], sizeof(frame[2])); //发送 frame[1]
        if(nbytes != sizeof(frame[2]))
        {
            printf("Send Error frame[2]\n!");
            //break;
        }else{
                printf("Send Sucess frame[21]\n!");
        }
        //usleep(10000);
        sleep(1);
        nbytes = write(fd, &frame[3], sizeof(frame[3])); //发送 frame[1]
        if(nbytes != sizeof(frame[3]))
        {
            printf("Send Error frame[3]\n!");
            //break;
        }else{
                printf("Send Sucess frame[3]\n!");
        }
        //usleep(10000);
        sleep(1);
    }
    
    close(fd);
    return 0;
}  

 

3. 现象

android上现象:

 

Windows上现象:

 

波形现象:(注:因为上面的发送太少,抓不到数据,所以下面的是我更换了其他代码查看的)

CPU出来的CAN信号,是标准信号

 

进过转换过后的,很难查看出来,但是就是这个差分信号

 

转载于:https://www.cnblogs.com/maogefff/p/8303433.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

can/socket can 的相关文章

  • QTcpSocket 发送数据心得

    遇到不会用的函数前 最好还是看看手册QAQ 今天居然吃了这个大亏 先交代一下背景 在做TCP客户端的发送数据功能 要和服务器程序进行TCP IP通信 且根据通信协议要发送数组或者结构体 并且数组的每一个位都是有效数据位 因此不能像大多数人一
  • Qt4代码移植Qt5时的 QTcpServer 64位 BUG

    原Qt4上接口代码如下 void QTcpServer incomingConnection int socketDescriptor 移植到Qt5后 BUG现象就是 用MinGW32位编译出来的程序 QTcpServer工作正常 但用Mi
  • 阿里云:网络编程 bind:cannot assign requested address errno:99 问题

    解决方案 阿里云上的服务器代码绑定的 IP 需要时内网 IP ifconfig 查看 其他客户端连接服务器时所用的 IP 得是阿里云的外网 IP 查看实例即可 分析思路 猜想1 bind cannot assign requested ad
  • JDK8 网络Net包研究(一)

    网络基础 1 国际标准化组织的OSI 开放式系统互联模型 七层模型 2 TCP IP协议 组 四层模型 3 TCP IP协议组 一组包括TCP协议和IP协议 UDP协议 ICMP协议和其他一些协议的协议组 网络层 IP协议 gt 网络互连协
  • gethostbyname()函数详解

    基本概念 gethostbyname 函数主要作用 用域名或者主机名获取地址 操作系统提供的库函数 以下的讨论基于linux环境 域名系统 Domain Name System DNS 主要用于主机名字与IP地址之间的映射 每个组织机构往往
  • Websocket(一)——原理及基本属性和方法

    初次接触 WebSocket 的人 都会问同样的问题 我们已经有了 HTTP 协议 为什么还需要另一个协议 它能带来什么好处 答案很简单 因为 HTTP 协议有一个缺陷 通信只能由客户端发起 举例来说 我们想了解今天的天气 只能是客户端向服
  • 【转】QT中QWS的含义

    QT编程和文档中的术语QWS的全称是Qt windows system 是QT自行开发的窗口系统 体系结构类似X Windows 是一个C S结构 由QWS Server在物理设备上显示 由QWS Client实现界面 两者通过socket
  • 九、网络IO原理-创建ServerSocket的过程

    示例 创建ServerSocker过程 创建ServerSocket并注册端口号8090 ServerSocket server new ServerSocket 8090 while true 循环 final Socket socket
  • 通过socket获取对方ip地址

    struct sockaddr in sa int len sizeof sa if getpeername sockfd struct sockaddr sa len printf 对方IP s inet ntoa sa sin addr
  • CAN总线的报文分析(三)

    系列文章目录 文章目录 系列文章目录 前言 一 数据帧 最常用 1 帧起始 2 仲裁段 3 控制段 4 数据段 5 CRC段 6 ACK段 7 帧结束 二 远程帧 三 错误帧 四 过载帧 五 帧间隔 总结 前言 CAN总线上的节点发送数据都
  • 关于Socket编程中的inet_ntop、inet_pton和inet_ntoa、inet_addr

    VS2013中调试Socket代码时 遇到了点小问题 问题代码为 cpp view plain copy inet ntoa addrClient sin addr 生成错误消息为 plain view plain copy error C
  • Java Socket聊天室

    Socket聊天室 1 创建登录判断类UserLogin 2 创建登录服务器LoginServer 3 创建聊天服务器ChatServer 4 创建客户端Client 5 创建服务器用于处理聊天的线程类ChatThread 6 创建客户端C
  • 基于TCP的socket通信

    本文转载自http blog csdn net chocolate001 article details 6612201 基于TCP 面向连接 的socket编程 分为客户端和服务器端 客户端的流程如下 1 创建套接字 socket 2 向
  • Socket_Tcp加密文件传输系统

    代码下载链接 Socket Tcp 原文链接 https blog csdn net weixin 45746588 article details 107683901 这是一个课程的作业 我是初学者 所以写完这个代码还是花了我好几周的时间
  • 几种获取本机IPv6地址的方法

    如同获取IPv4的地址一般 获取IPv6也是可以通过使用网卡信息来得到IPv6的地址 也可以给一个多播地址发送数据包然后获取IPv6的地址 在IPv4通过iotcl函数是可以获取本主机的IPv4的地址的 但是本楼主使用iotcl函数来获取I
  • 【小练习】windows与linux进行socket文件传输

    在Windows与Linux使用socket通信基础上 添加文件传输功能 需要进行简单的交互 目录 程序效果 实现流程 样例代码 测试用例 参考资料 程序效果 Windows客户端可以从Linux服务器端索要文件 也可以发送文件至Linux
  • JAVA socket编程实例

    转载文章 原作者无从考证 感谢作者的无私奉献 事实上网络编程简单的理解就是两台计算机相互通讯数据而已 对于程序员而言 去掌握一种编程接口并使用一种编程模型相对就会显得简单的多了 Java SDK提供一些相对简单的Api来完成这些工作 Soc
  • linux 系统调用列表 /usr/include/asm/unistd.h

    一 进程控制 fork 创建一个新进程 clone 按指定条件创建子进程 execve 运行可执行文件 exit 中止进程 exit 立即中止当前进程 getdtablesize 进程所能打开的最大文件数 getpgid 获取指定进程组标识
  • c#Socket 异步通讯(客户端与服务端)

    c Socket 异步通讯 多个客户端与服务端 最近公司有个项目 涉及到的通讯对象有点多 就拿其中一个库的通讯来说就用到了3个PLC 这里就涉及了一个服务器与多个客户端之间的通讯了 同时上位机既需要做客户端 也需要做服务端 因为跟PLC之间
  • 功放诊断测试

    1 切换trace显示时间模式 Toggle time mode 2 测seedkey 需要加载seednkey dll 3 功能寻址和物理寻址切换

随机推荐

  • Linux系统备份与还原

    Linux系统备份与还原 1 整盘备份与还原 1 1 记住几个这里要经常用到操作1 2 整盘克隆的方法 2 推荐 非整盘克隆的方法 2 1 备份系统2 2 还原系统 1 整盘备份与还原 1 1 记住几个这里要经常用到操作 查看存储设备 xf
  • VS2013如何添加LIb库及头文件的步骤

    在VS工程中 xff0c 添加c c 43 43 工程中外部头文件及库的基本步骤 xff1a 1 添加工程的头文件目录 xff1a 工程 属性 配置属性 c c 43 43 常规 附加包含目录 xff1a 加上头文件存放目录 2 添加文件引
  • composer.json和composer.lock到底是什么以及区别?

    composer方文档 xff1a https docs phpcomposer com 04 schema html 我们在做项目的时候 xff0c 总是要安装一些依赖 composer给我们提供了很多方便 直接运行composer in
  • VUE npm run build的项目出现跨域请求的问题npm run dev没有这个问题

    报错信息 Access to XMLHttpRequest at 39 http platformapi test lih elearning cn api v1 login 39 from origin 39 http www vue c
  • PHP message:filesize(): stat failed for 错误

    PHP message filesize stat failed for 错误 message filesize stat failed for F s2017 SinaImgUpload SinaImgUpload bin Debug T
  • PHP 开发者如何做好密码保护 & Laravel 底层密码存储和验证实现

    随着在线攻击的增多 xff0c 密码安全越来越重要 作为开发者我们要担负起安全管理 计算哈希和存储用户密码的责任 xff0c 不管应用是简单的游戏还是绝密商业文件的仓库 xff0c 都要做到这一点 PHP内置了一些工具 xff0c 让保护密
  • python 列表中的数字转为字符串

    1 list1 61 1 2 3 4 5 list1 61 str x for x in list1 2 list1 61 1 2 3 4 5 list1 61 list map str list1 转载于 https www cnblog
  • 恩尼格码的发明和破解

    恩尼格码是二战德军所采用的电子加密机械 其基本组成可以分为三部分 xff1a 键盘 xff0c 转子和显示器 键盘一共具有26个键 xff0c 类似于今天的计算机键盘 xff08 显示起见 xff0c 省略为6个 xff09 转子实际上有3
  • 得力D991CN Plus计算器评测(全程对比卡西欧fx-991CN X)

    得力在2018年出了一款高仿卡西欧fx 991CN X中文版的计算器 xff0c 型号为D991CN Plus xff0c 在实现同样功能的前提下 xff0c 网销价格是卡西欧的三分之一左右 但是这款计算器与卡西欧正版计算器差距是大是小 x
  • 网络机顶盒固件提取、编辑和打包

    提取的话 xff0c 这边有一篇文章可能有用https www znds com tv 649509 1 1 html 首先下载下载来的固件一般是img格式的 xff0c 可以到hdpfans com这个连接下载一个androidTool的
  • 从微软官网下载VisualStudio离线包

    首先要下载VS安装器 xff0c 有社区版 专业版 企业版 xff0c 此处以社区版为例 不同版本的VS xff0c 只需要将cmd命令中exe名称换掉就行了 仅C VisualStudioSetup exe layout D Layout
  • 基于STM32之UART串口通信协议(一)详解

    一 前言 1 简介 写的这篇博客 xff0c 是为了简单讲解一下UART通信协议 xff0c 以及UART能够实现的一些功能 xff0c 还有有关使用STM32CubeMX来配置芯片的一些操作 xff0c 在后面我会以我使用的STM32F4
  • Java内存分配及值、引用的传递

    关于堆栈的内容网上已经有很多资料了 xff0c 这是我找的加上自己理解的一篇说明文 xff1a 一 内存区域类型 1 寄存器 xff1a 最快的存储区 由编译器根据需求进行分配 我们在程序中无法控制 xff1b 2 栈 xff1a 存放基本
  • NEMA-0183(GPRMC GPGGA)详细解释

    NEMA 0183 GPRMC GPGGA 详细解释 nmea数据如下 xff1a GPGGA 121252 000 3937 3032 N 11611 6046 E 1 05 2 0 45 9 M 5 7 M 0000 77 GPRMC
  • [转]printf 函数实现的深入剖析

    研究printf的实现 xff0c 首先来看看printf函数的函数体 int printf const char fmt int i char buf 256 va list arg 61 va list char amp fmt 43
  • http_parser

    最近读了 http parser 的源码 xff0c 记录下 有意思的地方 xff1a 1 协议解析可以不完全解析完 xff0c 但是当前 parser 会记录解析状态 xff0c 这样可以继续解析 2 协议解析首要还是要了解协议本身 xf
  • linux 网络编程 3---(io多路复用,tcp并发)

    1 xff0c io模型 xff1a 阻塞io 非阻塞io io多路复用 xff0c 信号驱动io 阻塞Io与非阻塞io的转换 xff0c 可用fcntl 函数 include lt unistd h gt include lt fcntl
  • 计算机网络socket实验报告,计算机网络socket编程实验报告

    计算机网络socket编程实验报告 由会员分享 xff0c 可在线阅读 xff0c 更多相关 计算机网络socket编程实验报告 4页珍藏版 请在人人文库网上搜索 1 实课程名称实验项目名称实验时间 日期及节次 专业年级姓名验计算机科学与技
  • linux 内核重定位,linux内核netfilter实现url重定向

    include include 34 url redirect h 34 struct sk buff tcp newpack u32 saddr u32 daddr u16 sport u16 dport u32 seq u32 ack
  • can/socket can

    1 概念 参考 xff1a Linux CAN编程详解 can引脚 xff1a cn2 15 xff1a CAN1 H 19 CAN1 L 根据每组报文开头的 11 位标识符 扩展帧为29位标识符 CAN 2 0A 规范 解释数据的含义来决