头文件:
#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