广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C/C++关于实现CAN信号的获取方法
  • 426
分享到

C/C++关于实现CAN信号的获取方法

C++CAN信号C++CAN信号获取C语言CAN信号 2023-02-03 18:02:30 426人浏览 安东尼
摘要

目录CAN基础知识CAN 信号C语言涉及到知识CAN基础知识 标准的CAN 数据为8字节,即64位,但是CAN FD的最大数据可为64字节,为512位,其中的帧ID分为标准帧和扩展帧

CAN基础知识

标准的CAN 数据为8字节,即64位,但是CAN FD的最大数据可为64字节,为512位,其中的帧ID分为标准帧和扩展帧,其中用11位标准帧,用29位表示扩展帧。

CAN 信号

信号具体指的是CAN数据的多少位到多少位间代表一个具体的信号,如5位到16位表示车辆的行驶速度,即完整的CAN数据可以表示多个信号。

can信号获取:

#include <iOStream>
#include <array>
unsigned char msbmask[] = {
	0xFF, 0xFE, 0xFC, 0xF8,
	0xF0, 0xE0, 0xC0, 0x80
};
unsigned char lsbmask[] = {
	0x01, 0x03, 0x07, 0x0F,
	0x1F, 0x3F, 0x7F, 0xFF
};
#define BITSET(p,n)  ((p) |= (1u <<(n)))
#define BITCLR(p,n)  ((p) &= ~(1u <<(n)))
#define BITGET(i,n)  ((i) & (1u << (n)))
typedef struct {
	unsigned char* can_data_ptr;
	int  len;
	int msb_pos;
	int lsb_pos;
}can_signal;
static can_signal cansingal;
int can_data_assignment(unsigned char* candata, int msbpos, int lsbpos, int lens)
{
	cansingal.can_data_ptr = (unsigned char*)malloc(lens);
	memcpy((void *)cansingal.can_data_ptr, (const void *)candata,lens);
	cansingal.len = lens;
	cansingal.msb_pos = msbpos;
	cansingal.lsb_pos = lsbpos;
	return 0;
 }
unsigned int can_data_transfer_signal()
{
	int a = 0;
	int b = 0;
	int c = 0;
	int d = 0;
	unsigned  int singal = 0;
	printf("%d %d\n", cansingal.lsb_pos, cansingal.msb_pos);
	printf("%02x %02x %02x %02x\n", cansingal.can_data_ptr[0], cansingal.can_data_ptr[1], cansingal.can_data_ptr[2], cansingal.can_data_ptr[3]);
	a = cansingal.lsb_pos / 8;
	b = cansingal.lsb_pos % 8;
	printf("a %d b %d\n", a, b);
	cansingal.can_data_ptr[a] = cansingal.can_data_ptr[a] & msbmask[b];
	c= cansingal.msb_pos / 8;
	d = cansingal.msb_pos % 8;
	printf("c %d d %d\n", c, d);
	cansingal.can_data_ptr[c] = cansingal.can_data_ptr[c] & lsbmask[d];
	printf("%02x %02x %02x %02x\n", cansingal.can_data_ptr[0], cansingal.can_data_ptr[1], cansingal.can_data_ptr[2], cansingal.can_data_ptr[3]);
	for (int i = cansingal.lsb_pos, j = 0; i <= cansingal.msb_pos; ++i, ++j)
	{
		a = i / 8;
		b = i % 8;
		if ( BITGET(cansingal.can_data_ptr[a], b) )
		{
			BITSET(singal, j);
		}
		else
		{
			BITCLR(singal,j);
		}
	}
	return singal;
}
void can_data_free(void)
{
	free(cansingal.can_data_ptr);
	cansingal.len = 0;
	cansingal.lsb_pos = 0;
	cansingal.msb_pos = 0;
	return;
}
int main(int arGC, char* argv[])
{
	unsigned char candata[4] = { 0x44, 0xFE, 0x23, 0x81};
	printf("%02x %02x %02x %02x\n", candata[0], candata[1], candata[2], candata[3]);
	can_data_assignment(candata,31,14,4);
	unsigned int c = can_data_transfer_signal();
	can_data_free();
	printf("%d\n", c);
	system("pause");
	return 0;
}

如上图,can数据的其中4字节为0x44,0xFE,0x23,0x81, 分别对应0到32位的数据,现在获取14位到31位的数据,形成具体的信号值。

运行结果:

C语言涉及到知识

位操作、指针与数组的操作、MSB LSB的表索引

数组与指针关系:

指针操作 +1 即 p + 1是指向下一位的地址,若p指向的类型为int类型,则p+1 指向下一个int类型数据的地址,若p指向的是个结构体,则p+1指向相对应结构体下一个元素的地址。

其中p[i] = *(p+i)

#include <stdio.h>
int main(int argc, char *argv[]){
    int a[] = {1, 3, 5, 7, 9};
    int *p, i, n;
    p = a;
    n = sizeof(a) / sizeof(int);
    printf("%p %p %p\n", a, a+1, a+2);
    for(i = 0; i < n; i++){
        printf("%d %d %d\n", a[i], *(p+i), *(a+i), p[i]);
    }
    puts("");
    return 0;
}

//打印出来的结果如下
0xbf92c324 0xbf92c328 0xbf92c32c
1 1 1
3 3 3
5 5 5
7 7 7
9 9 9

到此这篇关于C/C++关于实现CAN信号的获取方法的文章就介绍到这了,更多相关c++ CAN信号内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C/C++关于实现CAN信号的获取方法

