头文件:

#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

 

原文地址:http://www.cnblogs.com/xingboy/p/16895904.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性