当前位置: 首页 > news >正文

Qt 串口通信(C++)

1. 基本概念

串口通信(Serial Communications)的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。比如IEEE488定义并行通行状态时,规定设备线总长不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。典型地,串口用于ASCII码字符的传输。通信使用3根线完成,分别是地线、发送、接收。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。其他线用于握手,但不是必须的。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通信的端口,这些参数必须匹配。

波特率:这是一个衡量符号传输速率的参数。指的是信号被调制以后在单位时间内的变化,即单位时间内载波参数变化的次数,如每秒钟传送240个字符,而每个字符格式包含10位(1个起始位,1个停止位,8个数据位),这时的波特率为240Bd,比特率为10位*240个/秒=2400bps。一般调制速率大于波特率,比如曼彻斯特编码)。通常电话线的波特率为14400,28800和36600。波特率可以远远大于这些值,但是波特率和距离成反比。高波特率常常用于放置的很近的仪器间的通信,典型的例子就是GPIB设备的通信。

数据位 :这是衡量通信中实际数据位的参数。当计算机发送一个信息包,实际的数据往往不会是8位的,标准的值是6、7和8位。如何设置取决于你想传送的信息。比如,标准的ASCII码是0~127(7位)。扩展的ASCII码是0~255(8位)。如果数据使用简单的文本(标准 ASCII码),那么每个数据包使用7位数据。每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。由于实际数据位取决于通信协议的选取,术语“包”指任何通信的情况。

停止位 :用于表示单个包的最后一位。典型的值为1,1.5和2位。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。

奇偶校验位 :在串口通信中一种简单的检错方式。有四种检错方式:偶、奇、高和低。当然没有校验位也是可以的。对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数个。如果是奇校验,校验位为1,这样就有3个逻辑高位。高位和低位不真正的检查数据,简单置位逻辑高或者逻辑低校验。这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步。

2. QSerialPort模块

QSerialPort类继承自QIODevice,提供了基本的功能,包括配置,I/O操作,获取和设置RS-232引脚的信号:
与该类有关系的类主要是如下几个:
QIODevice、QSerialPort、QSerialPortPrivate、QSerialPortPrivateData。
它们的关系如下:
QSerialPort继承自QIODevice,继承了对设备文件基本的操作。
QSerialPortPrivate是QSerialPort对象中表示操作一类的,该部分与操作系统有关。QSerialPortPrivate继承自QSerialPortPrivateData。
QSerialPortPrivateData是一个串口设备的初始化数据,例如波特率等等。
QSerialPortPrivateData更多表示串口设备的初始数据,QSerialPortPrivate更多表示平台相关的对串口设备的操作。

3. qt项目中引入相关文件

工程文件.pro中添加

QT       += serialport

添加头文件

#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>

4.串口通信

创建窗口对象

QSerialPort * serial_port = new QSerialPort();

寻找串口

 foreach (const QSerialPortInfo &info,QSerialPortInfo::availablePorts()){QSerialPort serial;serial.setPort(info);if(serial.open(QIODevice::ReadWrite)){std::cout << serial.portName()) << std::endl;serial.close();}}

设置串口名(如COM2)

 serial->setPortName("COM2");

打开串口

serial->open(QIODevice::ReadWrite);

设置波特率(如921600)

 serial->setBaudRate(921600);//设置波特率为115200

设置数据位(如8)

 serial->setDataBits(QSerialPort::Data8);//设置数据位8

设置校验位(如0)

serial->setParity(QSerialPort::NoParity); //校验位设置为0

设置停止位(如1)

 serial->setStopBits(QSerialPort::OneStop);//停止位设置为1

设置流控制

 serial->setFlowControl(QSerialPort::NoFlowControl);//设置为无流控制

