1. CRC计算函数
int check_crc(uint8_t *data, uint8_t len)
{
uint8_t i = 0;
uint8_t bit = 0;
uint8_t crc = 0;
const uint8_t POLY = 0x31;
for(i = 0; i < len-1; i++)
// for(i = 0; i < 2; i++)
{
printf("%02x ", *(data+i));
crc ^= data[i];
for(bit = 0; bit < 8; bit++)
{
if (crc & 0x80)
crc = (crc << 1) ^ POLY;
else
crc = (crc << 1);
}
}
printf("verification successful, crc=%02x, rx_crc=%02x\n", crc, data[len-1]);
if(crc == data[len-1])
{
return 0;
}
return -1;
}
2. 温湿度换算公式
//温度转换25424 => 42.5 %RH
#define CONVERT_HUMI(value) ((float)(125 * (value) / 65536.0 - 6)) //%RH
//相对湿度转换
#define CONVERT_TEMP(value) ((float)(175.72 * (value) / 65536.0 - 46.85))//°C
3. 使用示例
int main(void)
{
uint8_t data[3];
int ret = 0;
data[0] = 0x7a;
data[1] = 0x2c;
data[2] = 0x2e;
ret = check_crc(data, 3);
printf("T=%.1f\n", CONVERT_TEMP(data[0] << 8 | data[1]));
data[0] = 0x8c;
data[1] = 0x5a;
data[2] = 0x32;
ret = check_crc(data, 3);
printf("RH=%.1f\n", CONVERT_HUMI(data[0] << 8 | data[1]));
system("pause");
return 0;
}
输出结果:
7a 2c verification successful, crc=2e, rx_crc=2e
T=37.0
8c 5a verification successful, crc=32, rx_crc=32
RH=62.5
请按任意键继续. . .