Qt加树莓派读取ds18b20温度传感器的值

一:DS18B20文件读取参考资料html

二:DS18B20编程思路linux

在linux下一切皆文件,DS18B20固然也不例外,因此在树莓派上编写ds18b20只需想办法读出ds18b20所对应的文件就能够了。编程

1,每一个ds18b20所对应的文件名都不同,想要读取文件内容,首先需肯定文件名。app

解决方案:在Qt下,进入DS18b20所在文件父目录,遍历整个文件名,找到ds18b20对应的文件,在进入子目录,打开对应的文件,读取对应的数据。函数

三:所用到的主要函数this

1, 获得对应目录下的全部文件列表spa

   //设置ds18b20的文件所在位置
    QDir tempPath("/sys/bus/w1/devices/");
    //获得全部的文件列表
    QStringList fileList=tempPath.entryList();
.net

2,根据字符定位在字符串中的函数orm

QString str="123";htm

str.indexOf('2'); 返回值为1

3,字符内容截取函数

QString str="123";

QString s=str.mid(1,1);

截取内容为:s=2;

4,判断字符串中是否包含某个字符串

QString str="asdf";

str.contains("a");  //返回结果为真

三:程序源码

temperatureMeasurement()
{
    //加载单总线DS18b20所需的模块
    system("sudo modprobe w1-gpio");
    system("sudo modprobe w1-therm");

    QString tempFile="/sys/bus/w1/devices/"; //ds18b20文件路径
    QString tempData;  //读出的ds18b20的温度

    //设置ds18b20的文件所在位置
    QDir tempPath("/sys/bus/w1/devices/");

    //获得全部的文件列表
    QStringList fileList=tempPath.entryList();

    //遍历全部文件,找到关于ds18b20的文件
    int i=0;
    while(i<fileList.size())
    {
        if(fileList.at(i).contains("28-"))
        {
            tempFile.append(fileList.at(i));  //已经找到了文件
            break;
        }
        i++;
    }

    //打开ds18b20d的温度存储文件
    tempFile.append("/w1_slave");
    QFile file(tempFile);
    if(!file.open(QIODevice::ReadOnly|QFile::Text))
    {
        QMessageBox::information(this,tr("温度测量"),tr("请检测温度传感器是否有问题!"));
        return;
    }
    QTextStream in(&file);

    //根据存储的文件找到须要的数据
    QString str=in.readAll(); //读出全部内容
    tempData=str.mid(str.indexOf('t')+2,3); //定位数据的位置,找到所须要的数据,精度能够达到小数点后三位,本程序只    需一位
    file.close();
}

注意:驱动程序写死了单总线引脚的定义,须要修改的话,只能修改内核代码