数据的发送

        QByteArray send_data_array;send_data_array.resize(10);char * send_data_char = (char *) malloc(sizeof (char) * 10);//frame[0]send_data_char[0] = 0x01;send_data_array.append(send_data_char[0]);send_data_char[1] = 0x02;send_data_array.append(send_data_char[1]);send_data_char[2] = 0x03;send_data_array.append(send_data_char[2]);send_data_char[3] = 0x04;send_data_array.append(send_data_char[3]);send_data_char[4] = 0x05;send_data_array.append(send_data_char[4]);send_data_char[5] = 0x06;send_data_array.append(send_data_char[5]);send_data_char[6] = 0x32;send_data_array.append(send_data_char[6]);send_data_char[7] = led_light_spinBox->value();send_data_array.append(send_data_char[7]);send_data_char[8] = 0x01;send_data_array.append(send_data_char[8]);send_data_char[9] = 0x1c;send_data_array.append(send_data_char[9]);serial_port->write(send_data_array);free(send_data_char);

数据的接收

QByteArray recv_all_data = serial_port->readAll();//接收一次读取到的数据

相关文章:

Qt 串口通信(C++)

1. 基本概念 串口通信&#xff08;Serial Communications&#xff09;的概念非常简单&#xff0c;串口按位&#xff08;bit&#xff09;发送和接收字节。尽管比按字节&#xff08;byte&#xff09;的并行通信慢&#xff0c;但是串口可以在使用一根线发送数据的同时用另一根线接…...

聊聊AUTOSAR: 基于DaVinci的SecOC开发与配置

一、什么是SecOC 当前车载网络通讯环境越来越复杂&#xff0c;未采取任何安全保护的报文&#xff0c;一旦被伪造或者篡改&#xff0c;将非常危险。为了提升信息的安全性&#xff0c;AUTOSAR标准中引进了SecOC&#xff0c;加入了通讯认证机制&#xff0c;能够有效的辨别出信息是…...

.net6.0 重启控制台 命令

在.NET 6.0中&#xff0c;如果你想要创建一个命令行应用程序来重启当前运行的控制台&#xff0c;你可以使用System.Diagnostics命名空间下的Process类来启动一个新的进程&#xff0c;并结束当前进程。 以下是一个简单的示例代码&#xff0c;展示了如何实现重启控制台的功能&am…...

LVS 调度器 nat和DR模式

lvs-nat 修改请求报文的目标IP,多目标IP的DNAT 配置网络 LVS主机 注意网卡的顺序 &#xff08;nat和主机模式&#xff09; [rootlvs ~]# cat /etc/NetworkManager/system-connections/ens160.nmconnection [connection] idens160 typeethernet interface-nameens160 ​ [ip…...

MTK Android12 SystemUI 手势导航 隐藏导航栏底部布局

问题:android12 平台手势导航情况下,app页面未设置全屏情况下,底部导航栏会有一个高度的颜色,底部导航会有一个手势导航提示条 需求:去掉手势导航情况下底部的导航栏和手势提示条 文章目录 相关资源修改问题描述解决方案代码跟踪中间提醒小方块代码查找底部手势导航条跟踪…...

electron调用c++ dll lib

