新手入门通信协议(帧头,帧尾,CRC)

首先创建一个protocol.h文件

用于声明函数以及结构体

#ifndef PROTOCOL_H
#define PROTOCOL_H

#include "main.h"

void Demo_code(float data1 float data2);

#pragma pack(1)
typedef struct {
      uint8_t header;
      uint8_t integerByte_data1;
      uint8_t integerByte_data2;
      uint8_t crc;
      uint8_t footer;
        } Frame;
#pragma pack()
#endif /* PROTOCOL_H */

注意:这里面使用#pragma pack(1)的原因是:进行内存一字节对齐,如果不加的话输出的串口数据与预期不一致

接下来编写protocol.c文件

#include "protocol.h"

/****************************Info********************************************** 
 * Name:    CRC-5/EPC    x5+x3+1 
 * Width:    5
 * Poly:    0x09 
 * Init:    0x09 
 * Refin:   False 
 * Refout:  False 
 * Xorout:  0x00 
 * Note: 
 *****************************************************************************/
unsigned char CRC5_EPC(unsigned char *data, unsigned int datalen)
{
    unsigned char wCRCin = 0x09<<3;
    unsigned char wCPoly = 0x09<<3;
    
    while (datalen--)     
    {
        wCRCin ^= *(data++);
        for(int i = 0;i < 8;i++)
        {
            if(wCRCin & 0x80)
                wCRCin = (wCRCin << 1) ^ (wCPoly);
            else
                wCRCin = wCRCin << 1;
        }
    }
    return (wCRCin >> 3);
}

const uint8_t frame_header = 0xAA;  // 帧头
const uint8_t frame_footer = 0xBB;  // 帧尾
uint8_t frame_footer;
void Demo_code(float data1 float data2){
            frame.header = frame_header;
            data1 = (int32_t)data1;  // 提取整数部分
            data1 = (uint8_t)data1;  // 转换为字节表示
            frame.integerByte_data1 = data1;
            data2 = (int32_t)data2;  // 提取整数部分
            data2 = (uint8_t)data2;  // 转换为字节表示
            frame.integerByte_data2 = data2;
            frame.crc = CRC5_EPC((uint8_t*)&frame.integerByte_data1, sizeof(frame) - 3);
            frame.footer = frame_footer;
            printf((uint8_t*)&frame, sizeof(frame));
}

最后在main.c中调用

Demo_code(float data1 float data2)

这样子一个入门版的通信协议就完成啦!

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值