diff --git a/library/common/common.c b/library/common/common.c index af02486..bb30ae3 100644 --- a/library/common/common.c +++ b/library/common/common.c @@ -103,4 +103,29 @@ char *Rd_GetBuildTime(void) snprintf(g_sBuildTime, sizeof(g_sBuildTime), "%s build [%s %s]", RD_VERSION, __DATE__, __TIME__); #endif return g_sBuildTime; -} \ No newline at end of file +} + +uint16_t Rd_modbusCRC16(char *data, uint8_t length) +{ + uint16_t crc = 0xFFFF; + + for (uint8_t i = 0; i < length; i++) + { + crc ^= (uint16_t)data[i]; + + for (uint8_t j = 0; j < 8; j++) + { + if ((crc & 0x0001) != 0) + { + crc >>= 1; + crc ^= 0xA001; + } + else + { + crc >>= 1; + } + } + } + + return crc; +} diff --git a/library/common/include/common.h b/library/common/include/common.h index 41a96bf..b69d6fc 100644 --- a/library/common/include/common.h +++ b/library/common/include/common.h @@ -158,6 +158,7 @@ int Rd_Array2String(char *_pRes, int _iLen, char *_pSrc[], int _iNum, char *_Ptr int Rd_FileExists(const char *_psPath); int Rd_RegularFileExists(const char *_psPath); char *Rd_GetBuildTime(void); +uint16_t Rd_modbusCRC16(char *data, uint8_t length); #ifdef BUILD_LOG extern void Rd_ElogEnableStrong(void);