主要的工具包 node-addon-apinode-gyp 主要的配置 {"variables": {# module_mac: "./../sdk/mac",},"targets": [{"target_name": "native_module","defines": ["NAPI_DISABLE_CPP_EXCEPTIONS"],&qu…...

23种设计模式(持续更新中)

参考链接干货分享 | 《设计模式之美》学习笔记 - 知乎 (zhihu.com) 总体来说设计模式分为三大类&#xff1a; 创建型模式&#xff0c;共5种&#xff1a;工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式&#xff0c;共7种&#xff1a;适配器模式、…...

Linux文件系统详解

Linux的一切皆文件 Linux 中的各种事物比如像文档、目录&#xff08;Mac OS X 和 Windows 系统下称之为文件夹&#xff09;、键盘、监视器、硬盘、可移动媒体设备、打印机、调制解调器、虚拟终端&#xff0c;还有进程间通信&#xff08;IPC&#xff09;和网络通信等输入/输出资…...

大数据面试SQL(五):查询最近一笔有效订单

文章目录 查询最近一笔有效订单 一、题目 二、分析 三、SQL实战 四、样例数据参考 查询最近一笔有效订单 一、题目 现有订单表t5_order&#xff0c;包含订单ID&#xff0c;订单时间&#xff0c;下单用户&#xff0c;当前订单是否有效。 请查询出每笔订单的上一笔有效订…...

OpenCV图像滤波(8)getGaborKernel()函数的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 该函数返回 Gabor 滤波器系数。 Gabor 滤波器在图像处理中非常有用&#xff0c;特别是在纹理分析、特征提取和边缘检测等领域。 函数原型 Mat c…...

门店收银系统源码+同城即时零售多商户入驻商城源码

一、我们为什么要开发这个系统&#xff1f; 1. 商户经营现状 “腰尾部”商户&#xff0c;无小程序运营能力&#xff1b;自营私域商城流量渠道单一&#xff1b;无法和线下收银台打通&#xff0c;库存不同步&#xff0c;商品不同步&#xff0c;订单不同步&#xff1b; 2.平台服…...

MaxKB:基于 LLM大语言模型的知识库问答系统实操

1.MaxKB介绍 MaxKB 是一款基于 LLM&#xff08;Large Language Model&#xff09;大语言模型的知识库问答系统。MaxKB 的产品命名内涵为 “Max Knowledge Base”&#xff0c;为用户提供强大的学习能力和问答响应速度&#xff0c;致力于成为企业的最强大脑。与同类基于 LLM 的知…...

linux文件命令:更新文件时间戳的工具touch详解

目录 一、概述 二. touch 命令的基本用途 三. touch 命令的语法 3.1、语法 3.2、touch 命令的选项 3.3、时间字符串格式 四. 常用场景 4.1 创建空文件 4.2 同时创建多个文件 4.3 更新文件的时间戳 4.4 只更新访问时间 4.5 只更新修改时间 4.6 设置特定时间戳 4.7 使用另…...

Docker学习(6):Docker Compose部署案例

一、docker-compose部署mysql 1、准备镜像 2、编写my.cnf配置文件 # 服务端参数配置 [mysqld] usermysql # MySQL启动用户 default-storage-engineINNODB # 创建新表时将使用的默认存储引擎 character-set-serverutf8mb4 # 设置mysql服务端默认字符集…...

4章3节:处理医学类原始数据的重要技巧,R语言中的宽长数据转换,tidyr包的使用指南

在数据分析中,数据的存储方式直接影响分析过程的效率和准确性。常见的数据存储形式有宽型数据(wide format)和长型数据(long format)。宽型数据适合人类查看和理解,而长型数据则更适合计算机处理和分析。为此,R语言提供了tidyr包,用于在这两种数据格式之间进行转换。本…...

[Web安全架构] HTTP协议

文章目录 前言1. HTTP1 . 1 协议特点1 . 2 URL1 . 3 Request请求报文1 . 3 .1 请求行1 . 3 .2 请求头1 . 3 .3 请求正文1 . 3 .4 常见传参方式 1 . 4 Response响应报文1 . 4 .1 响应行1 . 4 .2 响应头1 . 4 .3 响应正文 2. Web会话2 .1 Cookie2 .2 Session2 .3 固定会话攻击 前…...

mysql数据库之运算符

安全等于运算符(<=>) 这个操作符和 = 操作符执行相同的比较操作,不过<=>可以用来判断NULL值。在两个操作数均为NULL时,其返回值为1而不为NULL;而当一个操作数为NULL时,其返回值为0而不为NULL。 下面分别是 SELECT NULL <=>1 SELECT 1<=>0 SEL…...

Spark轨迹大数据高效处理_计算两经纬度点间的距离_使用Haversine formula公式

开发背景 接上文我求的两经纬度点之间的方位角&#xff0c;我的需求里还提到了要计算距离&#xff0c;当然这个距离也是为后面的需求做铺垫的&#xff0c;因此需要求两个经纬度电之间的距离。 不要妄想用勾股定理求出来&#xff0c;实际上距离的计算还是稍微复杂些。这里使用的…...

[C++] : std::copy_n

std::copy_n 是 C 标准库中的一个算法&#xff0c;用于将指定数量的元素从一个输入范围复制到一个输出范围。那这就提供了很灵活的用法了。下面我们举例说明。 语法 template< class InputIt, class Size, class OutputIt > OutputIt copy_n(InputIt first, Size count…...

centos上传工具

yum install lrzsz 安装完成之后 作用是 输入 rz 可以本地上传文件...

雷达信号处理中的‘模糊函数’到底是什么?用Python仿真LFM信号的距离多普勒耦合现象

雷达信号处理中的‘模糊函数’到底是什么&#xff1f;用Python仿真LFM信号的距离多普勒耦合现象 雷达信号处理中&#xff0c;匹配滤波器的性能直接影响目标检测的精度。当目标存在径向运动时&#xff0c;回波信号会产生多普勒频移&#xff0c;导致匹配滤波器出现失配。描述这种…...

**发散创新:基于CUDA的GPU加速图像卷积运算实战详解**在现代计算机视觉与深度学习领域,**图像处理

发散创新&#xff1a;基于CUDA的GPU加速图像卷积运算实战详解 在现代计算机视觉与深度学习领域&#xff0c;图像处理任务的性能瓶颈往往集中在CPU端计算效率不足。尤其是在大规模图像数据集上进行卷积操作时&#xff0c;传统串行算法难以满足实时性需求。本文将深入探讨如何利用…...

Windows媒体播放终极解码方案:LAV Filters完整指南

Windows媒体播放终极解码方案&#xff1a;LAV Filters完整指南 【免费下载链接】LAVFilters LAV Filters - Open-Source DirectShow Media Splitter and Decoders 项目地址: https://gitcode.com/gh_mirrors/la/LAVFilters 如果你在Windows上观看视频时经常遇到格式不支…...

5个步骤解决Android内核跨设备适配难题:AnyKernel3的定制化方案

5个步骤解决Android内核跨设备适配难题&#xff1a;AnyKernel3的定制化方案 【免费下载链接】AnyKernel3 AnyKernel, Evolved 项目地址: https://gitcode.com/gh_mirrors/an/AnyKernel3 在Android内核开发中&#xff0c;你是否曾遇到过为一款设备编译的内核无法在另一款…...

新手入门:在快马平台用基础代码实现个人EndNote

最近在整理学术资料时&#xff0c;发现需要频繁记录和分类文献信息。作为编程新手&#xff0c;想尝试自己做个简单的网页工具来管理这些内容。通过InsCode(快马)平台的智能生成功能&#xff0c;居然用基础代码就实现了一个迷你EndNote&#xff0c;整个过程特别适合像我这样的初…...

用PyTorch和TorchText搞定AG_NEWS新闻分类:从数据加载到75%准确率的保姆级代码

用PyTorch和TorchText实现AG_NEWS新闻分类&#xff1a;从零到75%准确率的完整指南 当你第一次接触文本分类任务时&#xff0c;可能会被数据处理和模型构建的复杂性吓到。本文将带你用PyTorch和TorchText从零开始构建一个新闻分类器&#xff0c;无需任何先验知识&#xff0c;只需…...

老旧Mac终极重生指南:OpenCore Legacy Patcher完整教程

老旧Mac终极重生指南&#xff1a;OpenCore Legacy Patcher完整教程 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher OpenCore Legacy Patcher是一款强大的开源…...

Mac NTFS读写完整解决方案:技术深度解析与高效部署指南

Mac NTFS读写完整解决方案&#xff1a;技术深度解析与高效部署指南 【免费下载链接】Free-NTFS-for-Mac Nigate: An open-source NTFS utility for Mac. It supports all Mac models (Intel and Apple Silicon), providing full read-write access, mounting, and management f…...

Python玩转微信自动化:除了监控聊天,uiautomation还能帮你自动保存文件、整理聊天记录

Python实现微信自动化管理&#xff1a;从文件归档到聊天记录整理 微信已经成为现代办公不可或缺的沟通工具&#xff0c;但随之而来的是海量文件管理和聊天记录整理的烦恼。每天手动保存图片、文档&#xff0c;再按日期分类&#xff0c;不仅耗时耗力&#xff0c;还容易遗漏重要…...

MiniCPM-V-2_6 Anaconda环境快速搭建:隔离Python依赖一键启动

MiniCPM-V-2_6 Anaconda环境快速搭建&#xff1a;隔离Python依赖一键启动 你是不是也遇到过这种情况&#xff1a;想试试某个新的AI模型&#xff0c;结果光是配环境就折腾了大半天&#xff0c;各种包版本冲突&#xff0c;最后模型没跑起来&#xff0c;人先崩溃了。特别是像Mini…...