From 2c03d0ecf531be81a48adebd0c9e42f6026d0c93 Mon Sep 17 00:00:00 2001 From: xin Date: Fri, 14 Jun 2024 11:47:35 +0800 Subject: [PATCH] =?UTF-8?q?+5=20=E6=94=B9=E6=88=90+2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Readme.md | 4 +- src/IRIS_Method.c | 167 ++++++++++++++++++++-------------------------- 2 files changed, 75 insertions(+), 96 deletions(-) diff --git a/Readme.md b/Readme.md index c0ffeeb..a81ce61 100644 --- a/Readme.md +++ b/Readme.md @@ -11,8 +11,8 @@ - 0x01: 命令为字符串 即Data要转换为字符串 - 0x00: 命令为json数据,应用json解析Data - 0x02-0xff:自定义二进制通讯数据,Data的解析应改按照Communication_Protocol中约定进行 -- **长度**:Data+Check的总字节数 -- **Check**:长度+Data的 CRC校验 算法在Communication_Protocol提供了(如果Data过长,光谱数据,可以不计算,但是得提供,此时提供内容为0xEE 0xEE) +- **长度**:Data的长度 +- **Check**:Data的 CRC校验 算法在Communication_Protocol提供了(如果Data过长,光谱数据,可以不计算,但是得提供,此时提供内容为0xEE 0xEE) - **均采用小端方式存储** diff --git a/src/IRIS_Method.c b/src/IRIS_Method.c index b623ea4..20e853f 100644 --- a/src/IRIS_Method.c +++ b/src/IRIS_Method.c @@ -12,181 +12,160 @@ // Created by xin on 2024/2/1. // #include "IRIS_Method.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)) - { + +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 datalenth = LenthofIn; + PackData[3] = (datalenth >> 8) & 0xFF; + PackData[4] = datalenth & 0xFF; + + if (LenthofIn != 0) { + memcpy(&PackData[5], BufferIn, LenthofIn); } - uint16_t CRC = IRIS_calcCRC(PackData+3, LenthofIn+5); - PackData[LenthofIn+5] = CRC & 0xFF; - PackData[LenthofIn+6] = (CRC >> 8) & 0xFF; - return LenthofIn+7; - - - - + uint16_t crcbytelenth = LenthofIn; + uint16_t CRC = IRIS_calcCRC(PackData + 5, crcbytelenth); + PackData[LenthofIn + 5] = (CRC >> 8) & 0xFF; + 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; } - if(PackData[0] != 0x55 || PackData[1] != 0xAA) - { + if (PackData[0] != 0x55 || PackData[1] != 0xAA) { return ERROR_HEADER; } - uint16_t LenthofOut = PackData[4] + (PackData[3] << 8)-2; - if(LenthofOut > LenthofIn - 7) - { + uint16_t LenthofOut = PackData[4] + (PackData[3] << 8); //减去CRC的两个字节 + if (LenthofOut > LenthofIn - 7) { return ERROR_NOT_ENOUGH_DATA; } - uint16_t CRC = IRIS_calcCRC(PackData+3, LenthofOut+2); - if(CRC != (PackData[LenthofOut+6] + (PackData[LenthofOut+5] << 8))) - { - return ERROR_CRC; + + if (PackData[LenthofOut + 6] == 0xEE && PackData[LenthofOut + 5] == 0xEE) { + + } 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; } - *Command=PackData[2] ; + *Command = PackData[2]; - memcpy(BufferOut,&PackData[5],LenthofOut); + memcpy(BufferOut, &PackData[5], LenthofOut); return LenthofOut; } -int32_t IRIS_Protocol_Unpack(uint8_t *PackData, uint16_t LenthofIn, uint8_t Command, uint8_t *BufferOut) -{ - if( PackData == NULL || BufferOut == NULL) - { +int32_t IRIS_Protocol_Unpack(uint8_t *PackData, uint16_t LenthofIn, uint8_t Command, uint8_t *BufferOut) { + if (PackData == NULL || BufferOut == NULL) { return ERROR_INPUT; } - if(PackData[0] != 0x55 || PackData[1] != 0xAA) - { + if (PackData[0] != 0x55 || PackData[1] != 0xAA) { return ERROR_HEADER; } - if(PackData[2] != Command) - { + if (PackData[2] != Command) { return ERROR_COMMAND; } - uint16_t LenthofOut = PackData[4] + (PackData[3] << 8)-2; - if(LenthofOut > LenthofIn - 7) - { + uint16_t LenthofOut = PackData[4] + (PackData[3] << 8); + if (LenthofOut > LenthofIn - 7) { return ERROR_NOT_ENOUGH_DATA; } - uint16_t CRC = IRIS_calcCRC(PackData+3, LenthofOut+2); - if(CRC != (PackData[LenthofOut+6] + (PackData[LenthofOut+5] << 8))) - { - return ERROR_CRC; + if (PackData[LenthofOut + 6] == 0xEE && PackData[LenthofOut + 5] == 0xEE) { + + } 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; } - memcpy(BufferOut,&PackData[5],LenthofOut); + memcpy(BufferOut, &PackData[5], LenthofOut); return LenthofOut; } -int32_t IRIS_Cut_Befor_Header(uint8_t *PackData, uint16_t LenthofIn ) -{ - if( PackData == NULL ) - { +int32_t IRIS_Cut_Befor_Header(uint8_t *PackData, uint16_t LenthofIn) { + if (PackData == NULL) { return ERROR_INPUT; } uint16_t i = 0; - for(i = 0; i < LenthofIn; i++) - { - if(PackData[i] == 0x55 && PackData[i+1] == 0xAA) - { + for (i = 0; i < LenthofIn; i++) { + if (PackData[i] == 0x55 && PackData[i + 1] == 0xAA) { break; } } - if(i == LenthofIn) - { + if (i == LenthofIn) { //清空数据 - memset(PackData,0,LenthofIn); + memset(PackData, 0, LenthofIn); return 0; } uint16_t LenthofOut = LenthofIn - i; - memcpy(PackData,&PackData[i],LenthofOut); + memcpy(PackData, &PackData[i], LenthofOut); return LenthofOut; } -int32_t IRIS_Check_Data_Valid(uint8_t *PackData, uint16_t LenthofIn) -{ - if( PackData == NULL) - { +int32_t IRIS_Check_Data_Valid(uint8_t *PackData, uint16_t LenthofIn) { + if (PackData == NULL) { return ERROR_INPUT; } - if (LenthofIn < 7) - { + if (LenthofIn < 7) { return ERROR_NOT_ENOUGH_DATA; /* code */ } - if(PackData[0] != 0x55 || PackData[1] != 0xAA) - { + if (PackData[0] != 0x55 || PackData[1] != 0xAA) { return ERROR_HEADER; } - uint16_t LenthofOut = PackData[4] + (PackData[3] << 8)-2; - if(LenthofOut > LenthofIn - 7) - { + uint16_t LenthofOut = PackData[4] + (PackData[3] << 8); + if (LenthofOut > LenthofIn - 7) { return ERROR_NOT_ENOUGH_DATA; } - uint16_t CRC = IRIS_calcCRC(PackData+3, LenthofOut+2); - if(CRC != (PackData[LenthofOut+6] + (PackData[LenthofOut+5] << 8))) - { - return ERROR_CRC; + if (PackData[LenthofOut + 6] == 0xEE && PackData[LenthofOut + 5] == 0xEE) { + + } else { + uint16_t CRC = IRIS_calcCRC(PackData + 5, LenthofOut); + if (CRC != (PackData[LenthofOut + 6] + (PackData[LenthofOut + 5] << 8))) { + return ERROR_CRC; + } } 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 crc = 0; uint8_t carry; uint8_t i_bits; uint16_t j; - for (j =0; j < bufferSize; j++) - { + for (j = 0; j < bufferSize; 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; crc = crc / 2; - if (carry) - { - crc = crc^poly; + if (carry) { + crc = crc ^ poly; } } }