Qt6教程之三(14) 串口通信
目录
一 串口通信相关概念介绍
二 Qt开发串口通信程序
一 串口通信相关概念介绍
串口通信(Serial Communications)在上位机控制领域非常常用,其原理是按位(bit)发送和接收字节。相对于按字节(byte)发送的并行通信慢很多,然而串口却可以在使用一根线发送数据的同时用另一根线接收数据。其优点是能够实现远距离通信。
而对于串口而言,长度可达1200米。典型地,串口用于ASCII码字符的传输。通信使用3根线完成,分别是地线、发送、接收。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。其他线用于握手,但不是必须的。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通信的端口,这些参数必须匹配。
(1)波特率:
这是一个衡量符号传输速率的参数。
指的是信号被调制以后在单位时间内的变化,即单位时间内载波参数变化的次数,如每秒钟传送240个字符,而每个字符格式包含10位(1个起始位,1个停止位,8个数据位),这时的波特率为240Bd,比特率为10位*240个/秒=2400bps。一般调制速率大于波特率,比如曼彻斯特编码)。通常电话线的波特率为14400,28800和36600。波特率可以远远大于这些值.但是波特率和距离成反比。高波特率常常用于放置的很近的仪器间的通信,典型的例子就是GPIB设备的通信。
(2)数据位:
这是衡量通信中实际数据位的参数。
当计算机发送一个信息包,实际的数据往往不会是8位的,标准的值是6、7和8位。如何设置取决于你想传送的信息。
比如,标准的ASCII码是0~127(7位)。扩展的ASCII码是0~255(8位)。
如果数据使用简单的文本(标准 ASCII码),那么每个数据包使用7位数据。
每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。
由于实际数据位取决于通信协议的选取,术语“包”指任何通信的情况。
(3)停止位:
用于表示单个包的最后一位。典型的值为1,1.5和2位。
由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。
(4)奇偶校验位:
在串口通信中一种简单的检错方式。
有四种检错方式:偶、奇、高和低。当然没有校验位也是可以的。对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数个。如果是奇校验,校验位为1,这样就有3个逻辑高位。
高位和低位不真正的检查数据,简单置位逻辑高或者逻辑低校验。这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步。
二 Qt开发串口通信程序
Qt开发串口通信,有一个专门的模块叫QtSerialPort ,在开发时需要在工程文件中添加后才能使用。如下:
CMake:
需要在CMakeLists中加入以下内容
find_package(Qt6 COMPONENTS SerialPort REQUIRED)target_link_libraries(工程名称 PRIVATE Qt6::SerialPort)
Qmake:
需要在.pro文件中添加如下内容:
QT += serialport
详细实例: 使用虚拟串口实现互相发送消息的功能
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include<QSerialPort>
#include<QSerialPortInfo>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void sendData();//发送串口数据void receiveData();//接收串口数据void openSerialport();//串口开启/关闭控制private:Ui::MainWindow *ui;QSerialPort *serialPort;};
#endif // MAINWINDOW_H
mianwindow.cpp
#include "mainwindow.h"
#include "./ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//设置窗口标题和大小this->setWindowTitle("串口通信Demo");this->resize(800,600);//初始化串口对象serialPort=new QSerialPort(this);//获取所有可用端口列表QList<QSerialPortInfo> serialPortList=QSerialPortInfo::availablePorts();//如果没有可用串口,则在状态栏提示相应信息if(serialPortList.isEmpty()){this->statusBar()->showMessage("没有可用串口,请插入串口或重启电脑重试");}else {//有可用串口的情况下,把串口遍历显示到下拉框中this->statusBar()->showMessage("可用串口数量为:"+QString::number( serialPortList.count()) );//创建遍历迭代器,把串口遍历显示到下拉框中QList<QSerialPortInfo>::Iterator nextSerialPort=serialPortList.begin();while (nextSerialPort != serialPortList.end()) {ui->comboBox->addItem(nextSerialPort->portName());nextSerialPort++;}}//绑定信号和槽connect(serialPort,SIGNAL(readyRead()),this,SLOT(receiveData()));connect(ui->send_data,SIGNAL(clicked(bool)),this,SLOT(sendData()));connect(ui->open_serialport,SIGNAL(clicked(bool)),this,SLOT(openSerialport()));}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::sendData()
{//获取需要发送的文本QString senData=ui->lineEdit->text().trimmed();//使用字节数组处理输入的文本QByteArray sendDataArray;sendDataArray.append(senData.toUtf8().data());//使用串口发送字节数组serialPort->write(sendDataArray);
}void MainWindow::receiveData()
{//接收其他串口发送过来的数据QByteArray serialData;serialData.append(serialPort->readAll());//把数据依次显示到文本控件上面去ui->textEdit->append(serialData);
}void MainWindow::openSerialport()
{//判断串口是否已经打开,若打开则关闭,同时改变状态灯和按钮文字设置为“打开串口”if(serialPort->isOpen()){serialPort->clear();serialPort->close();ui->open_serialport->setText("打开串口");ui->label->setStyleSheet("background-color: rgb(255, 0, 0);");}else {//若串口没有打开,则设置指示灯为绿色,设置按钮文字为“关闭串口”ui->label->setStyleSheet("background-color:rgb(0,255,0);border-radius:12px;");ui->open_serialport->setText("关闭串口");serialPort->setPortName(ui->comboBox->currentText());serialPort->open(QIODevice::ReadWrite);serialPort->setBaudRate(QSerialPort::Baud115200);serialPort->setDataBits(QSerialPort::Data8);serialPort->setParity(QSerialPort::NoParity);serialPort->setStopBits(QSerialPort::OneStop);serialPort->setFlowControl(QSerialPort::NoFlowControl);}
}
main.cpp
#include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}
写好代码之后,需要先使用虚拟串口工具创建一对串口,然后在使用一个串口调试工具使用其中一个串口,然后我们自己写的程序使用另一个串口。
这里我是使用深蓝网络串口调试工具作为一端,使用的串口是com3, 自己编写的程序使用com4,
最后双方实现通信。
资源下载链接:
https://download.csdn.net/download/XiaoWang_csdn/87614078
运行效果:
下一篇博客:
Qt6教程之三(15) Modbus通信_折腾猿王申兵的博客-CSDN博客
上一篇博客:
Qt6教程之三(13) TCP/IP通讯与socket编程_折腾猿王申兵的博客-CSDN博客
Qt6教程之三(14) 串口通信相关推荐
- Qt6教程之三(2) QT使用qss
QSS是Qt Style Sheets的缩写,中文含义是Qt样式表,它用来自定义控件外观的机制.QSS与网页中使用的CSS非常相似,可以把QSS看作是CSS在Qt领域领域的定制版本. QSS的语法规则 ...
- Qt6教程之三(3) QtWedget自定义控件
在之前的博客中,我们使用的控件都是Qt官方提供的,对于控件的特性也只能被动地接受,为了打破这种束缚,可以按照自己的想法来定义控件. 不过自定义控件必须遵守Qt官方的一套自定义控件规则,在规则之下我们就 ...
- 【STM32】HAL库 STM32CubeMX教程十一---DMA (串口DMA发送接收)
前言: 本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1.芯片: STM32F407ZET6/ STM32F103ZET6 ...
- STM32F105RCT6使用CubeMX初始化工程——1:初始化串口通信
目录 1:CubeMX初始化配置 2:添加代码逻辑 3:通信测试 使用引脚:PA9,PA10 1:CubeMX初始化 在上一次基础上,打开CubeMx工程选择对应的引脚设置为串口通信.通信模式修改为异 ...
- STM32CubeMX实现串口通信
文章目录 一. 环境 二. 使用STM32CubeMX 1. 安装固件库 2. 工程设置 三. USART串口通信 1. UART函数库介绍 2. 代码编写 3. 最终效果 四. 软件调试 五. 总结 ...
- 【转】Qt串口通信专题教程
查看以前的教程:Qt编写串口通信程序全程图文讲解 查看Wincom和Lincom介绍:Qt跨平台串口通信软件Wincom与Lincom 下载软件,文档和源码:资源下载 --------------20 ...
- 基于天问block编译环境下ASRPRO语音芯片程序编写教程(三)串口通信,多线程模块,ADC篇
本篇教程将基于天问block内的官方范例代码讲解如何编写ASRPRO语音芯片程序以实现串口通信多线程模块编程和ADC数据读入功能. 1.串口通信 ASRPRO语音芯片具有3组可用串口(UART1对应P ...
- 【转】[Qt教程] Qt串口通信全新专题
版权声明 该文章原创于Qter开源社区(www.qter.org),转载请注明出处! 软件:QCom跨平台串口调试助手! 更新提示 这次源码更新,与前面"串口通信专题"主要有下面两 ...
- 手机APP开发之MIT Appinventor详细实战教程(一),利用通过蓝牙控制单片机,以及实现单片机与android设备之间的串口通信
目录 (一)前期软件准备和硬件准备 ( 二 ) 实现的思路和操作原理 ( 三) 具体的操作方法 MIT Appinventor 是编程领域较为受欢迎且适用的编程软件 ,因其操作流程和使用方法简单,一直 ...
最新文章
- 从复现人类智能到挑战AI大工程,智能计算正经历什么考验?
- 各种框架实现了经典的 todo 应用
- U-Boot 之五 详解 U-Boot 及 SPL 的启动流程
- ajax 使用 JSONP 时,只能 GET 不能 POST
- 程序员必备的 10 大 GitHub 仓库
- 2019-03-11-算法-进化(搜索二维矩阵II)
- 霍夫变换检测圆c 语言,c++ 霍夫变换检测直线
- bootstrap兼容ie8以下版本
- 向下滑动动画android_Android SwipeRefreshLayout – Android向下拉动/向下滑动即可刷新
- 宿主程序Crash与Lua是动态库还是静态库有关?
- 制作pip源(按需,非镜像方式)
- CodeProject上的一些摘抄
- Add Juniper SRX Cluster into JunOS Space 16.1 Security Director
- Linux内存管理(四):Jemalloc
- qtableview 鼠标划过单元格弹出标签显示单元格内容
- robots.txt文件示例
- 编写程序验证四方定理C语言,C语言中怎么应用四方定理
- 8位串行输入串行输出移位寄存器的Verilog设计
- 为什么觉得云服务比传统服务器还要贵呢?
- Openstack 03 - Nova Compute
热门文章
- s8计算机功能在哪里,三星Galaxy S8新功能曝光,手机直接当电脑用!
- 十亿网民近八成都在用搜索,智能搜索对企业的价值有多大?
- 人工神经网络的数学内涵,数学与神经网络的关系
- Ableton Live 11 Suite for mac,音乐制作工具
- Ableton Live 10 Suite for mac(音乐制作软件)支持15系统
- cm域名 好域名_.cm域名_.cm域名注册_.cm域名价格 - NameBeta
- 对话式文档审阅:积极拥抱大型语言模型,实在智能Chat-IDP开启内测
- app账号退不出去_怎么去和平精英租号平台APP上租号玩和平精英
- android源代码下载AE 文字样式,有了它,不会AE也可以用手机快速做出漂亮的文字动画——Legend#Android...
- 笔记本老是提示希望计算机做什么,电脑都是怎么被用坏的?这些坏习惯希望你不要有,越早知道越好!...