QT 通信之 QByteArray

2023-11-09

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()<<"[]"<<senddata[2]; //[] d
qDebug()<<"at()"<<senddata.at(2); //at() d
qDebug()<<"data()"<<senddata.data()[2]; //data() d
qDebug()<<"constData()"<<senddata.constData()[2]; //constData() d
qDebug()<<"constData()"<<senddata.constData()[5]; //constData() 1

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()<<str ;   //输出:"abc123"
QString str("abc123");
QByteArray ba = str.toLatin1();
qDebug()<<ba;  //输出:"abc123"

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()<<senddata;  //输出:"41a29168"


// 16进制字符串转float
QString hex_float = "41a29168";
uint hex_uint = hex_float.toUInt(nullptr, 16);
float hex_res = *(float*)&hex_uint;
qDebug() << hex_res;	// 20.321

// double转16进制字符串
double d = 20.321;
qulonglong d_long = *(qulonglong*)&d;
QString d_hex = QString("%1").arg(d_long, 8, 16, QLatin1Char('0'));
qDebug() << d_hex;	// "4034522d0e560419"

// 16进制字符串转double
QString hex_double = "4034522d0e560419";
qulonglong hex_long = hex_double.toULongLong(nullptr, 16);
double hex_d = *(double*)&hex_long;
qDebug() << hex_d;	// 20.321
   

 

QByteArray类的一些成员函数

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

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

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

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

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

看到这里我一下就悟了,

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT 通信之 QByteArray 的相关文章

  • 是否可以强制 XMLWriter 将元素写入单引号中?

    这是我的代码 var ptFirstName tboxFirstName Text writer WriteAttributeString first ptFirstName 请注意 即使我使用 ptFirstName 也会以双引号结束 p
  • C# 和 Javascript SHA256 哈希的代码示例

    我有一个在服务器端运行的 C 算法 它对 Base64 编码的字符串进行哈希处理 byte salt Convert FromBase64String serverSalt Step 1 SHA256Managed sha256 new S
  • ASP.NET Core Serilog 未将属性推送到其自定义列

    我有这个设置appsettings json对于我的 Serilog 安装 Serilog MinimumLevel Information Enrich LogUserName Override Microsoft Critical Wr
  • 获取按下的按钮的返回值

    我有一个在特定事件中弹出的表单 它从数组中提取按钮并将标签值设置为特定值 因此 如果您要按下或单击此按钮 该函数应返回标签值 我怎样才能做到这一点 我如何知道点击了哪个按钮 此时代码返回 DialogResult 但我想从函数返回 Tag
  • 未解决的包含:“cocos2d.h” - Cocos2dx

    当我在 Eclipse 中导入 cocos2dx android 项目时 我的头文件上收到此警告 Unresolved inclusion cocos2d h 为什么是这样 它实际上困扰着我 该项目可以正确编译并运行 但我希望这种情况消失
  • 如何避免情绪低落?

    我有一个实现状态模式每个状态处理从事件队列获取的事件 根据State因此类有一个纯虚方法void handleEvent const Event 事件继承基础Event类 但每个事件都包含其可以是不同类型的数据 例如 int string
  • 如何在列表框项目之间画一条线

    我希望能够用水平线分隔列表框中的每个项目 这只是我用于绘制项目的一些代码 private void symptomsList DrawItem object sender System Windows Forms DrawItemEvent
  • 指针问题(仅在发布版本中)

    不确定如何描述这一点 但我在这里 由于某种原因 当尝试创建我的游戏的发布版本进行测试时 它的敌人创建方面不起作用 Enemies e level1 3 e level1 0 Enemies sdlLib 500 2 3 128 250 32
  • 将目录压缩为单个文件的方法有哪些

    不知道怎么问 所以我会解释一下情况 我需要存储一些压缩文件 最初的想法是创建一个文件夹并存储所需数量的压缩文件 并创建一个文件来保存有关每个压缩文件的数据 但是 我不被允许创建许多文件 只能有一个 我决定创建一个压缩文件 其中包含有关进一步
  • WPF TabControl,用C#代码更改TabItem的背景颜色

    嗨 我认为这是一个初学者的问题 我搜索了所有相关问题 但所有这些都由 xaml 回答 但是 我需要的是后台代码 我有一个 TabControl 我需要设置其项目的背景颜色 我需要在选择 取消选择和悬停时为项目设置不同的颜色 非常感谢你的帮助
  • Web API - 访问 DbContext 类中的 HttpContext

    在我的 C Web API 应用程序中 我添加了CreatedDate and CreatedBy所有表中的列 现在 每当在任何表中添加新记录时 我想填充这些列 为此目的我已经覆盖SaveChanges and SaveChangesAsy
  • 在 ASP.NET Core 3.1 中使用包含“System.Web.HttpContext”的旧项目

    我们有一些用 Net Framework编写的遗留项目 应该由由ASP NET Core3 1编写的API项目使用 问题是这些遗留项目正在使用 System Web HttpContext 您知道它不再存在于 net core 中 现在我们
  • C# 中的递归自定义配置

    我正在尝试创建一个遵循以下递归结构的自定义配置部分
  • clang 实例化后静态成员初始化

    这样的代码可以用 GCC 编译 但 clang 3 5 失败 include
  • 将 xml 反序列化为类,list<> 出现问题

    我有以下 XML
  • C++ fmt 库,仅使用格式说明符格式化单个参数

    使用 C fmt 库 并给定一个裸格式说明符 有没有办法使用它来格式化单个参数 example std string str magic format 2f 1 23 current method template
  • 如何让Gtk+窗口背景透明?

    我想让 Gtk 窗口的背景透明 以便只有窗口中的小部件可见 我找到了一些教程 http mikehearn wordpress com 2006 03 26 gtk windows with alpha channels https web
  • 在 Dynamics CRM 插件中访问电子邮件发件人地址

    我正在编写一个 Dynamics CRM 2011 插件 该插件挂钩到电子邮件实体的更新后事件 阶段 40 pipeline http msdn microsoft com en us library gg327941 aspx 并且在此阶
  • C 中的异或运算符

    在进行按位操作时 我在确定何时使用 XOR 运算符时遇到一些困难 按位与和或非常简单 当您想要屏蔽位时 请使用按位 AND 常见用例是 IP 寻址和子网掩码 当您想要打开位时 请使用包含或 然而 XOR 总是让我明白 我觉得如果在面试中被问
  • 限制C#中的并行线程数

    我正在编写一个 C 程序来生成并通过 FTP 上传 50 万个文件 我想并行处理4个文件 因为机器有4个核心 文件生成需要更长的时间 是否可以将以下 Powershell 示例转换为 C 或者是否有更好的框架 例如 C 中的 Actor 框

