Qt网络/串口通信开发:QByteArray 数据类型转换方法解析

QByteArray

在Qt实现上位机实现串口和网口通信,不论是写入的数据,亦或是读到的数据,都是使用QByteArray这个字节数组类 进行交互的;本质上QByteArray底层存储的是原始的字节数据(char*)。

cpp 复制代码
/*串口收发*/
QByteArray readdata=m_serialport->readAll();//读取串口收到的数据

QByteArray writedata;
m_serialport->write(data);//电脑向串口写入的数据

/*UDP网口接收*/
void Server::readPendingDatagrams()
  {
      while (udpSocket->hasPendingDatagrams()) {
          QByteArray datagram = udpSocket->receiveDatagram();
          processTheDatagram(datagram);
      }
  }

QByteArray 作为字符串时

当QByteArray包含的是可打印字符时,Qt提供了便捷的接口让它表现得像字符串:

cpp 复制代码
QByteArray strData = "Hello";  // 自动转换为字节数组
// 内存中:{'H', 'e', 'l', 'l', 'o', '\0'}
qDebug() << strData;  // 输出: "Hello"

/*
1.使用特定的字符编码(默认UTF-8)
2.自动处理空终止符
3.支持字符串操作(split()、replace()等)
*/

QByteArray text = "你好";  // UTF-8编码
// 实际存储:{0xE4, 0xBD, 0xA0, 0xE5, 0xA5, 0xBD}

QByteArray 作为二进制数据时

cpp 复制代码
QByteArray binaryData;
binaryData.append(0x00);
binaryData.append(0xFF);
binaryData.append(0x1A);
// 内存中:{0x00, 0xFF, 0x1A}

/*
1.不关心编码,直接操作字节
2.可以包含任意值(包括0x00)
3.用于协议数据、文件内容等
*/

// 从文件读取二进制数据
QFile file("image.jpg");
file.open(QIODevice::ReadOnly);
QByteArray imageData = file.readAll();  // 纯字节数据

QByteArray常见数据转换

cpp 复制代码
// QByteArray 与 QString 之间的互相转换
QByteArray ba1 = QString("text").toUtf8();
QString str = QString::fromUtf8(ba1);
例子1 频谱仪回传数据
cpp 复制代码
//频谱仪回传的"-68dB",在Qt中你首先收到的是包含"-68\n"的QByteArray,你需要将其转换为QString,再转换为double型数值来使用。
// 1. 发送查询指令
QString command = ":FETCh:POW?\n";
socket->write(command.toUtf8());

// 2. 接收数据(通常在 readyRead 信号连接的槽函数中)
QByteArray rawData = socket->readAll();
// 假设 rawData 现在是 "-68.15\n"

// 3. 转换为 QString 以便于处理(去除首尾空白和换行符)
QString response = QString::fromUtf8(rawData).trimmed();
// 现在 response 是 "-68.15"

// 4. 转换为所需的数值类型
bool ok;
double powerValue = response.toDouble(&ok); // 核心转换步骤
if (ok) {
    // 转换成功,使用 powerValue (-68.15) 进行后续处理
    qDebug() << "读取到的功率值:" << powerValue << "dBm";
} else {
    // 转换失败,处理错误(可能是数据格式异常)
    qDebug() << "数据转换失败,接收到的字符串为:" << response;
} 

/*
1.始终从 QByteArray 开始思考:你收到的第一手资料就是它。
2.明确你的SCPI指令:不同的指令返回格式差异巨大。查询手册,看它是返回ASCII数值、字符串还是二进制块。
3.对于数值查询(如功率、频率):遵循 QByteArray -> QString -> double/int 的标准流程。
4.对于波形/轨迹数据:准备好处理二进制块格式,这需要根据手册精确解析数据头和解包二进制数据。
5.错误处理:总是检查 toDouble()、toInt() 的返回值,并处理不完整的读取(数据可能分多次到达)。使用 waitForReadyRead() 或确保在槽函数中读取所有可用数据。
*/
相关推荐
Monly213 分钟前
Java:修改打包配置文件
java·开发语言
我命由我1234524 分钟前
Android 广播 - 静态注册与动态注册对广播接收器实例创建的影响
android·java·开发语言·java-ee·android studio·android-studio·android runtime
island131433 分钟前
CANN ops-nn 算子库深度解析:核心算子(如激活函数、归一化)的数值精度控制与内存高效实现
开发语言·人工智能·神经网络
xcLeigh42 分钟前
Python入门:Python3 requests模块全面学习教程
开发语言·python·学习·模块·python3·requests
xcLeigh42 分钟前
Python入门:Python3 statistics模块全面学习教程
开发语言·python·学习·模块·python3·statistics
秋邱1 小时前
用 Python 写出 C++ 的性能?用CANN中PyPTO 算子开发硬核上手指南
开发语言·c++·python
wenzhangli72 小时前
ooderA2UI BridgeCode 深度解析:从设计原理到 Trae Solo Skill 实践
java·开发语言·人工智能·开源
灵感菇_2 小时前
Java 锁机制全面解析
java·开发语言
wazmlp0018873692 小时前
python第三次作业
开发语言·python
娇娇乔木2 小时前
模块十一--接口/抽象方法/多态--尚硅谷Javase笔记总结
java·开发语言