本文介绍Qt读写sysfs。
在嵌入式Linux系统上开发Qt应用程序,经常会涉及到外设的控制,比如GPIO,PWM的控制,Linux环境下可以像操作文件一样操作它们,这通常会涉及到sysfs的读写。本文以读写GPIO为例,简要介绍下如何使用Qt读写sysfs。
1.配置
Linux命令行指令(这里导出gpio5):
echo 5 > /sys/class/gpio/export
在Qt应用程序中,可以启动一个进程来执行上述指令,参考代码如下:
void exportIo(int pinNumber)
{
QProcess process;
process.start("/bin/sh", QStringList() << "./export_io.sh" << QString::number(pinNumber));
process.waitForFinished();
process.close();
}
void unexportIo(int pinNumber)
{
QProcess process;
process.start("/bin/sh", QStringList() << "./unexport_io.sh" << QString::number(pinNumber));
process.waitForFinished();
process.close();
}
对应脚本:
export_io.sh:
#!/bin/sh
echo $1 > /sys/class/gpio/export
unexport_io.sh:
#!/bin/sh
echo $1 > /sys/class/gpio/unexport
2.写sysfs
Linux命令行指令(这里对gpio5写1):
echo 1 > /sys/class/gpio/gpio5/value
参考代码如下:
void writeIo(int pinNumber, int value)
{
QProcess process;
process.start("/bin/sh", QStringList() << "./write_io.sh" << QString::number(pinNumber) << QString::number(value));
process.waitForFinished();
process.close();
}
对应脚本:
write_io.sh:
#!/bin/sh
echo $2 > /sys/class/gpio/gpio$1/value
3.读sysfs
Linux命令行指令:
cat /sys/class/gpio/gpio5/value
参考代码如下:
int readIo(int pinNumber)
{
QProcess process;
int value = 0;
process.start("/bin/sh", QStringList() << "./read_io.sh" << QString::number(pinNumber));
process.waitForFinished();
value = process.readAll().trimmed().toInt();
process.close();
return value;
}
对应脚本:
read_io.sh:
#!/bin/sh
cat /sys/class/gpio/gpio$1/value
这里是阻塞的方式执行的。如果读时间较长,也可以绑定finish信号,参考代码如下:
QProcess *process = new QProcess(this);
connect(process, &QProcess::finished, this, &MainWindow::read);
void MainWindow::read(int exitCode, QProcess::ExitStatus exitStatus)
{
}
注意:
不同的嵌入式Linux环境下外设的sysfs的路径和操作方法可能不一样,需根据实际情况修改。
总结,本文介绍了Qt读写sysfs。