项目背景
该项目基础是使用STC15W4k48S4单片机与温控器通过modbus 485实现设置温控的设定温度、定时读取温度值、温控启动工作、温控停止工作等操作。
在该通信过程中所使用的通信协议涉及到将整型数据变量拆分成字节数据,并通过modbus 485协议(实际在硬件电路设计时,使用到了TTL转485的电路)将字节数据传送出去,目前有两种方法提供给大家。
使用共用体
使用共用体
在C语言中,共用体是一种复合的数据结构。该数据结构拥有一个特殊的功能,就是其在计算中所申请的内存大小永远取决于该数据结构中内存大小最大的数据,其他数据与其共用该内存空间。在数据拆分与整合的过程中便想到该复合数据类型了。
- 定义的共用体为 ,该共用体数据一共包括两方面,一个是整型、一个是字节。因为在51架构的单片机中,整型为16位,即两字节的数据。
typedef union int_and_byte{
int x;
char y[2];
}data_type;
- 拆分功能 使用该功能函数可以将整型的数据拆分为两个字节数据,该处定义的函数为
e
void convert_byte(int m)
{
data_type e;
char i[2];
e.x=m;
i[0] =e.y[0];
i[1] =e.y[1];
}
3.合并功能 合并功能也是定义一个函数
int convert_int(char h,char l)
{
data_type e;
int t;
e.y[0]=h;
e.y[1]=l;
t=e.x;
return t;
}`
测试。
-
拆分功能 在实际测试中,是使用keil c51跑仿真得出的,数据拆分使用
convert_byte(int m)
函数,在这里将形参修改为300
即可,由此可知在计算中其二进制值为0x012C
,运行过程中的结果为0x01
、0x2C
。结果如下图所示;
-
合并功能 数据合并使用
convert_int(char h,char l)
函数,在这里将形参修改为convert_int(0x01,0x2c)
即可,由此可知在计算中表示数据为300
,运行过程中的结果为300
。结果如下图所示;
此方法已经验证,大家可放心使用。只是需要注意不同平台下,其int的位数可能不一致,需要根据实际运行的平台确定定义的字节数量