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一直是以字符串的形式发送数据。之前以为可以以十六进制发送(后来发现好像不可以)。
这里尝试以十进制字符串发送出去,但是会乱码(不知道为啥,),所以转化成十六进制字符串发送
这里讲一下以十六进制接收数据:字符串会一位一位的以ascll码发送出去,然后上位机会将每一个ascll码转化成十六进制打印出来。