首先创建一个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)
这样子一个入门版的通信协议就完成啦!