本文链接: https://www.lsjlt.com/news/194166.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C/C++关于实现CAN信号的获取方法
    目录CAN基础知识CAN 信号C语言涉及到知识CAN基础知识 标准的CAN 数据为8字节,即64位,但是CAN FD的最大数据可为64字节,为512位,其中的帧ID分为标准帧和扩展帧...
    99+
    2023-02-03
    C++ CAN信号 C++ CAN信号获取 C语言CAN信号
  • 用c 获取文件MD5值的实现方法
    要使用C语言获取文件的MD5值,可以使用开源的MD5库,比如md5deep、OpenSSL或者GNU md5sum等。这里以Open...
    99+
    2023-08-15
    c
  • C++中关于多态实现和使用方法
    目录赋值兼容实例多态静多态动多态格式实例override纯虚函数含有虚函数的析构函数注意事项RTTItypeidtypecast多态实现虚函数一般继承(no override)一般继...
    99+
    2022-11-13
  • C++实现验证括号的方法
    本篇内容介绍了“C++实现验证括号的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Valid Parentheses 验证括号Given...
    99+
    2023-06-20
  • Android实现获取SERIAL信息的方法
    本文实例讲述了Android实现获取SERIAL信息的方法。分享给大家供大家参考。具体如下: android.os.build.serial 在API 9 中引入,如果低于9的...
    99+
    2022-06-06
    方法 Android
  • C语言获取dbms_output输出的方法(适用于oracle和达梦)
    最近安装了datagrip操作达梦数据库,发现有一个问题:dagagrip无法获取dbms_output的输出,在oracle是可以的,但在达梦不行。 于是联想到一个问题:c语言里面怎么获取dbms_output的输出? 百度了一...
    99+
    2019-09-29
    C语言获取dbms_output输出的方法(适用于oracle和达梦)
  • Android实现获取应用程序相关信息列表的方法
    本文所述为Androdi获取手机应用列表的方法,比如获取到Android应用的软件属性、大小和应用程序路径、应用名称等,获取所有已安装的Android应用列表,包括那些卸载了的...
    99+
    2022-06-06
    列表 程序 方法 应用程序 Android
  • C++通过文件指针获取文件大小的方法实现
    目录1. 叙述 2. 结论1. 叙述  对于读取本地文件,很多时候需要预先知道本地文件的大小在进行读取。网上给出的方案是移动文件指针,计算文件头和文件尾的偏移,计...
    99+
    2022-11-12
  • C++实现最长有效括号的方法
    这篇文章主要讲解了“C++实现最长有效括号的方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++实现最长有效括号的方法”吧!Longest Valid Parentheses 最长有效括...
    99+
    2023-06-20
  • Android获取短信验证码的实现方法
    先给大家展示下效果图,如果感觉不错,请参考实现思路详解 Android开发中关于短息验证码的设计层出不穷,越来越多的应用为了更好的提高软件的安全性,开始使用通过服务器向用户发...
    99+
    2022-06-06
    方法 验证码 短信验证码 Android
  • Android获取和读取短信验证码的实现方法
     现如今,验证码在Android的客户端还是非常普遍的.通过手机账号和验证码直接去注册应用账户的信息.很多应用都以这种方式来完成注册.简单的介绍一下吧.  ...
    99+
    2022-06-06
    方法 验证码 短信验证码 Android
  • C#转义字符双引号的实现方法
    这篇文章主要讲解了“C#转义字符双引号的实现方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#转义字符双引号的实现方法”吧!转义字符 \◆一种特殊的字符常量;◆以反斜线"\&q...
    99+
    2023-06-17
  • 基于C#实现Windows服务的方法详解
    目录前言Windows服务介绍创建Windows服务安装卸载Windows服务前言 在实际应用过程中,有时候我们希望开发的程序,不需要界面,直接开机就可以长时间运行,这时候,我们可以...
    99+
    2022-11-13
  • C语言实现括号配对的方法示例
    本文主要介绍了C语言实现括号配对的方法示例,分享给大家,具体如下: 代码如下: #include<stdio.h> #include<string.h> ...
    99+
    2022-11-12
  • C#基于winform实现音乐播放器的方法
    今天小编给大家分享一下C#基于winform实现音乐播放器的方法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。首先,右键工具...
    99+
    2023-06-29
  • C#读取word中表格数据的方法实现
    前些日子有一个项目需要从word文件中取表格数据并进行处理,网上大部分方案都是基于office的com组件实现,但是这样有一个缺点,如果电脑里没有安装office将无法使用,因为之前...
    99+
    2022-11-13
  • c# Windows CE读取电池电量的实现方法
    本篇内容主要讲解“c# Windows CE读取电池电量的实现方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“c# Windows CE读取电池电量的实现方法”吧!c# Windows CE读...
    99+
    2023-06-17
  • C#获取文件名和文件路径的两种实现方式
    目录C#获取文件名和文件路径方法一方法二C#通过文件路径获取文件名小技巧C#获取文件名和文件路径 方法一 OpenFileDialog open = new OpenFileDia...
    99+
    2022-11-13
  • C#读取Excel及显示和存储的实现方法
    这篇文章主要介绍“C#读取Excel及显示和存储的实现方法”,在日常操作中,相信很多人在C#读取Excel及显示和存储的实现方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#读取Excel及显示和存储的实...
    99+
    2023-06-18
  • C#实现从PDF中提取表格的方法详解
    目录程序环境从PDF中提取表格具体步骤完整代码PDF是办公中比较常见的一种文件格式,在工作中应用也越来越普遍。由于PDF文件集成度和安全可靠性都较高,所以在PDF中编辑内容是一件比较...
    99+
    2022-11-13
    C# PDF提取表格 C# PDF 表格
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作