怎么使用Qt获取板卡的gpio引脚号啊

小菜一枚,如题:怎么使用Qt获取板卡的gpio引脚号啊,试了好久都无法访问

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7638773
  • 这篇博客也不错, 你可以看下树莓派Qt开发入门(二):超声波测距和数码管显示实验——GPIO的读写操作+多线程编程
  • 除此之外, 这篇博客: 关于 Qt在海思平台使用脚本和文件控制GPIO口写入高低无效 的解决方法中的 解决方法 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • echo 24 > /sys/class/gpio/export 
    echo out > /sys/class/gpio/gpio24/direction
    // 新增的devmem,正是缺少这一条脚本指令
    devmem 0x1F000068 32 0X400
    // 拉低
    echo 0 > /sys/class/gpio/gpio24/value
    // 拉高
    echo 0 > /sys/class/gpio/gpio24/value
    

  • 您还可以看一下 安晓辉老师的Qt项目实战之网络电子白板课程中的 客户端与服务器联调之处理删除与清除消息小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    我可以尝试给出一个解决问题的方案。在Qt中,可以通过QFile访问Linux系统的文件系统,从而实现对板卡GPIO引脚的控制。具体实现步骤如下:

    1. 首先需要确定GPIO引脚的编号和方向,可以通过Linux系统下的/sys/class/gpio目录下的文件获取。例如,如果要访问GPIO24,需要先导出该引脚,创建/sys/class/gpio/gpio24目录,并且在该目录下创建direction文件和value文件,direction文件用来设置引脚的方向,value文件用来设置引脚的电平状态。导出GPIO24的命令如下:
    echo 24 > /sys/class/gpio/export
    
    1. 创建QFile对象并打开value文件,以读写模式打开文件,设置文件权限为WriteOnly。在打开文件之前需要先设置文件路径,路径格式为/sys/class/gpio/gpioX/value,其中X是GPIO引脚的编号。打开文件的代码如下:
    QString gpioPath = "/sys/class/gpio/gpio24/value";
    QFile gpioFile(gpioPath);
    if (!gpioFile.open(QIODevice::WriteOnly)) {
        qDebug() << "Failed to open gpio file.";
        return;
    }
    gpioFile.setPermissions(QFile::WriteUser);
    
    1. 向value文件中写入高低电平的值。如果要将GPIO24设置为高电平,可以在value文件中写入字符1,如果要将其设置为低电平,可以在value文件中写入字符0。写入的代码如下:
    gpioFile.write("1");
    
    1. 最后,关闭文件并且解除GPIO24的占用。关闭文件的代码如下:
    gpioFile.close();
    

    至此,向GPIO引脚写入高低电平的代码已经完成。请注意,在使用完GPIO引脚之后,需要将其解除占用,可以使用以下命令解除GPIO24的占用:

    echo 24 > /sys/class/gpio/unexport
    

    如果将以上步骤封装成一个函数,在调用该函数时可以传递GPIO编号和电平状态作为参数,并且在函数内部进行引脚的初始化、操作和释放,具体代码如下:

    void setGPIO(int gpioNum, bool value) {
        // 导出GPIO
        QString gpioExportPath = "/sys/class/gpio/export";
        QFile gpioExportFile(gpioExportPath);
        if (!gpioExportFile.open(QIODevice::WriteOnly)) {
            qDebug() << "Failed to export gpio " << gpioNum;
            return;
        }
        QByteArray gpioNumByteArray = QByteArray::number(gpioNum);
        gpioExportFile.write(gpioNumByteArray);
        gpioExportFile.close();
        // 设置引脚方向
        QString gpioDirectionPath = QString("/sys/class/gpio/gpio%1/direction").arg(gpioNum);
        QFile gpioDirectionFile(gpioDirectionPath);
        if (!gpioDirectionFile.open(QIODevice::WriteOnly)) {
            qDebug() << "Failed to set gpio " << gpioNum << " direction.";
            return;
        }
        gpioDirectionFile.write("out");
        gpioDirectionFile.close();
        // 设置引脚电平
        QString gpioValuePath = QString("/sys/class/gpio/gpio%1/value").arg(gpioNum);
        QFile gpioValueFile(gpioValuePath);
        if (!gpioValueFile.open(QIODevice::WriteOnly)) {
            qDebug() << "Failed to set gpio " << gpioNum << " value.";
            return;
        }
        gpioValueFile.setPermissions(QFile::WriteUser);
        if (value) {
            gpioValueFile.write("1");
        } else {
            gpioValueFile.write("0");
        }
        gpioValueFile.close();
        // 取消GPIO占用
        QString gpioUnexportPath = "/sys/class/gpio/unexport";
        QFile gpioUnexportFile(gpioUnexportPath);
        if (!gpioUnexportFile.open(QIODevice::WriteOnly)) {
            qDebug() << "Failed to unexport gpio " << gpioNum;
            return;
        }
        gpioUnexportFile.write(gpioNumByteArray);
        gpioUnexportFile.close();
    }
    

    在使用该函数的时候,可以传递GPIO引脚的编号和要设置的电平状态,例如:

    setGPIO(24, true);  // 设置GPIO24为高电平
    setGPIO(24, false); // 设置GPIO24为低电平
    

    请注意,在使用GPIO引脚的时候,需要特别小心,因为这些引脚与设备的硬件相关,不当操作可能会导致潜在的风险。如果您没有相关的经验和技能,请咨询专业人士或者放弃使用这些引脚。