首页 > 系统相关 >QT 应用程序执行 Linux 指令,以操作 I2c tools 读写举例

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

时间:2022-11-16 14:56:22浏览次数:65  
标签:case DO QT uint8 else break Linux I2c data

头文件:

#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"; //获取地址为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

 

标签:case,DO,QT,uint8,else,break,Linux,I2c,data
From: https://www.cnblogs.com/xingboy/p/16895904.html

相关文章

  • Linux下进程间通信方式之管道、信号、共享内存、消息队列、信号量、套接字
    /*1,进程间通信(IPC)Inter-ProcessCommunication比较好理解概念的就是进程间通信就是在不同进程之间传播或交换信息。2,linux下IPC机制的分类:管道、信号、共享内存、......
  • linux FHS(Filesystem Hierarchy Standard)结构
    Linux的哲学思想是一切皆是文件1、Linux文件系统的层次结构如下图所示:  下面将会对文件进行解释:bin普通用户的二进制可执行命令sbin管理员用户使用的工具程序的......
  • OpenHarmony开发之MQTT讲解
     相信MQTT这个名称大家都不陌生,物联网的开发必然会遇到MQTT相关知识的应用。那么什么是MQTT?它有什么特点?它能解决什么问题?它是如何工作的?OpenAtomOpenHarmony(以下简......
  • Linux centos 在线|离线安装依赖
    离线安装yuminstall--downloadonly--downloaddir=/home/fileszlib-develbzip2-developenssl-develncurses-develepel-releasegccgcc-c++xz-develreadline-de......
  • 嵌入式Linux单板连接飞燕物联网平台
    大家好,我是杂烩君。最近,我们的设备连接的云平台需要切到阿里的飞燕平台,做个笔记记录下。阿里的物联网平台有好几个:物联网平台生活物联网平台(飞燕平台)城市物联网平台它们的应......
  • Linux中ifconfig命令的使用
    1、安装ifconfig找不到,发现ifconfig命令在net-tools里面yumsearchifconfigyuminstallnet-tools 安装net-tools  通过whatis命令显示简单描述[root@rocky9......
  • Qt中openssl配置,提示OPENSSL_Applink错误(程序异常退出错误)
    首先在QTcreater创建的QT工程中配置静态库和头文件1、LIBS+=-L"E:\OpenSSL-Win32\lib"-llibcryptoLIBS+=-L"E:\OpenSSL-Win32\lib"-llibsslINCLUDEPATH+=$$quote......
  • Linux下Socket编程(转)
    什么是SocketSocket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。要学Internet上的TCP/IP网络编程,必须理解So......
  • Linux 下Socket编程基础(转)
    1、 引言Linux的兴起可以说是Internet创造的一个奇迹。Linux作为一个完全开放其原代码的免费的自由软件,兼容了各种UNIX标准(如POSIX、UNIX System V 和 BSD UNIX ......
  • Linux工作记录
    系统信息whoami:查看当前使用的终端who或w:查看所有终端uname-m:显示机器的处理器架构(如x86_64)cat/proc/version:查看linux版本信息uname-r:显示正在使用的......