内容纲要
2023.4.14
#include "stdio.h"
#include "stdint.h"
//typedef unsigned char uint8_t;
//typedef unsigned short uint16_t;
typedef struct {
//uint8_t start; // 判断第一个结构体的值是否为正常 ===== 这里没有start 字段,就目前的数据帧格式,不应该会出现它
uint8_t len;
uint8_t c_field;
uint16_t m_field; //2个字节
//uint8_t m_field[2]; //2个字节
uint8_t a_field[6];
uint8_t ci_field;
char* data[255]; //结构体中默认开启的默认缓存可能是8(long类型),所以在下方的 数据解析函数中,i>8的时候 就会栈溢出
//uint8_t rssi;
//uint16_t crc;
//uint8_t stop;
} wm_data_t;
/**
* 数据解析接口
* @param data
* @param item
*/
void wmbus_data_decode(const char data[], wm_data_t * item) {
// TODO 数据解析
// 此处的decode 用于将data 赋值到item 中,item 传入一个空的结构体参数,
/*
思路: 拿到len 解析出来,然后将
char* data[] 赋值出来。
*/
item->len = data[0];
item->c_field = data[1];
//item->m_field[0] = data[2];
//item->m_field[1] = data[3];
item->m_field = (data[2] << 8) + data[3]; // 使用左移运算符实现16进制 的拼接。
for (size_t i = 0; i < 6; i++)
{
item->a_field[i] = data[4+i];
}
item->ci_field = data[10];
for (size_t i = 0; i < item->len - 10; i++)
{
item->data[i] = data[11 + i];
}
}
/**
* 打印数据内容
* @param item
*/
void wmbus_show(wm_data_t* item) {
short dataLen = item->len -10;
printf("字段长度:%d \n", sizeof(*(item->data))); //2个字节
//printf("%x\n", item->start);
printf("len字段为:%x\n", item->len);
printf("c_field字段:%x\n", item->c_field);
/************** M_field 和 A_field 字段表示的是Master 发布数据的信息 ********************/
//printf("m_field 字段的数值:%x,%x\n",item->m_field[0], item->m_field[1]);
printf("m_field 字段的数值:%x\n",item->m_field);
printf("a_field 字段的数值:");
for (int i = 0; i < sizeof(item->a_field); i++)
{
printf(" %x", item->a_field[i]);
}
printf("\n");
/**************************************************************************************/
printf("CI_field 字段:%d\n", item->ci_field); // CI 控制字段,用来说明 表示出接下来的数据的架构(一层或者多层)
// 下方打印data 数据
printf("data: ");
printf(" item-> dataLen = %d\n", dataLen);
for (int i = 0;i < dataLen;i++)
{
printf(" %x", (item->data)[i]);
}
printf("\n");
}
int main() {
char data[] = {
0x15, 0x46,
0xF8, 0x02, 0xFA, 0xB2, 0x66, 0x02, 0xB6, 0xAA, // 这里是M - A 字段
0x7A,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05,0x06, 0x07, 0x08, 0x09, 0x0A // data 字段
};
wm_data_t item = { 0 };
wmbus_data_decode(&data, &item); // 传入地址节约空间(防止内存拷贝),
wmbus_show(&item);
system("pause");
return 0;
}
-
今天遇到的问题,在结构体中,uint16_t m_field; 这个字段会存在问题,
- 问了chatGPT 它回复的是 ,在不同的系统环境下,可能存在大端小端的问题,就会导致 printf() 打印输出根据内存顺序的打印,就会反着打印。
- 没找到原因的问题: uint16_t 这个字段部分,如果使用这个字段,那么 data[] 数组的第4个元素不会被打印,而是直接跳过哪个元素,实在没找到原因。
-
char * data[];
遇到的问题,解引用之后*data;
好像并不能获取它的数值, 这是语法问题,后面要研究 -
结构体中,数组类型,要注意初始化的默认值,如果不给它一个值,可能默认值就是8,然后如果你在9或者之后的位置放数进去,他就会报错,stack over flow (栈溢出)
解决办法: 给结构体数组大爷的
[]
里面放一个大点的数做内存开辟的缓存, -
学到的一点:运用左移运算符,实现16进制数据的拼接。