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  prop-seg 6phase-seg1  phase-seg2  sjw 

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

ip link set can0 type can bitrate 

当设置完成后,可以通过下面的命令查询 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
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[] = {{}};
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, );
//报文1:数据帧:标准帧、ID=0x11;
frame[].can_id = 0x11;
frame[]. can_dlc = ;
frame[].data[] = 0x12; //报文2:数据帧:扩展帧、ID=0x22
frame[].can_id = 0x22 | CAN_EFF_FLAG;
frame[]. can_dlc = ;
frame[].data[] = 0x34; //报文3:远程帧:ID=0x33;
frame[].can_id = 0x33 | CAN_RTR_FLAG; //报文4:错误帧:ID=0x44;
frame[].can_id = 0x44 | CAN_ERR_FLAG; //循环发送两个报文
//while(1)
{
nbytes = write(fd, &frame[], sizeof(frame[])); //发送 frame[0]
if(nbytes != sizeof(frame[]))
{
printf("Send Error frame[0]\n!");
//break; //发送错误,退出
}else{
printf("Send Sucess frame[0]\n!");
}
//usleep(10000);
sleep();
nbytes = write(fd, &frame[], sizeof(frame[])); //发送 frame[1]
if(nbytes != sizeof(frame[]))
{
printf("Send Error frame[1]\n!");
//break;
}else{
printf("Send Sucess frame[1]\n!");
}
//usleep(10000);
sleep();
nbytes = write(fd, &frame[], sizeof(frame[])); //发送 frame[1]
if(nbytes != sizeof(frame[]))
{
printf("Send Error frame[2]\n!");
//break;
}else{
printf("Send Sucess frame[21]\n!");
}
//usleep(10000);
sleep();
nbytes = write(fd, &frame[], sizeof(frame[])); //发送 frame[1]
if(nbytes != sizeof(frame[]))
{
printf("Send Error frame[3]\n!");
//break;
}else{
printf("Send Sucess frame[3]\n!");
}
//usleep(10000);
sleep();
} close(fd);
return ;
}

3. 现象

android上现象:

Windows上现象:

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

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

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

can/socket can的更多相关文章

  1. socket读写返回值的处理

    在调用socket读写函数read(),write()时,都会有返回值.如果没有正确处理返回值,就可能引入一些问题 总结了以下几点 1当read()或者write()函数返回值大于0时,表示实际从缓冲 ...

  2. Socket聊天程序——Common

    写在前面: 上一篇记录了Socket聊天程序的客户端设计,为了记录的完整性,这里还是将Socket聊天的最后一个模块--Common模块记录一下.Common的设计如下: 功能说明: Common模块 ...

  3. Socket聊天程序——客户端

    写在前面: 上周末抽点时间把自己写的一个简单Socket聊天程序的初始设计和服务端细化设计记录了一下,周二终于等来毕业前考的软考证书,然后接下来就是在加班的日子度过了,今天正好周五,打算把客户端的详细 ...

  4. Socket聊天程序——服务端

    写在前面: 昨天在博客记录自己抽空写的一个Socket聊天程序的初始设计,那是这个程序的整体设计,为了完整性,今天把服务端的设计细化记录一下,首页贴出Socket聊天程序的服务端大体设计图,如下图: ...

  5. Socket聊天程序——初始设计

    写在前面: 可能是临近期末了,各种课程设计接踵而来,最近在csdn上看到2个一样问答(问题A,问题B),那就是编写一个基于socket的聊天程序,正好最近刚用socket做了一些事,出于兴趣,自己抽了 ...

  6. Java中的Socket的用法

                                   Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...

  7. Android Socket连接PC出错问题及解决

    最近测试问题:Android 通过Socket链接电脑,ip和端口都是正确的,也在同一网段,可android端就是报异常如下: 解决办法:测试电脑的防火墙可能开着,在控制面板把防火墙打开即可.

  8. Linux下的C Socket编程 -- server端的继续研究

    Linux下的C Socket编程(四) 延长server的生命周期 在前面的一个个例子中,server在处理完一个连接后便会立即结束掉自己,然而这种server并不科学啊,server应该是能够一直 ...

  9. Mono 3.2.3 Socket功能迎来一稳定的版本

    由于兴趣自己业余时间一直在搞.net下面的通讯应用,mono的存在得以让.NET程序轻松运行在Linux之下.不过经过多尝试Socket相关功能在Mono下的表现并不理想.不管性能还是吞吐能力方面离我 ...

  10. Demo源码放送:打通B/S与C/S !让HTML5 WebSocket与.NET Socket公用同一个服务端!

    随着HTML5 WebSocket技术的日益成熟与普及,我们可以借助WebSocket来更加方便地打通BS与CS -- 因为B/S中的WebSocket可以直接连接到C/S的服务端,并进行双向通信.如 ...

随机推荐

  1. 在循环中使用鼠标悬停时表示当前悬停选中,传入this关键字即可

    在前端循环中使用鼠标悬停事件 <div class="message-widget contact-widget"> <!-- Message --> {% ...

  2. (C#)冒泡排序

    //冒泡排序 public static int[] Bubbling(int[] s) { int a; for (int i = 0; i < s.Length-1; i++) { for ...

  3. Win(Phone)10开发第(1)弹,桌面和手机的扩展API,还我后退键

    喜大普奔的win10 uap开发预览版终于出了,这次更新跟8.1的变化不是很大,但是将原本win8.1和wp8.1uap的分项目的形式,改为了整合成一个项目,经过一次编译打包成一个appx包,实现了无 ...

  4. With语句上下文管理

    在平时工作中总会有这样的任务,它们需要开始前做准备,然后做任务,然后收尾清理....比如读取文件,需要先打开,读取,关闭 这个时候就可以使用with简化代码,很方便 1.没有用with语句 1 2 3 ...

  5. uiautomator2

    uiautomator2    该项目正在火热的开发中 uiautomator2 是一个可以使用Python对Android设备进行UI自动化的库.其底层基于Google uiautomator,Go ...

  6. window主机和centos主机之间相互传送文件

    命令实现linux和window文件传送 一:下载配置pscp软件从http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html下载p ...

  7. hexo安装总结

    博客原文地址:Claiyre的个人博客 如需转载,请在文章开头注明原文地址 hexo真心是一个不错的东西呢,安装简单(然而对博主来说并不是这样,伤心脸),主题样式简洁优雅,还有多种选择. 流程如下 安 ...

  8. class字节码结构(四)(方法集合的结构)

    <Java虚拟机原理图解>1.5. class文件中的方法表集合--method方法在class文件中是怎样组织的 一个类有多个方法,所以方法肯定是一个集合. 目标是: 1,了解方法在字节 ...

  9. C#里面BLL、Model、DAL、UI层

    C# 三层架构分为:表现层(UI).业务逻辑层(BLL).数据访问层(DAL)再加上实体类库(Model) 1.实体类库(Model),主要存放数据库中的表字段. 操作: (1)先建立实体类库Mode ...

  10. Tomcat几种出错方法

    1.  Several ports (8005, 8089, 8009) required by Tomcat v8.0 Server at localhost are already in use. ...