随机推荐

  • QT 创建使用动态库

    一 创建并编译库 创建项目 选择Library下的C Library 2 选择shared library 3 此时创建的项目的 pro文件如下 QT gui TEMPLATE lib DEFINES Data LIBRARY DEFINE
  • 看看Android的触摸事件分发

    当我们的手指从触摸屏幕上的各种View 开始到这个点击事件的结束到底经历了什么 我们来简单分析下 之所以是简单分析 是因为这里完全不涉及hal层 事件类型 触摸事件会有三种类型 int action MotionEventCompat ge
  • 硬件设计——外围电路(晶振电路)

    硬件设计之晶振电路 为什么要用晶振 晶振电路由何组成 晶振电路中其电容的作用 在日常的电路设计中 我们经常会用到晶振电路 所以我们就要首先先提一下什么是晶振 这样才能理解晶振电路 为什么要用晶振 晶振的作用是为系统提供基本的时钟信号 通常一
  • 基于金融大数据的特征提取与趋势预测系统(一)2021-06-30

    项目分工和项目需求初步了解 在本项目的分工中我负责的是前端展示部分 前端展示的两个部分 1 登陆及注册 实现用户登陆本系统 以及注册成为用户的功能 以保证用户在使用本系统时的安全性 2 股票可视化模块 数据可视化主要旨在借助于图形化手段 清
  • TypeScript的数组和元组

    数组 在TypeScript中数组的定义与JavaScript中别无二致 但是JavaScript中的数组具有很大灵活性 即数组内可以存储任意类型数据 那么在TypeScript中能不能做到呢 答案是肯定的 const arr string
  • Java学习笔记17——多态与抽象

    多态与抽象 多态 多态是什么 多态的前提和体现 多态中成员访问的特点 多态的好处和弊端 多态中的转型 分类 抽象类 什么是抽象类 抽象的关键字 抽象类的特点 抽象类的成员特点 多态 多态是什么 多态是同一个对象 在不同时刻表现出来的不同形态
  • 【华为机试刷题笔记】HJ41-称砝码

    题目描述 现有n种砝码 重量互不相等 分别为 m1 m2 m3 mn 每种砝码对应的数量为 x1 x2 x3 xn 现在要用这些砝码去称物体的重量 放在同一侧 问能称出多少种不同的重量 注 称重重量包括 0 数据范围 每组输入数据满足 1
  • 自学Python爬虫学到什么程度?就可以去找工作了?

    确立目标 了解需求 首先我们要先定位自己的目标 当然我们先以爬虫工程师来做个说明 去招聘网上看看需求都有哪些 直接做个拉勾网爬虫 结果了 仔细看看 我们可以得出以下几点 1 python 不是唯一可以做爬虫的 很多语言都可以 尤其是 jav
  • 从零开发区块链应用(七)--gin框架参数获取

    文章目录 一 获取query参数 二 获取form表单参数 三 获取JSON参数 四 获取path参数 五 参数绑定 一 获取query参数 query指的是URL 后面携带的参数 例如user info username 张三 passw
  • 大白话Java版 TCP Socket编程案例 清晰明了

    最近学习网络的过程中 了解到了应用借助socket接口在tcp上建立连接 发送请求的过程 遂做个记录 文章目录 整体流程 服务端 1 创建套接字绑定端口 2 等待接收请求 4 获取请求 ConnectSocket建立 6 读请求并处理 8
  • TCP拥塞控制简单理解

    1 TCP的控制机制 序号 TCP通过序号可以实现一下几个功能 1 确认应答处理 发送端收到接收端的确认应答 可以得知某些数据包被接收端接收了 2 顺序控制 接收端可以利用序号对接收到的报文进行排序 3 重发控制 如果发送端没有收到确认应答
  • localStorage的高阶用法

    原文 https mp weixin qq com s VBTAWVMAUq822dwNA1A2kg const config type localStorage 本地存储类型 localStorage sessionStorage pre
  • vue项目使用element、vant组件库修改不了css样式 深度修改组件样式

    在修改element vant默认样式时发现用 important都没有效果 解决方案 第一种 直接把style的scoped去掉
  • 人工智能中非平衡数据处理方法、欠采样、过采样讲解(简单易懂)

    非平衡数据产生现象及原因 非平衡数据是人工智能安全中经常遇到的问题 一方面 在采集和准备数据时 由于安全事件发生的可能性不同等因素的影响 使得训练数据存在非平衡 另一方面 机器学习模型的攻击者也可能利用非平衡数据学习所产生的分类效果在多数类
  • springboot集成积木报表JimuReport,打成war包放到tomcat下运行报错,启动过滤器异常

    springboot集成积木报表JimuReport 打成war包放到tomcat下运行报错 启动过滤器异常 这里用的tomcat8 5 这个问题真是找了半天都没解决 真是栓Q啊 把war包放到tomcat9 0下运行 就正确了 一定注意
  • 初学者必看Markdown 使用指南

    什么是 Markdown Markdown 文档遵循一种特定的语法 容易阅读和写作 它们是纯文本 所以能够通过电脑上的任何文本编辑器来创建 然后这些文档能够转换成网页 而网页是用一个叫做 HTML 的语言标记创建的 Markdown 只是一
  • Microsoft Office 2003的安装

    哈喽 大家好 今天一起学习的是office2003的安装 这个老版本的office可是XP操作系统的老搭档了 有兴趣的小伙伴也可以来一起试试手 一 测试演示参数 演示操作系统 Windows XP 不建议win7及以上操作系统使用 系统类型
  • 文件使用磁盘的实现--OS

    文件使用磁盘的实现 通过文件使用磁盘 代码如下 在fs read write c中 int sys write int fd const char buf int count fd为文件索引 buf为缓冲区 count表示要处理的字符串长度
  • 图的遍历(BFS和DFS)

    一 遍历 lt 1 gt 遍历 把所有元素都看一遍 每看到一个元素 针对条件进行处理 lt 2 gt 线性逻辑 顺序存储 void fun1 type data int num for int i 0 i lt num i 逐个处理 typ
  • QT 通信之 QByteArray

    QT上位机的串口通信发送和接收数据都需要用到QByteArray QByteArray存储的是char型字符 但QByteArray提供的数组操作 比char更方便 这篇文章主要讲一下QByteArray在实际应用中的一些函数 以及QBby