网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
3、串口通信协议
int parse_protocol(protocol_struct* pProtocol,uint16_t parseDataLen)
{
//解析数据,使用前需提前缓冲 pProtocol->message_st.pData
int ret = -1;
uint16_t pos_offset;
frame_struct* pFrameStruct = &pProtocol->frame_st;
message_struct* pMessageStruct = &pProtocol->message_st;
if (check_protocol_heade(pMessageStruct->pData) == PROTOCOL_RESULT_OK)
{
//更新帧头数据
pFrameStruct->header.sof = pMessageStruct->pData[0];
//获取data段的数据长度
pFrameStruct->header.data_length = (pMessageStruct->pData[2] << 8) | (pMessageStruct->pData[1]);
pFrameStruct->header.crc_check = pMessageStruct->pData[3];
//获取此次数据包长度
pMessageStruct->data_len = pFrameStruct->header.data_length + PROTOCOL_DATA_OFFSET + 2;
//计算解析后得到的 data_union 数据长度
pFrameStruct->frame_user.cmd_data.data_len = (pFrameStruct->header.data_length) / sizeof(data_union);
if(pMessageStruct->data_len<=parseDataLen)
{
if (pMessageStruct->data_len <= pMessageStruct->max_data_len)
{
if(CRC16_Check_Sum(&pMessageStruct->pData[0], pMessageStruct->data_len) != 0)
{
pFrameStruct->frame_user.equipment_type = (pMessageStruct->pData[5]<<8) | (pMessageStruct->pData[4]);
pFrameStruct->frame_user.equipment_id = (pMessageStruct->pData[7] << 8) | (pMessageStruct->pData[6]);
pFrameStruct->frame_user.data_id = (pMessageStruct->pData[9] << 8) | (pMessageStruct->pData[8]);
//拷贝 data段 指定长度数据
ret = (int)memcpy(&pFrameStruct->frame_user.cmd_data.pData[0], &pMessageStruct->pData[PROTOCOL_DATA_OFFSET], pFrameStruct->header.data_length);
pos_offset = pFrameStruct->header.data_length + PROTOCOL_DATA_OFFSET;
pFrameStruct->frame_tail = (pMessageStruct->pData[pos_offset+1] << 8) | (pMessageStruct->pData[pos_offset]);
return PROTOCOL_RESULT_OK;
}
else
{
//待解析BUFF超过预定解析数据容量,避免内存越界
PROTOCOL_ERROR_PRINTF("parse_protocol->>CRC16_Check_Sum err!\n");
return PROTOCOL_RESULT_CHECK_FRAME_ERR;
}
}
else
{
//待解析BUFF超过预定解析数据容量,避免内存越界
PROTOCOL_ERROR_PRINTF("parse_protocol->>data_len[%d] > max_data_len[%d]!\n",
pMessageStruct->data_len,
pMessageStruct->max_data_len);
return PROTOCOL_RESULT_OUT_OF_LEN;
}
}
else
{
//通过包头计算,还未收到完整的数据包
// PROTOCOL_ERROR_PRINTF("parse_protocol->>data_len[%d] > max_data_len[%d]!\n",
// pMessageStruct->data_len,
// pMessageStruct->max_data_len);
return PROTOCOL_RESULT_OUT_OF_LEN;
}
}
else
{
//待解析BUFF超过预定解析数据容量,避免内存越界
PROTOCOL_ERROR_PRINTF("parse_protocol->>check_protocol_heade err!\n");
return PROTOCOL_RESULT_CHECK_HEAD_ERR;
}
PROTOCOL_DEBUG_PRINTF("parse_protocol->>check_protocol_heade ok!\n");
return PROTOCOL_RESULT_ERR;
}
![img](https://img-blog.csdnimg.cn/img_convert/a988c870061ca90e3fa7782d8cb080d5.png)
![img](https://img-blog.csdnimg.cn/img_convert/75e253a9ff24db21002f28c7251a0e41.png)
![img](https://img-blog.csdnimg.cn/img_convert/278fdc2d061728dc971511304e23523f.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618658159)**
源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618658159)**