笔记八:发送整形,长整形数据<?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条评论)
登录后参与讨论