ds18b20 的crc校验程序
时间: 2024-08-16 10:09:17 浏览: 50
DS18B20是一种常用的数字温度传感器,它包含了自身的数据通信协议,其中包括CRC (循环冗余检查) 校验机制用于检测数据传输过程中的错误。CRC校验程序通常会生成一个校验值,发送前附加上数据包,接收端再计算新的CRC值并与接收到的数据一起计算,如果两者一致,则认为数据完整无误。
编写DS18B20的CRC校验程序一般需要以下几个步骤:
1. **获取原始数据**:从传感器读取测量结果数据,包括温度、标识符等信息。
2. **添加固定字节**:在数据后面附加固定的CRC校验位数,比如8位或16位,这取决于DS18B20的具体设置。
3. **生成校验码**:使用特定的CRC算法(如CRC-8或CRC-16),将原始数据加上预设的初始值进行计算,得到校验值。
4. **计算接收端校验**:对于接收到的数据,同样按照上述步骤进行CRC计算。
5. **比较校验码**:如果接收端计算出的校验值与发送端一致,说明数据传输成功;如果不一致,可能存在数据损坏或传输错误。
相关问题
ds18b20crc校验
DS18B20是一种常用的数字温度传感器,它包含了自校验功能,其中的CRC(循环冗余检验)是为了验证数据传输的准确性。CRC校验是通过计算发送数据的一个固定长度的校验码,接收端再重新计算这个校验码,如果两者匹配,则说明数据在传输过程中没有错误。
具体步骤如下:
1. **数据发送**:DS18B20会生成包含温度读数的数据包,同时附加一个CRC校验码。
2. **CRC计算**:在发送前,使用特定的算法(如8位CRC-16)对数据进行处理,生成一个16位的校验码,它是数据的一部分。
3. **数据传输**:数据包包括温度读数和CRC校验码一起发送。
4. **接收数据**:接收端接收到数据后,再次计算CRC校验码。
5. **比较校验**:接收端的计算结果与接收到的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"。
阅读全文