通过联合体实现CAN数据的发送和接收

文章概述

利用联合体将发送的数据打包和位数变换


前言

通常发送的CAN数据为8个字节内容,即8个uint8_t的数组元素,但是我们所计算出或者读取到的数据通常不是8位数据,而是16位或者32位的数据以及float型。如何才能将16、32位数据快速轻松不用移位进行按位的组合和分解呢。
往下看!


一、联合体的使用

联合体是什么,我不用赘述,联合体union是一种类型,类似结构体,能将多种类型的元素存放进去,并且多个元素共享一个首地址。这就为不同位数的元素组合拼装在一起提供可能。

二、不同位数数据的拼装

1.引入

代码如下:通过将不同位的数据放到一个联合体里面,实现数据的拼装

typedef union 
{
	
    
		int data[2];
		short  u16Data[4];
		char u8Data[8];
	  //数据打包
	
}c_wttk; 

举个例子,如果can发来8个字节的数据,但是前(后)4个字节数据(32位)组合起来,其实才是一个完整的32位的数据。只是在发送的时候不得已将32位数据拆分成4个8位的数据。
我们在收到的时候把8个字节数据放到union联合体的数组里面,直接取出32位的data[0],就可以直接使用这个32位的数据了。经过测试,数据是对的。当然,如果数据是16位的,也可以直接提取出16位数据的数组元素。具体的代码测试过程如下:

2.代码测试

代码如下:

int main(void){

	
	c_wttk tank;
	
//	tank.u8Data[0]=0x12;
//	tank.u8Data[1]=0x23;
//	tank.u8Data[2]=0x34;
//	tank.u8Data[3]=0x45;
//	tank.u8Data[4]=0x56;
//	tank.u8Data[5]=0x67;
//	tank.u8Data[6]=0x78;
//	tank.u8Data[7]=0x89;

//--------------------------------------------------------------
	tank.data[0]=0x45342312;
	tank.data[1]=0x89786756;



//--------------------------------------------------------------

//tank.u16Data[0]=0x2312;
//tank.u16Data[1]=0x4534;
//tank.u16Data[2]=0x6756;
//tank.u16Data[3]=0x8978;


printf("%x\n %x\n%x\n%x\n",tank.u16Data[0],tank.u16Data[1],tank.u16Data[2],tank.u16Data[3]);

//printf("%x\n-%x",tank.data[0],tank.data[1]);

//printf("%x\n,%x\n,%x\n,%x\n---",tank.u8Data[0],tank.u8Data[1],tank.u8Data[2],tank.u8Data[3]);
//printf("%x\n,%x\n,%x\n,%x",tank.u8Data[4],tank.u8Data[5],tank.u8Data[6],tank.u8Data[7]);


	return 0;
}

这样就可以啦,还有1点我们要注意,就是以16进制进行32位数据的摆放时,需要注意对齐(大小端模式),stm32的芯片,通常小端模式,低位在前的数据放到数组的低地址。


解释

本文为我的一个总结稿,我感觉挺有用的,所以分享一下,如果不懂可以评论哦。上面介绍了,发过来的数据可以组装,我们也可以在要发送数据的时候将数据进行拆分,即将1个32位的数据拆分成4个8位数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cap reagan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值