linux-can编程(一)

2023-05-16

建立can的socket

int can_create_socket(char *name)
{
	int fd;
    	struct sockaddr_can addr;
    	struct ifreq ifr;

	socklen_t len = sizeof(addr);
	/* 
	 * RAW protocol sockets with can filters(SOCK_RAW) 
	 * Broadcast Manager protocol sockets(SOCK_DGRAM)
	 */
    	fd = socket(PF_CAN, SOCK_RAW, CAN_RAW);
//	fd = socket(PF_CAN, SOCK_DGRAM, CAN_BCM);

	if(fd < 0)	return -1;

    	strcpy(ifr.ifr_name, name );
    	ioctl(fd, SIOCGIFINDEX, &ifr);
		
	/* 非阻塞 */
//	int flags = fcntl(fd, F_GETFL, 0);
//	fcntl(fd, F_SETFL, flags |O_NONBLOCK);

    	addr.can_family = AF_CAN;
    	addr.can_ifindex = ifr.ifr_ifindex;
	
    	bind(fd, (struct sockaddr *)&addr, len);

	return fd;
}

设置can的波特率

void can1_baudrate_set(int bitrate)
{
	system("ip link set can1 down");
	if(bitrate == CAN_50K_BAUDRATE){
		system("ip link set can1 type can bitrate 50000");
	}else if(bitrate == CAN_20K_BAUDRATE){
		system("ip link set can1 type can bitrate 20000");
	}	
	system("ip link set can1 up");

}

接受函数如下:

int can1_receive(void)
{
	int canFdMax, fd_act;	
	int can1_sock;
	int rxlen;
	fd_set 	recvFdSet;	
	struct timeval timeout;
	struct can_frame rxBuf;
	int  can_frame_size = sizeof(struct can_frame);
	
	can1_sock=can_create_socket("can1");
can1_baudrate_set(CAN_50K_BAUDRATE);//can1_baudrate_set(CAN_20K_BAUDRATE);
  while(1)
  {
		canFdMax = -1;
		FD_ZERO(&recvFdSet);
		if (can1_sock > 0) {
			FD_SET(can1_sock, &recvFdSet); 
			if(canFdMax < can1_sock) {canFdMax =can1_sock;}
		}		
		if(canFdMax > 0){
			timeout.tv_sec = 0;
			timeout.tv_usec = 8*1000;
			fd_act = 0;
			fd_act = select(canFdMax+1, &recvFdSet, NULL, NULL, &timeout);		
			if (fd_act > 0) {
				if (can1_sock > 0) {
					if (FD_ISSET(can1_sock, &recvFdSet)) {	/* can1 接收 */						
						rxLen = read(can1_sock, &rxBuf, can_frame_size);
						if(rxLen > 0){	
								/*解析rxbuf*/				
						}		
					}					
				}						
			}
		
		}
	
}
		

}

解析rxbuf过程,首先看can_frame结构体(我用的事扩展帧)

 	struct can_frame {

	canid_t can_id;//CAN 标识符
	__u8 can_dlc;//数据场的长度
	__u8 data[8];//数据

	};

截取rubuf的成员,可以建立一个自己的结构体,用来解析

typedef struct {
	unsigned char eff_rtr_err;
	unsigned char  fun1;
	unsigned char  fun2;
	unsigned char  fun3;
	unsigned char  fun4;
}can_id_t;
can_id_t can_id_out;

假设 fun1为22-29(21-28)、fun2为15-21(14-20)、fun3为8-14(7-13)、fun1为1-7(0-6)
can_id_out.eff_rtr_err=(uchar)((rxbuf.can_id & 0xe0000000)>>29);
can_id_out.fun1	= (uchar)((rxbuf.can_id & 0x1fe00000)>>21);
can_id_out.fun2	= (uchar)((rxbuf.can_id & 0x001fc000)>>14);
can_id_out.fun3	= (uchar)((rxbuf.can_id & 0x00003f80)>>7);
can_id_out.fun4	= (uchar)(rxbuf.can_id & 0x0000007f);


rxbuf.can_dlc用来判断长度;
rxbuf.data为接受数据

发送数据类似

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

linux-can编程(一) 的相关文章

