ds18b20crc校验
时间: 2024-08-13 19:04:57 浏览: 92
DS18B20是一种常用的数字温度传感器,它包含了自校验功能,其中的CRC(循环冗余检验)是为了验证数据传输的准确性。CRC校验是通过计算发送数据的一个固定长度的校验码,接收端再重新计算这个校验码,如果两者匹配,则说明数据在传输过程中没有错误。
具体步骤如下:
1. **数据发送**:DS18B20会生成包含温度读数的数据包,同时附加一个CRC校验码。
2. **CRC计算**:在发送前,使用特定的算法(如8位CRC-16)对数据进行处理,生成一个16位的校验码,它是数据的一部分。
3. **数据传输**:数据包包括温度读数和CRC校验码一起发送。
4. **接收数据**:接收端接收到数据后,再次计算CRC校验码。
5. **比较校验**:接收端的计算结果与接收到的CRC校验码对比,若一致则确认数据正确,否则认为数据可能在传输中出错。
相关问题
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校验码,然后将计算得到的校验码与接收到的校验码进行比对,如果相同则说明数据正确,否则说明数据出错。
DS18B20 CRC校验代码
以下是DS18B20温度传感器的CRC校验代码,可用于检查数据的完整性:
```c
#include <OneWire.h>
byte crc8(const byte *data, byte len) {
byte crc = 0x00;
while (len--) {
byte inbyte = *data++;
for (byte i = 8; i; i--) {
byte mix = (crc ^ inbyte) & 0x01;
crc >>= 1;
if (mix) {
crc ^= 0x8C;
}
inbyte >>= 1;
}
}
return crc;
}
OneWire ds(DS18B20_PIN);
void setup() {
Serial.begin(9600);
}
void loop() {
byte data[9];
ds.reset();
ds.select(TEMP_SENSOR_ADDR);
ds.write(0x44, 1);
delay(1000);
ds.reset();
ds.select(TEMP_SENSOR_ADDR);
ds.write(0xBE);
for (byte i = 0; i < 9; i++) {
data[i] = ds.read();
}
if (crc8(data, 8) == data[8]) {
int raw = (data[1] << 8) | data[0];
float celsius = (float)raw / 16.0;
Serial.print("Temperature: ");
Serial.print(celsius);
Serial.println(" C");
} else {
Serial.println("Invalid CRC");
}
delay(1000);
}
```
其中 `TEMP_SENSOR_ADDR` 和 `DS18B20_PIN` 需要根据实际情况修改为你所使用的DS18B20的地址和引脚号。该代码使用了OneWire库来与DS18B20通信,通过读取传感器返回的9个字节数据,然后进行CRC校验,最后计算出温度值。如果校验失败,则输出 "Invalid CRC"。
阅读全文