1.问题的起源
各位小伙伴们有没有遇到过,单片机向单片机间、单片机和电脑间利用串口或其他什么的传输数据的问题嘞?不知道你们是怎么解决的,反正我常用的方法是将数据先转化成字符串,天下的字符串都长得一样,然后传输过去,在另一端将字符串分割并还原为数据。
我一直感觉这种方法蛮浪费资源的,明明本来就是数字的东西,还要折腾两遍。比如0xFFFFFFFF这个一个四字节的整型数据,转化成字符串为十字节的“4294967295”,简直事倍功半。然后嘞偶然了解到联合体这么个东东。。。。。。
2.C语言滴联合体(union)
谭浩强写的C语言程序设计(第二版)中大概有半页讲这个吧,反正看过就忘了。话不多,咱们少动脑子多敲代码。
#include "stdio.h"
struct up_data //定义了一个结构体,里边就是需要上传的数据格式,一共12字节。
{
int x;
int y;
};
union ss //定义一个联合体,说白了就是里边的东西都用一块空间
{
struct up_data a;
char b[sizeof(up_data)]; //这里有点点小问题,但是能用,不写值好像也行。
}sa; //这里直接实例化了一个联合体
int main()
{
sa.a.x = 49; //如果改成0xffffffff的话,下面输出的sa.b长度就是8了。
sa.a.y = 825373234; //0x31323232
sa.a.z = 3.1415;
printf_s("%d\r\n",strlen(sa.b));
printf_s("%d\r\n", sizeof(up_data));
printf_s("%x %x %x %x\r\n", sa.b[0], sa.b[1], sa.b[2], sa.b[3]);
printf_s("%x %x %x %x\r\n", sa.b[4], sa.b[5], sa.b[6], sa.b[7]);
//结果自己体会吧。我也不知道下面为啥这样的排版。
/* 1
8
31 0 0 0
32 32 32 31*/
}
这样就可以快乐的用串口发送sa.b这个“字符串”了。
3.还记得可爱可恨的指针吗
那年学过的指针也能解决这个问题哎。
#include "stdio.h"
struct up_data
{
int x;
int y;
};
int main()
{
struct up_data a1;
unsigned char *p;
a1.x = 825373234; //0x31323232
a1.y = 825373233; //0x31323231
p = (unsigned char *)&a1; //就是这样。。。
printf_s("%x %x %x %x\r\n",p[0],p[1],p[2],p[3]);
printf_s("%x %x %x %x\r\n", p[4], p[5], p[6], p[7]);
/*32 32 32 31
31 32 32 31*/
}
4.python中怎么搞嘞
from ctypes import *
from io import BytesIO
class lll(Structure):
_fields_ = [
("a1", c_int),
("a2", c_int), ]
ax = lll(825373234,50);
f=BytesIO()
f.write(a1)
a=f.getvalue()
print(a[0:8])
#b'22214\x00\x00\x00'
作者:雪涵~