QT 通信之 QByteArray

QT上位机的串口通信发送和接收数据都需要用到QByteArray

.QByteArray存储的是char型字符,但QByteArray提供的数组操作,比char更方便。

这篇文章主要讲一下QByteArray在实际应用中的一些函数,

以及QBbyteArray在串口通信中发送的数据的形式。

1.初始化

QByteArray senddata(16,0)//建立一个长度为16字节,初始值为0的字节数组

2.读和写

QByteArray senddata;
senddata.resize(6);
senddata[0] = 0x3c;
senddata[1] = 0xb8;
senddata[2] = 0x64;
senddata[3] = 0x18;
senddata[4] = 0xca;
senddata.data()[5] = 0x31;
qDebug()<<"[]"<

QByteArray的读写方式有4种:为[],at[],data[],constData[]。其中at()和constData[]仅为可读。[]和data[]为可读可写。

如果想要一次读取多个字节,使用left(),right(),mid()。

  QByteArray x("Pineapple");
  QByteArray y = x.right(5);
  >> y == "apple"
  QByteArray x("Pineapple");
  QByteArray y = x.left(4);
  >> y == "Pine"

3.添加,删除,插入和替换

QByteArray类提供了修改字节数组内容的函数:append(),prepend,insert,replace和remove。

    QByteArray x("and");
    x.prepend("rock ");         // x == "rock and"  前置
    x.append(" roll");          // x == "rock and roll" 附加
    x.replace(5, 3, "&");       // x == "rock & roll" 替代

4.转换数据类型

从串口把数据读到QByteArray字节数组里面,在处理数据时需要把数据转换成其他类型,

1)转为HEX,用于显示十六进制,这点在调试时特别有用,因为大多HEX码是没有字符显示的,如0x00、0x20等等;

2)转为不同进制数值并显示,如二进制、八进制、十进制和十六进制等;

3)转为整型、浮点型等数值类型;

4)大小写转换;

5)转为字符串类型;

4.1  把hex转化为char赋给QByteArray

QByteArray text = QByteArray::fromHex("517420697320677265617421");
text.data();            // returns "Qt is great!"

 把QByteArray转化为hex字符串(本质上还是字符串)

    QByteArray ba;
    ba.resize(3);
    ba[0] = 0x30;
    ba[1] = 0x31;
    ba[2] = 0x32;
    qDebug() << ba.toHex(); //return "303132"

4.2 QByteArray储存的是纯数值时,可用to**()函数转化为其他数据类型:

QByteArray strInt("1234");
bool ok0;
qDebug() << strInt.toInt();   // return 1234
qDebug() << strInt.toInt(&ok0,16);   // return 4660, 默认把strInt作为16进制的1234,对应十进制数值为4660
 
QByteArray string("1234.56");
bool ok1;
qDebug() << string.toInt();   // return 0, 小数均视为0
qDebug() << string.toInt(&ok1,16);   // return 0, 小数均视为0
qDebug() << string.toFloat();   // return 1234.56
qDebug() << string.toDouble();   // return 1234.56
 
QByteArray str("FF");
bool ok2;
qDebug() << str.toInt(&ok2, 16);     // return 255, ok2 == true
qDebug() << str.toInt(&ok2, 10);     // return 0, ok == false, 转为十进制失败

4.3  QByteArray于QString相互转化

1.QByteArray提供一个字节数组,QByteArray可用于存储原始二进制字节(包括“\ 0” )和传统的8-bits的“\ 0” 端接字符串 . 使用QByteArray比使用const char *更方便。一般在需要传输原始数据和内存资源短缺时使用。

2.QString转Qchar时,需要经过 QByteArray,不能用下面的转换形式char *data = str.toLatin1().data();因为这样的话,str.toLatin1()得到的QByteArray类型结果就不能保存(切记!!!),正确用法如下:
 

    QByteArray ba("abc123");
    QString str = ba; //或str.prepend(ba);
    qDebug()<
QString str("abc123");
QByteArray ba = str.toLatin1();
qDebug()<

5.把浮点型数据通过串口发送出去,示例代码:

// float转16进制字符串
float f = 20.321;
uint f_uint = *(uint*)&f;
QString f_hex = QString("%1").arg(f_uint, 4, 16, QLatin1Char('0'));	// 4是生成字符串的最小长度,可以改为8
qDebug() << f_hex;	// "41a29168"
QByteArray senddata = f_hex.toLatin1();
qDebug()<

QByteArray类的一些成员函数

6.QByteArray在串口通信中发送的数据的形式

在学习过程中看到了一篇博客:

【串口通信】字符串发送与十六进制发送的区别_云说风轻的博客-CSDN博客_十六进制数和字符串在485上传输优缺点

在这篇博客里它这么写道:

我们要发送一串数据“A852010100000000A91A”,以字符串和十六进制两种方式发送:

QT 通信之 QByteArray_第1张图片

QT 通信之 QByteArray_第2张图片

看到这里我一下就悟了,

 在qt的串口通信中,QByteArray一直是以字符串的形式发送数据。之前以为可以以十六进制发送(后来发现好像不可以)。

这里尝试以十进制字符串发送出去,但是会乱码(不知道为啥,),所以转化成十六进制字符串发送

QT 通信之 QByteArray_第3张图片

这里讲一下以十六进制接收数据:字符串会一位一位的以ascll码发送出去,然后上位机会将每一个ascll码转化成十六进制打印出来。

你可能感兴趣的:(qt,c++)