QT 应用程序执行 Linux 指令,以操作 I2c tools 读写 I2C 和 SMBus 设备举例

头文件:

#include <string.h>
#include <QProcess>
#include <QDebug>
#include <QString>

写数据到 I2c :

void writeData(uint8_t data)
{
    QProcess p;  //声明
    //printf("Data = 0x%x \r\n",data);

    //把传入的数据拆分合并成字符串,例如数据 0xab ,拆分成字符串 “0xab”
    char dataH=data>>4;
    char dataL=data&0x0f;
    QString DO="0x"+hexToString(dataH)+hexToString(dataL);  //hexToString函数是为了方便理解,自己写的函数
    //qDebug()<<DO;  //输出打印

    QString Cmd = "i2cset -f -y 0 0x37 0x20 0xff"; //Linux 命令字符串,这里是使用 i2c-tools 设置7位地址为0x37的I2C设备中的0x20寄存器的值为 0xff 
    //qDebug()<<Cmd;
    p.start("bash",QStringList()<<"-c"<<Cmd);  //执行 Linux 命令
    p.waitForFinished(); //等待 Linux 命令执行完成

    QString Cmd1 = "i2cset -f -y 0 0x37 0x21 "+ DO; //Linux命令字符串整合
    //qDebug()<<Cmd1;
    p.start("bash",QStringList()<<"-c"<<Cmd1);
    p.waitForFinished();
}
QString hexToString(uint8_t data)
{
    QString DO;
    switch (data) {
        case 0:
            DO="0";  break;
        case 1:
            DO="1";  break;
        case 2:
            DO="2";  break;
        case 3:
            DO="3";  break;
        case 4:
            DO="4";  break;
        case 5:
            DO="5";  break;
        case 6:
            DO="6";  break;
        case 7:
            DO="7";  break;
        case 8:
            DO="8";  break;
        case 9:
            DO="9";  break;
        case 10:
            DO="a";  break;
        case 11:
            DO="b";  break;
        case 12:
            DO="c";  break;
        case 13:
            DO="d";  break;
        case 14:
            DO="e";  break;
        case 15:
            DO="f";  break;
    }
    return DO;
}

读取I2C数据:

uint8_t ioRead8(void)
{
    QProcess p;
    uint8_t IN=0;

    QString Cmd = "i2cset -f -y 0 0x37 0x20 0x00"; //写入值到I2C
    //qDebug()<<Cmd;
    p.start("bash",QStringList()<<"-c"<<Cmd);
    p.waitForFinished();

    QString Cmd1 = "i2cget -f -y 0 0x37 0x22"; //linux指令字符串,这里是实现获取地址为0x37的I2C设备的0x22寄存器的值
    //qDebug()<<Cmd1;
    p.start("bash",QStringList()<<"-c"<<Cmd1); //执行Linux指令
    p.waitForFinished(); //等待Linux指令执行完成

    QString result = p.readAllStandardOutput(); //把执行Linux指令后的字符串结果保存下来
    //qDebug()<<result;

    QString Data=result.mid(2,2); //从保存的指令结果字符串中的第2位起截取2个字符串保存,第一个2是截取起始位,第二个2是截取的长度,这里截取出来就是类似十六进制 ab 的字符串
    //qDebug()<<Data;
    QString dataH=Data.mid(0,1);
    QString dataL=Data.mid(1,1); //把十六进制 ab 字符串拆分成a、b两个字符串

    IN = (stringToHex(dataH)<<4) | stringToHex(dataL); // 把截取的十六进制字符串转换为16进制,stringToHex 函数是为了方便理解,自己写的函数
    //printf("Start IN = 0x%x \r\n",IN);

    return IN;
}
uint8_t stringToHex(QString data)
{
    uint8_t IN=0;
    if(data=="0") IN=0x00;
    else if(data=="1") IN=0x01;
    else if(data=="2") IN=0x02;
    else if(data=="3") IN=0x03;
    else if(data=="4") IN=0x04;
    else if(data=="5") IN=0x05;
    else if(data=="6") IN=0x06;
    else if(data=="7") IN=0x07;
    else if(data=="8") IN=0x08;
    else if(data=="9") IN=0x09;
    else if(data=="a") IN=0x0a;
    else if(data=="b") IN=0x0b;
    else if(data=="c") IN=0x0c;
    else if(data=="d") IN=0x0d;
    else if(data=="e") IN=0x0e;
    else if(data=="f") IN=0x0f;
    return IN;
}

注意:使用这些I2C工具时,你的Linux系统要先安装好 I2c-tools ,上面代码中用到的 I2C-Tools 的指令操作可以参考我另一篇博客 :https://www.cnblogs.com/xingboy/p/16889193.html

 

posted @ 2022-11-16 14:49  白菜没我白  阅读(483)  评论(0编辑  收藏  举报