+5 改成+2

This commit is contained in:
xin
2024-06-14 11:47:35 +08:00
parent f0c4f0d9f9
commit 2c03d0ecf5
2 changed files with 75 additions and 96 deletions

View File

@ -11,8 +11,8 @@
- 0x01: 命令为字符串 即Data要转换为字符串 - 0x01: 命令为字符串 即Data要转换为字符串
- 0x00: 命令为json数据应用json解析Data - 0x00: 命令为json数据应用json解析Data
- 0x02-0xff:自定义二进制通讯数据Data的解析应改按照Communication_Protocol中约定进行 - 0x02-0xff:自定义二进制通讯数据Data的解析应改按照Communication_Protocol中约定进行
- **长度**Data+Check的总字节数 - **长度**Data的长度
- **Check**:长度+Data的 CRC校验 算法在Communication_Protocol提供了如果Data过长光谱数据可以不计算但是得提供此时提供内容为0xEE 0xEE - **Check**:Data的 CRC校验 算法在Communication_Protocol提供了如果Data过长光谱数据可以不计算但是得提供此时提供内容为0xEE 0xEE
- **均采用小端方式存储** - **均采用小端方式存储**

View File

@ -12,181 +12,160 @@
// Created by xin on 2024/2/1. // Created by xin on 2024/2/1.
// //
#include "IRIS_Method.h" #include "IRIS_Method.h"
int32_t IRIS_Protocol_Pack(uint8_t Command,uint16_t LenthofIn, uint8_t *BufferIn, uint8_t *PackData)
{ int32_t IRIS_Protocol_Pack(uint8_t Command, uint16_t LenthofIn, uint8_t *BufferIn, uint8_t *PackData) {
if( PackData == NULL || (LenthofIn!=0 && BufferIn == NULL)) if (PackData == NULL || (LenthofIn != 0 && BufferIn == NULL)) {
{
return -1; return -1;
} }
PackData[0] = 0x55; PackData[0] = 0x55;
PackData[1] = 0xAA; PackData[1] = 0xAA;
PackData[2] = Command; PackData[2] = Command;
PackData[3] = LenthofIn & 0xFF; uint16_t datalenth = LenthofIn;
PackData[4] = (LenthofIn >> 8) & 0xFF; PackData[3] = (datalenth >> 8) & 0xFF;
if(LenthofIn!=0) PackData[4] = datalenth & 0xFF;
{
memcpy(&PackData[5],BufferIn,LenthofIn); if (LenthofIn != 0) {
memcpy(&PackData[5], BufferIn, LenthofIn);
} }
uint16_t CRC = IRIS_calcCRC(PackData+3, LenthofIn+5); uint16_t crcbytelenth = LenthofIn;
PackData[LenthofIn+5] = CRC & 0xFF; uint16_t CRC = IRIS_calcCRC(PackData + 5, crcbytelenth);
PackData[LenthofIn+6] = (CRC >> 8) & 0xFF; PackData[LenthofIn + 5] = (CRC >> 8) & 0xFF;
return LenthofIn+7; PackData[LenthofIn + 6] = CRC & 0xFF;
return LenthofIn + 7;
} }
int32_t IRIS_STM32_Protocol_Unpack(uint8_t *PackData, uint16_t LenthofIn, uint8_t *Command, uint8_t *BufferOut) int32_t IRIS_STM32_Protocol_Unpack(uint8_t *PackData, uint16_t LenthofIn, uint8_t *Command, uint8_t *BufferOut) {
{
if( PackData == NULL || BufferOut == NULL) if (PackData == NULL || BufferOut == NULL) {
{
return ERROR_INPUT; return ERROR_INPUT;
} }
if(PackData[0] != 0x55 || PackData[1] != 0xAA) if (PackData[0] != 0x55 || PackData[1] != 0xAA) {
{
return ERROR_HEADER; return ERROR_HEADER;
} }
uint16_t LenthofOut = PackData[4] + (PackData[3] << 8)-2; uint16_t LenthofOut = PackData[4] + (PackData[3] << 8); //减去CRC的两个字节
if(LenthofOut > LenthofIn - 7) if (LenthofOut > LenthofIn - 7) {
{
return ERROR_NOT_ENOUGH_DATA; return ERROR_NOT_ENOUGH_DATA;
} }
uint16_t CRC = IRIS_calcCRC(PackData+3, LenthofOut+2);
if(CRC != (PackData[LenthofOut+6] + (PackData[LenthofOut+5] << 8))) if (PackData[LenthofOut + 6] == 0xEE && PackData[LenthofOut + 5] == 0xEE) {
{
return ERROR_CRC; } else {
uint16_t CRC = IRIS_calcCRC(PackData + 5, LenthofOut);
if (CRC != (PackData[LenthofOut + 6] + (PackData[LenthofOut + 5] << 8))) {
return ERROR_CRC;
}
} }
if(LenthofOut == 0)
{
if (LenthofOut == 0) {
return 0; return 0;
} }
*Command=PackData[2] ; *Command = PackData[2];
memcpy(BufferOut,&PackData[5],LenthofOut); memcpy(BufferOut, &PackData[5], LenthofOut);
return LenthofOut; return LenthofOut;
} }
int32_t IRIS_Protocol_Unpack(uint8_t *PackData, uint16_t LenthofIn, uint8_t Command, uint8_t *BufferOut) int32_t IRIS_Protocol_Unpack(uint8_t *PackData, uint16_t LenthofIn, uint8_t Command, uint8_t *BufferOut) {
{ if (PackData == NULL || BufferOut == NULL) {
if( PackData == NULL || BufferOut == NULL)
{
return ERROR_INPUT; return ERROR_INPUT;
} }
if(PackData[0] != 0x55 || PackData[1] != 0xAA) if (PackData[0] != 0x55 || PackData[1] != 0xAA) {
{
return ERROR_HEADER; return ERROR_HEADER;
} }
if(PackData[2] != Command) if (PackData[2] != Command) {
{
return ERROR_COMMAND; return ERROR_COMMAND;
} }
uint16_t LenthofOut = PackData[4] + (PackData[3] << 8)-2; uint16_t LenthofOut = PackData[4] + (PackData[3] << 8);
if(LenthofOut > LenthofIn - 7) if (LenthofOut > LenthofIn - 7) {
{
return ERROR_NOT_ENOUGH_DATA; return ERROR_NOT_ENOUGH_DATA;
} }
uint16_t CRC = IRIS_calcCRC(PackData+3, LenthofOut+2); if (PackData[LenthofOut + 6] == 0xEE && PackData[LenthofOut + 5] == 0xEE) {
if(CRC != (PackData[LenthofOut+6] + (PackData[LenthofOut+5] << 8)))
{ } else {
return ERROR_CRC; uint16_t CRC = IRIS_calcCRC(PackData + 5, LenthofOut);
if (CRC != (PackData[LenthofOut + 6] + (PackData[LenthofOut + 5] << 8))) {
return ERROR_CRC;
}
} }
if(LenthofOut == 0) if (LenthofOut == 0) {
{
return 0; return 0;
} }
memcpy(BufferOut,&PackData[5],LenthofOut); memcpy(BufferOut, &PackData[5], LenthofOut);
return LenthofOut; return LenthofOut;
} }
int32_t IRIS_Cut_Befor_Header(uint8_t *PackData, uint16_t LenthofIn ) int32_t IRIS_Cut_Befor_Header(uint8_t *PackData, uint16_t LenthofIn) {
{ if (PackData == NULL) {
if( PackData == NULL )
{
return ERROR_INPUT; return ERROR_INPUT;
} }
uint16_t i = 0; uint16_t i = 0;
for(i = 0; i < LenthofIn; i++) for (i = 0; i < LenthofIn; i++) {
{ if (PackData[i] == 0x55 && PackData[i + 1] == 0xAA) {
if(PackData[i] == 0x55 && PackData[i+1] == 0xAA)
{
break; break;
} }
} }
if(i == LenthofIn) if (i == LenthofIn) {
{
//清空数据 //清空数据
memset(PackData,0,LenthofIn); memset(PackData, 0, LenthofIn);
return 0; return 0;
} }
uint16_t LenthofOut = LenthofIn - i; uint16_t LenthofOut = LenthofIn - i;
memcpy(PackData,&PackData[i],LenthofOut); memcpy(PackData, &PackData[i], LenthofOut);
return LenthofOut; return LenthofOut;
} }
int32_t IRIS_Check_Data_Valid(uint8_t *PackData, uint16_t LenthofIn) int32_t IRIS_Check_Data_Valid(uint8_t *PackData, uint16_t LenthofIn) {
{ if (PackData == NULL) {
if( PackData == NULL)
{
return ERROR_INPUT; return ERROR_INPUT;
} }
if (LenthofIn < 7) if (LenthofIn < 7) {
{
return ERROR_NOT_ENOUGH_DATA; return ERROR_NOT_ENOUGH_DATA;
/* code */ /* code */
} }
if(PackData[0] != 0x55 || PackData[1] != 0xAA) if (PackData[0] != 0x55 || PackData[1] != 0xAA) {
{
return ERROR_HEADER; return ERROR_HEADER;
} }
uint16_t LenthofOut = PackData[4] + (PackData[3] << 8)-2; uint16_t LenthofOut = PackData[4] + (PackData[3] << 8);
if(LenthofOut > LenthofIn - 7) if (LenthofOut > LenthofIn - 7) {
{
return ERROR_NOT_ENOUGH_DATA; return ERROR_NOT_ENOUGH_DATA;
} }
uint16_t CRC = IRIS_calcCRC(PackData+3, LenthofOut+2); if (PackData[LenthofOut + 6] == 0xEE && PackData[LenthofOut + 5] == 0xEE) {
if(CRC != (PackData[LenthofOut+6] + (PackData[LenthofOut+5] << 8)))
{ } else {
return ERROR_CRC; uint16_t CRC = IRIS_calcCRC(PackData + 5, LenthofOut);
if (CRC != (PackData[LenthofOut + 6] + (PackData[LenthofOut + 5] << 8))) {
return ERROR_CRC;
}
} }
return 1; return 1;
} }
uint16_t IRIS_calcCRC(const void *pBuffer, uint16_t bufferSize) {
const uint8_t *pBytesArray = (const uint8_t *) pBuffer;
uint16_t IRIS_calcCRC(const void *pBuffer, uint16_t bufferSize)
{
const uint8_t *pBytesArray = (const uint8_t*)pBuffer;
uint16_t poly = 0x8408; uint16_t poly = 0x8408;
uint16_t crc = 0; uint16_t crc = 0;
uint8_t carry; uint8_t carry;
uint8_t i_bits; uint8_t i_bits;
uint16_t j; uint16_t j;
for (j =0; j < bufferSize; j++) for (j = 0; j < bufferSize; j++) {
{
crc = crc ^ pBytesArray[j]; crc = crc ^ pBytesArray[j];
for (i_bits = 0; i_bits < 8; i_bits++) for (i_bits = 0; i_bits < 8; i_bits++) {
{
carry = crc & 1; carry = crc & 1;
crc = crc / 2; crc = crc / 2;
if (carry) if (carry) {
{ crc = crc ^ poly;
crc = crc^poly;
} }
} }
} }