CAN总线开发实例

转载 2016年08月30日 16:45:04
下面通过实例来说明CAN总线接口的使用方法。在本例中,有两个进程,其中一个进程负责报文的发送(标识符为0x11和0x22),另一个进程负责报文的接收和过滤(只接收标识符为0x11的报文)。


#include
#include
#include
#include
#include
#include
#include
#include
#include
int main()
{
 int s, nbytes;
struct sockaddr_can addr;
struct ifreq ifr;
struct can_frame frame[2] = {{0}};
s = socket(PF_CAN, SOCK_RAW, CAN_RAW);  //创建套接字
strcpy(ifr.ifr_name, "can0" );
ioctl(s, SIOCGIFINDEX, &ifr);     //指定can0设备
addr.can_family = AF_CAN;
addr.can_ifindex = ifr.ifr_ifindex;
bind(s, (struct sockaddr *)&addr, sizeof(addr));   //将套接字与can0绑定
//禁用过滤规则,本进程不接收报文,只负责发送
  setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, NULL, 0);
  //生成两个报文
frame[0].can_id = 0x11;
frame[0]. can_dlc = 1;
frame[0].data[0] = 'Y';
frame[0].can_id = 0x22;
frame[0]. can_dlc = 1;
frame[0].data[0] = 'N';
//循环发送两个报文
while(1) {
nbytes = write(s, &frame[0], sizeof(frame[0]));  //发送frame[0]
if (nbytes != sizeof(frame[0])) {
    printf("Send Error frame[0]\n!");
    break;        //发送错误,退出
}
 sleep(1);
nbytes = write(s, &frame[1], sizeof(frame[1]));  //发送frame[1]
if (nbytes != sizeof(frame[0])) {
    printf("Send Error frame[1]\n!");
    break;
}
 sleep(1);
}
close(s);
return 0;
}


#include
#include
#include
#include
#include
#include
#include
#include
#include
int main()
{
int s, nbytes;
struct sockaddr_can addr;
struct ifreq ifr;
struct can_frame frame;
struct can_filter rfilter[1];
s = socket(PF_CAN, SOCK_RAW, CAN_RAW);  //创建套接字
strcpy(ifr.ifr_name, "can0" );
ioctl(s, SIOCGIFINDEX, &ifr);     //指定can0设备
addr.can_family = AF_CAN;
addr.can_ifindex = ifr.ifr_ifindex;
bind(s, (struct sockaddr *)&addr, sizeof(addr));   //将套接字与can0绑定
  //定义接收规则,只接收表示符等于0x11的报文
rfilter[0].can_id   = 0x11;
rfilter[0].can_mask = CAN_SFF_MASK;
//设置过滤规则
setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, &rfilter, sizeof(rfilter));
  while(1) {
   nbytes = read(s, &frame, sizeof(frame));   //接收报文
   //显示报文
if (nbytes > 0) {
printf(“ID=0x%X DLC=%d data[0]=0x%X\n”, frame.can_id,
frame.can_dlc, frame.data[0]);
}
}
close(s);
return 0;
}

CAN总线应用开发接口

由于系统将CAN设备作为网络设备进行管理,因此在CAN总线应用开发方面,Linux提供了SocketCAN接口,使得CAN总线通信近似于和以太网的通信,应用程序开发接口更加通用,也更加灵活。 此...
  • lijianboyangting
  • lijianboyangting
  • 2015年09月22日 18:54
  • 2564

CAN总线开发实例

下面通过实例来说明CAN总线接口的使用方法。在本例中,有两个进程,其中一个进程负责报文的发送(标识符为0x11和0x22),另一个进程负责报文的接收和过滤(只接收标识符为0x11的报文)。 /* 1...
  • king16304
  • king16304
  • 2016年08月22日 11:37
  • 1905

Linux CAN编程详解

《Linux CAN编程详解》是一篇百度文库上的文档,主要描述了以下内容: can总线介绍及其帧类型; Linux 系统中CAN 接口配置; Linux 系统中CAN 接口应用程序开发; Lin...
  • reille
  • reille
  • 2015年11月22日 23:39
  • 3876

linux socket can程序cantool

最近写了个自认为不错的基于linux socket can程序,主要功能: 1. 程序具备全部CAN功能,包括CAN标准帧/扩展帧接收与发送、CAN总线错误判断、环回等功能 2. 适用基于LINUX...
  • reille
  • reille
  • 2015年11月20日 17:29
  • 5415

QT 环境下开发socketCan接口程序

使用头文件 #include #include "QTimer" #include "QTime" #include "QMessageBox" #include #include...
  • qq_32320473
  • qq_32320473
  • 2015年12月02日 22:14
  • 2023

CAN总线通用波特率计算器(附QT Creator项目源代码)

  • 2009年11月25日 13:47
  • 5.14MB
  • 下载

CAN总线开发实例

下面通过实例来说明CAN总线接口的使用方法。在本例中,有两个进程,其中一个进程负责报文的发送(标识符为0x11和0x22),另一个进程负责报文的接收和过滤(只接收标识符为0x11的报文)。 /* 1...
  • lijianboyangting
  • lijianboyangting
  • 2015年09月22日 18:40
  • 738

CAN总线基础知识(一) MODBUS通讯协议及PLC编程通讯实例

点击打开链接
  • wocao1226
  • wocao1226
  • 2015年11月11日 14:59
  • 1987

浅谈CAN总线

在前面的《浅谈I2C总线》和《浅谈SPI总线》 中我们介绍的 I2C、SPI 总线多用于传输距离短、协议简单、数据量小、主要面向 IC(集成电路)间通信的“轻量级”场合。而 CAN 总线则不同,CAN...
  • luckydarcy
  • luckydarcy
  • 2016年06月01日 15:00
  • 1967

如何实现CAN总线设备无线连接Android手机

本文介绍了如何通过使用CAN-WiFi转换器和CAN-蓝牙转换器实现CAN总线设备无线连接Android手机。...
  • cankau
  • cankau
  • 2016年06月29日 09:49
  • 2791
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CAN总线开发实例
举报原因:
原因补充:

(最多只允许输入30个字)