第一次提交
This commit is contained in:
119
src/Communication_Protocol.c
Normal file
119
src/Communication_Protocol.c
Normal file
@ -0,0 +1,119 @@
|
||||
#include "Communication_Protocol.h"
|
||||
int32_t IRIS_Protocol_Pack(uint8_t Command,uint16_t LenthofIn, uint8_t *BufferIn, uint8_t *PackData)
|
||||
{
|
||||
if( PackData == NULL || (LenthofIn!=0 && BufferIn == NULL))
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
PackData[0] = 0x55;
|
||||
PackData[1] = 0xAA;
|
||||
PackData[2] = Command;
|
||||
PackData[3] = LenthofIn & 0xFF;
|
||||
PackData[4] = (LenthofIn >> 8) & 0xFF;
|
||||
if(LenthofIn!=0)
|
||||
{
|
||||
memcpy(&PackData[5],BufferIn,LenthofIn);
|
||||
}
|
||||
uint16_t CRC = IRIS_calcCRC(PackData, LenthofIn+5);
|
||||
PackData[LenthofIn+5] = CRC & 0xFF;
|
||||
PackData[LenthofIn+6] = (CRC >> 8) & 0xFF;
|
||||
return LenthofIn+7;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
int32_t IRIS_Protocol_Unpack(uint8_t *PackData, uint16_t LenthofIn, uint8_t Command, uint8_t *BufferOut)
|
||||
{
|
||||
if( PackData == NULL || BufferOut == NULL)
|
||||
{
|
||||
return -100;
|
||||
}
|
||||
if(PackData[0] != 0x55 || PackData[1] != 0xAA)
|
||||
{
|
||||
return -200;
|
||||
}
|
||||
if(PackData[2] != Command)
|
||||
{
|
||||
return -300;
|
||||
}
|
||||
uint16_t LenthofOut = PackData[3] + (PackData[4] << 8);
|
||||
if(LenthofOut > LenthofIn - 7)
|
||||
{
|
||||
return -400;
|
||||
}
|
||||
uint16_t CRC = IRIS_calcCRC(PackData, LenthofOut+5);
|
||||
if(CRC != (PackData[LenthofOut+5] + (PackData[LenthofOut+6] << 8)))
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
if(LenthofOut == 0)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
memcpy(BufferOut,&PackData[5],LenthofOut);
|
||||
return LenthofOut;
|
||||
|
||||
}
|
||||
|
||||
|
||||
int32_t IRIS_Cut_Befor_Header(uint8_t *PackData, uint16_t LenthofIn )
|
||||
{
|
||||
if( PackData == NULL )
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
uint16_t i = 0;
|
||||
for(i = 0; i < LenthofIn; i++)
|
||||
{
|
||||
if(PackData[i] == 0x55 && PackData[i+1] == 0xAA)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(i == LenthofIn)
|
||||
{
|
||||
//清空数据
|
||||
memset(PackData,0,LenthofIn);
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint16_t LenthofOut = LenthofIn - i;
|
||||
memcpy(PackData,&PackData[i],LenthofOut);
|
||||
return LenthofOut;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
uint16_t IRIS_calcCRC(const void *pBuffer, uint16_t bufferSize)
|
||||
{
|
||||
const uint8_t *pBytesArray = (const uint8_t*)pBuffer;
|
||||
uint16_t poly = 0x8408;
|
||||
uint16_t crc = 0;
|
||||
uint8_t carry;
|
||||
uint8_t i_bits;
|
||||
uint16_t j;
|
||||
for (j =0; j < bufferSize; j++)
|
||||
{
|
||||
crc = crc ^ pBytesArray[j];
|
||||
for (i_bits = 0; i_bits < 8; i_bits++)
|
||||
{
|
||||
carry = crc & 1;
|
||||
crc = crc / 2;
|
||||
if (carry)
|
||||
{
|
||||
crc = crc^poly;
|
||||
}
|
||||
}
|
||||
}
|
||||
return crc;
|
||||
}
|
||||
|
54
src/Communication_Protocol.h
Normal file
54
src/Communication_Protocol.h
Normal file
@ -0,0 +1,54 @@
|
||||
|
||||
#ifndef COMMUNICATION_PROTOCOL_H
|
||||
#define COMMUNICATION_PROTOCOL_H
|
||||
|
||||
|
||||
#include <stdint.h>
|
||||
#include <Communication_struct.h>
|
||||
// DEFINE The protocol Here
|
||||
//Forexample
|
||||
// #define MYCOMAN 0x02 //命令全大写
|
||||
// todo : define your protocol here
|
||||
/*-------------------------------------------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------------------------------------------*/
|
||||
/*
|
||||
在此之下开始定义一些函数
|
||||
*/
|
||||
// 成功返回打包后的数据长度
|
||||
// -1: Error
|
||||
// 成功返回打包后的数据长度
|
||||
int32_t IRIS_Protocol_Pack(uint8_t Command,uint16_t LenthofIn, uint8_t *BufferIn, uint8_t *PackData);
|
||||
|
||||
// 成功返回解包后的数据长度
|
||||
// 0: 该命令返回无参数
|
||||
// -1: checksum error
|
||||
// -100: parameter error
|
||||
// -200: header error
|
||||
// -300: command error
|
||||
// -400: length error
|
||||
// 成功返回解包后的数据长度
|
||||
int32_t IRIS_Protocol_Unpack(uint8_t *PackData, uint16_t LenthofIn, uint8_t Command, uint8_t *BufferOut);
|
||||
|
||||
// 定义裁切命令
|
||||
// 成功返回裁切后的数据长度
|
||||
// -1: Error
|
||||
int32_t IRIS_Cut_Befor_Header(uint8_t *PackData, uint16_t LenthofIn );
|
||||
|
||||
// 返回CRC校验值
|
||||
uint16_t IRIS_calcCRC(const void *pBuffer, uint16_t bufferSize);
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
36
src/Communication_struct.h
Normal file
36
src/Communication_struct.h
Normal file
@ -0,0 +1,36 @@
|
||||
#ifndef COMMUNICATION_STRUCT_H
|
||||
#define COMMUNICATION_STRUCT_H
|
||||
|
||||
// Define your communication structures here
|
||||
// For example:
|
||||
/*
|
||||
如果发送和接受的数据结构一样,那么就定义一个结构体
|
||||
struct MyComan_struct //对应的命令结构体 小驼峰命名法+struct
|
||||
{
|
||||
uint8_t Command;
|
||||
uint16_t LenthofIn;
|
||||
};
|
||||
|
||||
|
||||
|
||||
如果发送和接受的数据结构不一样,那么就分开定义
|
||||
struct MyComan_Send_struct //对应的命令结构体 小驼峰命名法+Send_struct
|
||||
{
|
||||
uint8_t Command;
|
||||
uint16_t LenthofIn;
|
||||
|
||||
};
|
||||
|
||||
struct MyComan_Recv_struct //对应的命令结构体 小驼峰命名法+Recv_struct
|
||||
{
|
||||
uint8_t Command;
|
||||
uint16_t LenthofOut;
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
*/
|
||||
|
||||
|
||||
#endif // COMMUNICATION_STRUCT_H
|
Reference in New Issue
Block a user