ds18b20crc校验
时间: 2024-08-13 15:04:57 浏览: 103
DS18B20是一种常用的数字温度传感器,它包含了自校验功能,其中的CRC(循环冗余检验)是为了验证数据传输的准确性。CRC校验是通过计算发送数据的一个固定长度的校验码,接收端再重新计算这个校验码,如果两者匹配,则说明数据在传输过程中没有错误。
具体步骤如下:
1. **数据发送**:DS18B20会生成包含温度读数的数据包,同时附加一个CRC校验码。
2. **CRC计算**:在发送前,使用特定的算法(如8位CRC-16)对数据进行处理,生成一个16位的校验码,它是数据的一部分。
3. **数据传输**:数据包包括温度读数和CRC校验码一起发送。
4. **接收数据**:接收端接收到数据后,再次计算CRC校验码。
5. **比较校验**:接收端的计算结果与接收到的CRC校验码对比,若一致则确认数据正确,否则认为数据可能在传输中出错。
相关问题
DS18B20 CRC校验代码
以下是基于C语言的DS18B20 CRC校验代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <wiringPi.h>
#define DS18B20_PIN 7
int ds18b20_reset() {
int result;
pinMode(DS18B20_PIN, OUTPUT);
digitalWrite(DS18B20_PIN, LOW);
delayMicroseconds(480);
pinMode(DS18B20_PIN, INPUT);
delayMicroseconds(80);
result = digitalRead(DS18B20_PIN);
delayMicroseconds(400);
return result;
}
void ds18b20_write_bit(int bit) {
pinMode(DS18B20_PIN, OUTPUT);
digitalWrite(DS18B20_PIN, LOW);
if (bit) delayMicroseconds(6);
else delayMicroseconds(60);
pinMode(DS18B20_PIN, INPUT);
delayMicroseconds(10);
}
void ds18b20_write_byte(int byte) {
int i;
for (i = 0; i < 8; i++) {
ds18b20_write_bit(byte & 1);
byte >>= 1;
}
}
int ds18b20_read_bit() {
int result;
pinMode(DS18B20_PIN, OUTPUT);
digitalWrite(DS18B20_PIN, LOW);
delayMicroseconds(2);
pinMode(DS18B20_PIN, INPUT);
delayMicroseconds(10);
result = digitalRead(DS18B20_PIN);
delayMicroseconds(48);
return result;
}
int ds18b20_read_byte() {
int i, result = 0;
for (i = 0; i < 8; i++) {
result >>= 1;
if (ds18b20_read_bit()) result |= 0x80;
}
return result;
}
int ds18b20_crc_check(unsigned char *data, int len) {
int i, j, crc = 0;
for (i = 0; i < len; i++) {
crc ^= data[i];
for (j = 0; j < 8; j++) {
if (crc & 0x01) {
crc = (crc >> 1) ^ 0x8C;
} else {
crc >>= 1;
}
}
}
return crc;
}
float ds18b20_read_temperature() {
unsigned char data[9];
int temperature_l, temperature_h, crc;
float temperature;
ds18b20_reset();
ds18b20_write_byte(0xcc);
ds18b20_write_byte(0x44);
delay(800);
ds18b20_reset();
ds18b20_write_byte(0xcc);
ds18b20_write_byte(0xbe);
data[0] = ds18b20_read_byte();
data[1] = ds18b20_read_byte();
data[2] = ds18b20_read_byte();
data[3] = ds18b20_read_byte();
data[4] = ds18b20_read_byte();
data[5] = ds18b20_read_byte();
data[6] = ds18b20_read_byte();
data[7] = ds18b20_read_byte();
data[8] = ds18b20_read_byte();
temperature_l = data[0];
temperature_h = data[1];
crc = ds18b20_crc_check(data, 8);
if (crc != data[8]) {
printf("CRC error!\n");
return -1.0;
}
temperature = (temperature_h << 8) + temperature_l;
temperature *= 0.0625;
return temperature;
}
int main(int argc, char **argv) {
float temperature;
wiringPiSetup();
temperature = ds18b20_read_temperature();
printf("Temperature: %.2f Celsius\n", temperature);
return 0;
}
```
其中,ds18b20_crc_check() 函数用于计算CRC校验码,ds18b20_read_temperature() 函数读取温度数据和CRC校验码,并进行校验。在读取完数据和CRC校验码后,使用 ds18b20_crc_check() 函数计算CRC校验码,并与读取到的校验码进行比较,以判断读取的数据是否准确。如果CRC校验码不正确,则说明读取的数据存在错误。
需要注意的是,CRC校验码的计算方法是按位异或运算,具体细节可以参考DS18B20的数据手册。
ds18b20 crc校验原理
DS18B20是一种数字温度传感器,它的通信协议中包含了CRC校验。CRC校验是一种根据数据内容计算校验码并与接收到的校验码比对来判断数据是否正确的方法。
DS18B20的CRC校验使用的是16位CRC校验,其计算方法如下:
1. 将要校验的数据和初始值0x0000进行异或运算,得到新的16位值。
2. 将上一步得到的16位值的最低位与1进行异或运算,如果结果为1,则将该16位值右移一位,再与0xA001进行异或运算;如果结果为0,则将该16位值右移一位,不进行异或运算。
3. 重复上一步操作,直到该16位值右移8次,最终得到的值即为CRC校验码。
在DS18B20通信协议中,传输的数据包括温度值和CRC校验码,接收端在收到数据后会根据上述方法计算接收到的数据的CRC校验码,然后将计算得到的校验码与接收到的校验码进行比对,如果相同则说明数据正确,否则说明数据出错。
阅读全文