原创 笔记八:发送整形,长整形数据

2009-10-27 14:52 3217 5 5 分类: 汽车电子

笔记发送整形,长整形数据<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


在以往的实验中,都是使用“无符号的字符型类型”作为数据的单位,前段时间浏览了以前的作品的时候,产生这样的一个问题“发送的数据为什么不可以是,整形或者长整形呢?”。那么先看看以下的C源码:



#include "stdio.h"



#define Lint sizeof(unsigned short int)


#define Llong sizeof(unsigned long)


#define Lfloat sizeof(float)


#define Ldouble sizeof(double)



int Length=Llong;



void main(void)


{


unsigned char temp[Length]; // 声明与该类型一样长度的数组


unsigned long a,i,c; // 声明一些无符号长整形变量



a=0xff0f0f0f; //4279176960 //  a赋值



printf("输入值:%u\n",a);



for(i=0;i<Length;i++) // 将变量a的值,逐个字节拆分然后复制temp


{


temp=a;


a=a>>8;


}



for(i=0;i<Length;i++) //输出证明


{


  printf("第%d字节: ",4-i);


  printf("十六进制表示 0x%x ,十进制表示 %d\n",temp[Length-i-1],temp[Length-i-1]);


}



for(i=0;i<Length;i++) //从temp中恢复a的值


{


a=a|temp[Length-i-1];


if(i!=1) 


   a=a<<8;


}



printf("输出值:%u\n",a); //输出证实


}




我主要的思路是将无符号长整形数据,逐个字节赋值与临时变量temp。然后再将临时变量temp的值逐个,恢复到无符号长整形变量中,视觉化效果如下:





点击看大图只要稍微有C语言基础的朋友都看得懂,思路也很简单而已。那么在CAN驱动程式中如何实现呢?


我们只要再创建一个拆分函数,该函数主要是将变量逐个区分,然后重新赋值到TXD_Buffer变量之中就行了。



unsigned long a=0xff0f0f0f;


Length=sizeof(unsigned long);



void CAN_TXD(void)


{


......


TBSR5=TXD_Buffer[5];


TBSR6=TXD_Buffer[6];


TBSR5=TXD_Buffer[7];


TBSR6=TXD_Buffer[8];


......


}



//拆分函数


void Split(void)


{


for(i=0;i<Length;i++) // 将变量a的值,逐个字节拆分然后复制temp


{


TXD_Buffer[i+5]=a;


a=a>>8;


}


}



void main(void)


{


......


Split(); //执行拆分函数


CAN_TXD(); //发送数据


......


}



变量拆分以后,然后被发送到某个节点,那么该节点需要重新拼接从中接收来得变量。思路也是一样,在该节点的程式中创建一个拼接函数,恢复接收的变量。



unsigned long a;


Length=sizeof(unsigned long);



//拼接函数


void Joint(void)


{


for(i=0;i<Length;i++) //RXD_Buffer从RXFIFO读取到的值,进行恢复后赋值予a


{


a=a|RXD_Buffer[Length-i-1+5];


if(i!=1) 


   a=a<<8;


}


}



//接收函数


void CAN_RXD(void)


{


......


RXD_Buffer[5]=RBSR5;


RXD_Buffer[6]=RBSR5;


RXD_Buffer[7]=RBSR5;


RXD_Buffer[8]=RBSR5;


......


}



//外部中断1(接收中断)


void Ir_EX1(void) interrupt 2


{


......


CAN_RXD();


......


}



好了,今天的笔记就写到这里吧!这章笔记主要是针对思路进行探讨而已,编写程式的方法是很自由的,这里仅提供一个参考,大家发挥自己的想象力吧。

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
5
关闭 站长推荐上一条 /3 下一条