广告

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

2009-10-27 14:52 2545 0 分类: 汽车电子

笔记发送整形,长整形数据<?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();


......


}



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

广告

文章评论 0条评论)

登录后参与讨论
相关推荐阅读
akuei_2_550826815 2011-10-22 18:26
Verilog的私私细语 - 时钟化和信号的长度
目录 第2章 时钟化和信号的长度 2.01 一个时钟一块数据的概念 2.02 信号时钟化 2.03 深入了解模块的沟通 2.04 电平检测模块的整合(即时事件在时序上的不和谐)      实验八:电...
akuei_2_550826815 2011-09-08 12:47
瞎搞Time Quest 和无责任的笔记 第二章
最近整合篇的第二章的构思和灵感都累积不少了,应该是时候开工了。恰好手头上还有一本笔记还没有写完,就是这本瞎搞TimeQuest的第二章。目录笔者也懒得贴了,看过第一章的同学多少也会猜到第二章的内容是什...
akuei_2_550826815 2011-08-29 18:21
瞎搞Time Quest 和无责任的笔记 第一章
哎呀 ... 潜水了都有一段时间了,这是最近研究的成果和目标。 话说TimeQuest这个东西真的很搞怪呀,做得笔者不得不从其他的方向去研究它。 好了还是切入正题,TimeQuest用作静态时序的工具...
akuei_2_550826815 2011-07-06 17:43
Verilog的私私细语 - 整合的概念
目录         02  第1章  整合的概念          1.01  源码上的整合                   实验一:字面上的整合          1.02  时钟和步骤的定...
akuei_2_550826815 2011-06-22 10:18
VerilogHDL那些事儿 - 建模篇v4 + 时序篇v1
VerilogHDL那些事儿 - 建模篇v4 ====== v4 ====== 主要是修改了大量用法上的BUG和极限的精简内容 https://docs.google.com/leaf?id=0B...
akuei_2_550826815 2011-06-10 13:19
Verilog HDL的礼物 - Verilog HDL扫盲文
目录 02第0章 Verilog HDL语言扫盲文 030.01 各种的HDL语言 030.02 HDL语言的层次 03 0.03 RTL级和组合逻辑级 040.04 Verilog HDL语言真的那...
我要评论
0
0
广告
关闭 热点推荐上一条 /1 下一条