随机推荐

  • char和int转换

    char和int的转换有两种方式 最简单的方法就是利用ASSCII码的差值 xff0c 直接用char的值减去 0 就行了 eg xff1a char a 61 39 9 39 int a 61 a 39 0 39 或者就用atof函数 x
  • printf缓冲区踩坑

    问题 碰到了这样一段代码 经过简化的 span class token macro property span class token directive hash span span class token directive keywo
  • PSINS学习笔记---姿态解算(1)---圆锥运动

    PSINS堪称中国导航领域的福音了 计划将工具箱中常用于工程实际中的相关算法根据个人理解做个解读注释 并且利用严老师网站中公开的数据集进行测试 由于个人水平有限 料想会漏洞百出 希望大家发现了不吝赐教 xff0c 感谢 xff01 1 加载
  • 使用matlab读取excel并作图

    在写论文时无奈非要用matlab xff0c 于是用地面站把传感器数据导出到了excel xff0c 用matlab画个图 用地面站向excel中读入数据 读入完保存即可 我读的是两种传感器数据 xff0c 一个是光流的位置值 xff0c
  • 坐标系梳理

    在很久以来 xff0c 我以为世界上只有两种坐标系 n系导航系和b系机体坐标系 最近在调试厂实验期间才知道原来还有特么这么多坐标系 机体系 xff1a 无人机 潜航器这些刚体自身的坐标系 xff0c 坐标系符合右手法则 xff0c x轴为机
  • 串口通信实现Int或float类型数据传输的方法

    方法 xff1a 发送方拆分数据为多个字节 xff0c 接收方再合并 串口通信程序中发送和接受数据以字节为单位 xff0c 将int或float类型的数据拆成单个字节存放到发送字符数组中 xff0c 然后接收方按照大小端模式将其重新合并为i
  • Gazebo Plugins教程

    Overview of Gazebo plugins Gazebo插件通过标准C 43 43 类直接控制Gazebo模型 xff0c 其具有以下优点 可以控制gazebo中几乎各个方面 xff1b 容易共享 xff1b 能够在运行的系统中插
  • 基于STM32读取SBG Ellipse A型号惯导数据

    之前在飞控上用的都是mpu6050 xff0c 但AUV在执行任务时主要在水下环境 xff0c 收不到GPS信号 xff0c 因此对INS的精度要求较高 xff0c 在姿态解算时要考虑地球自转等因素 xff0c 因此需要一款惯导器件能够感受
  • gcc-arm-none-eabi + scons环境搭建、固件烧录小记

    环境搭建在win7系统下进行 1 装git https gitforwindows org 正常下载即可 xff0c 装完后将git路径 xff08 D Program Files Git bin xff09 添加到环境变量中 添加方法 x
  • C语言中常用宏__FUNCTION_和__FILE__、__LINE__的用法介绍

    C C 43 43 提供了三个宏 FUNCTION FILE 和 LINE 用于定位程序运行时发生错误的位置 程序预编译时预编译器将用所在的函数名 xff0c 文件名和行号替换 当运行时错误产生后这三个宏分别能返回错误所在的函数 xff0c
  • Linux命令发送Http的get或post请求(curl和wget两种方法) 及定时任务的设置

    Http请求指的是客户端向服务器的请求消息 xff0c Http请求主要分为get或post两种 xff0c 在Linux系统下可以用curl和wget命令来模拟Http的请求 下面就来介绍一下Linux系统如何模拟Http的get或pos
  • ROS path问题解决方案

    1 问题描述 1 1 在Roboware里面直接右键运行launch文件会出现如下错误 ResourceNotFound hector gazebo worlds ROS path 0 61 opt ros kinetic share ro
  • ubuntu下socket通信

    点击打开原文链接 第一部分为C 43 43 实现 xff0c 第二部分为python实现 第一部分 该socket 的功能是在客户端输入了两个浮点数组成的字符串 xff0c 在服务端接受后将其转换为浮点数输出 xff0c 统一时刻只能有一个
  • ZED相机深度模式+ZED sl中函数介绍

    ZED SDK提供两种深度感应模式 xff1a STANDARD和FILL 该STANDARD模式是ZED的默认深度感应模式 该STANDARD模式保留距离度量和形状 xff0c 并且比FILL模式运行得更快 xff0c 但它包含由于视觉遮
  • 串行通信的数据位,起始位,停止位?

    参考链接 单片机串口通信一般是11位 xff0c 起始位1bit xff0c 数据位8bit xff0c 校验位1bit xff0c 停止位1bit xff0c 串口通信分两种一种是同步通信 xff0c 一种是异步通信 xff0c 像ps
  • linux的UDP通信编程

    这篇文章将对linux下udp socket编程重要知识点进行总结 xff0c 无论是开发人员应知应会的 xff0c 还是说udp socket的一些偏僻知识点 xff0c 本文都会讲到 尽可能做到 xff0c 读了一篇文章之后 xff0c
  • UDP组播服务端与客户端代码实例

    1 组播服务端代码 xff08 数据发送端 xff09 include lt stdio h gt include lt stdlib h gt include lt stdbool h gt include lt string h gt
  • HTTP报文

    HTTP请求报文解剖 http请求报文由3部分组成 xff08 请求行 请求头 请求体 xff09 实际请求报文 是请求方法 xff0c GET和POST是最常见的HTTP方法 xff0c 除此以外还包括DELETE HEAD OPTION
  • IMX6ULL与STM32F103的CAN通信实现

    IMX6ULL与STM32F103的CAN通信实现 硬件连接驱动层实现IMX6ULLSTM32F103ZET6 应用层实现IMX6ULLSTM32F103ZET6 结果 在上一篇博文中 xff0c 我们利用USBCAN设备及其上位机软件 x
  • linux-can编程(一)

    建立can的socket int can create socket char name int fd struct sockaddr can addr struct ifreq ifr socklen t len 61 sizeof ad