二: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();
}
注意:驱动程序写死了单总线引脚的定义,须要修改的话,只能修改内核代码