Qserialport
Qt串口收发数据

Qt串⼝收发数据通过好⼏天的学习,终于写出了⼀个⽤于串⼝通信的上位机。
下⾯开始介绍串⼝类的使⽤。
⾸先,QT5是⾃带QSerialPort这个类的,使⽤时需要在pro⽂件⾥⾯添加⼀⾏:QT += serialport然后直接引⽤头⽂件就可以使⽤了。
#include <QtSerialPort/QSerialPort>#include <QtSerialPort/QSerialPortInfo>QSerialPort:提供访问串⼝的功能QSerialPortInfo:提供系统中存在的串⼝的信息接下来需要创建⼀个QSerialPort的对象,对串⼝的名称、波特率、数据位、校验位、停⽌位等参数进⾏设置,然后才进⾏串⼝读写操作。
⼤概总结了⼀下,设置、读、写的过程。
⼀、设置(举例)1 QSerialPort *serial = new QSerialPort;2//设置串⼝名3 serial->setPortName(name);4//打开串⼝5 serial->open(QIODevice::ReadWrite);6//设置波特率7 serial->setBaudRate(BaudRate);8//设置数据位数9 serial->setDataBits(QSerialPort::Data8);10//设置奇偶校验11 serial->setParity(QSerialPort::NoParity);12//设置停⽌位13 serial->setStopBits(QSerialPort::OneStop);14//设置流控制15 serial->setFlowControl(QSerialPort::NoFlowControl);这⾥设置了串⼝名为name,打开串⼝并设置为可读可写,波特率为BaudRate,数据位为8位,没有奇偶校验位,停⽌位为1位,没有流控制。
qserialport readready信号 -回复

qserialport readready信号-回复QSerialPort是Qt提供的一个串口通信类,它允许应用程序与外部设备进行数据交换。
在QSerialPort类中,有一个非常重要的信号——readReady。
本文将详细解析这个信号以及其相关内容。
一、QSerialPort简介Qt是一套跨平台的C++应用程序开发框架,它提供了丰富的库和工具,用于开发图形用户界面(GUI)和非GUI应用程序。
QSerialPort是Qt中与串口通信相关的类,可以方便地与外部设备进行数据交互,如串口打印机、传感器、硬件接口等。
二、readReady信号的作用和功能readReady是QSerialPort类中一个非常重要的信号,它表示串口接收缓冲区中有数据可用于读取。
当外部设备向电脑(应用程序)发送数据时,QSerialPort会自动检测到数据的到达,并发出readReady信号,用于通知应用程序可以读取数据。
三、使用readReady信号的步骤1. 创建QSerialPort对象使用QSerialPort类之前,需要创建一个对象,即实例化一个QSerialPort 类。
可以通过构造函数或工厂函数创建对象,并指定串口名称、波特率、数据位、校验位等参数。
2. 打开串口在使用QSerialPort之前,需要先打开串口。
可以通过调用QSerialPort 类的open函数来打开串口。
在打开串口之前,需要确保串口未被其他程序占用。
3. 连接readReady信号在QSerialPort对象创建并打开串口后,可以连接其readReady信号。
通过调用QObject类的connect函数,将readReady信号与自定义的槽函数建立连接。
4. 实现槽函数在连接readReady信号之后,需要实现一个槽函数。
槽函数将在接收到readReady信号时被自动调用,并负责处理接收到的数据。
5. 启动事件循环在连接readReady信号并实现槽函数后,需要启动Qt的事件循环,以便能够接收和处理来自串口的数据。
46.QT-自带库QSerialPort串口使用

46.QT-⾃带库QSerialPort串⼝使⽤之前⼀章学习的是第三⽅库使⽤:本章来学习⾃带serial库1.QSerialPortInfoQList<QSerialPortInfo> QSerialPortInfo::availablePorts();//获取当前在线的串⼝设备⽰例如下:foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()){qDebug() << "Name : " << info.portName();qDebug() << "Description : " << info.description();qDebug() << "Manufacturer: " << info.manufacturer();qDebug() << "Serial Number: " << info.serialNumber();qDebug() << "System Location: " << info.systemLocation();}2.QSerialPort初始化初始化如下所⽰:serialport.setPortName(cfg.portName);serialport.setBaudRate(QSerialPort::Baud115200);serialport.setParity(QSerialPort::NoParity);serialport.setDataBits(QSerialPort::Data8);serialport.setStopBits(QSerialPort::OneStop);serialport.setFlowControl(QSerialPort::NoFlowControl);if(!serialport.open(QIODevice::ReadWrite)){qDebug()<<"打开失败";return;}3.QSerialPort信号介绍void readyRead();//当串⼝接收到下位机发送数据时,将会发送该信号,然后我们在对应的槽函数调⽤serialport .readAll()即可error(QSerialPort::SerialPortError );//串⼝错误信号,⽐如当串⼝打开失败,串⼝连接时突然断开,都将会调⽤该信号//⽐如: QSerialPort::PermissionError (表⽰串⼝连接断开了)4.QSerialPort⽰例Widget::Widget(QWidget *parent): QWidget(parent),serialport(this),btn("发送",this){serialport.setPortName("COM21");serialport.setBaudRate(QSerialPort::Baud115200);serialport.setParity(QSerialPort::NoParity);serialport.setDataBits(QSerialPort::Data8);serialport.setStopBits(QSerialPort::OneStop);serialport.setFlowControl(QSerialPort::NoFlowControl);if(!serialport.open(QIODevice::ReadWrite)){qDebug()<<"打开失败";return;}connect(&serialport,SIGNAL(readyRead()),this,SLOT(onReadyRead()));connect(&btn,SIGNAL(clicked()),this,SLOT(sendSerialData()));}void Widget::onReadyRead(){QString str(serialport.readAll());qDebug()<<str;}void Widget::sendSerialData(){serialport.write(QString("发送:%1\r\n").arg(qrand()).toLocal8Bit()); //发送随机值}运⾏打印:发现下位机发送上来的是乱码的,这是因为我们下位机程序是⽤的gbk编码写的,所以打印汉字乱码了5.修改代码-添加数据格式编码转换修改发送/接收函数:void Widget::onReadyRead(){QString str(fromGBKtoUtf8(serialport.readAll()));QStringList list = str.split(QRegExp("[\r\n]"), QString::SkipEmptyParts); //去掉\r\n , SkipEmptyParts表⽰如果末尾为\r\n则不需要打印foreach (QString line, list) {qDebug()<<line;}}void Widget::sendSerialData(){//serialport.write(QString("%1\r\n").arg(qrand()).toLocal8Bit());serialport.write(fromUtf8toGBK(QString("%1\r\n").arg(qrand())));}QString Widget::fromGBKtoUtf8(QByteArray arry){QTextCodec *gbk = QTextCodec::codecForName("gbk");QTextCodec *utf8 = QTextCodec::codecForName("UTF-8");QString unicode=gbk->toUnicode(arry);return QString(utf8->fromUnicode(unicode));}QByteArray Widget::fromUtf8toGBK(QString str){QTextCodec *gbk = QTextCodec::codecForName("gbk");QTextCodec *utf8 = QTextCodec::codecForName("UTF-8");QString unicode=utf8->toUnicode(str.toLocal8Bit());return gbk->fromUnicode(unicode);}运⾏打印:6.在QThread线程中使⽤QSerialPort由于在QThread线程⾥不能⽤槽函数,不过可以在run⾥使⽤QSerialPort::waitForReadyRead()来阻塞获取读数据.如果在指定时间内读取成功/失败,则向界⾯发送数据.⽰例如下:serialport.write( QString("%1\r\n").arg(qrand()).toLocal8Bit() ); //写⼊随机值if(serialport.waitForBytesWritten(100)) //100ms 等待写⼊成功{if(serialport.waitForReadyRead(100)) //等待数据返回{QString str((serialport.readAll()));QStringList list = str.split(QRegExp("[\r\n]"),QString::SkipEmptyParts); //去掉\r\nforeach (QString line, list) {qDebug()<<line;//解析line,并向界⾯发送信号 ... ... }}elseqDebug()<<"read err";}elseqDebug()<<"write err";。
qserialport方法

qserialport方法(最新版3篇)篇1 目录1.QSerialPort 类的概述2.QSerialPort 的主要功能3.QSerialPort 的基本使用方法4.QSerialPort 的信号与槽函数5.QSerialPort 的常见错误与处理篇1正文一、QSerialPort 类的概述QSerialPort 是 Qt 框架中的一个类,用于实现串行通信。
它可以让开发者方便地通过串口与其他设备进行数据传输,如接收或发送数据。
QSerialPort 类继承自 QIODevice 类,因此具有 QIODevice 类的所有功能,同时还提供了一些特定的串行通信方法。
二、QSerialPort 的主要功能QSerialPort 类提供了以下主要功能:1.打开和关闭串行端口:可以使用 open() 方法打开串行端口,使用close() 方法关闭串行端口。
2.读取和发送数据:可以使用 read() 和 write() 方法进行数据的读取和发送。
3.设置和获取端口参数:可以设置端口的波特率、数据位、停止位和校验位等参数,也可以获取当前端口的参数。
4.控制数据流:可以使用 setFlowControl() 和 getFlowControl() 方法控制数据流的方向和状态。
5.异步通信:可以使用 asyncRead() 和 asyncWrite() 方法进行异步读写操作。
三、QSerialPort 的基本使用方法使用 QSerialPort 类进行串行通信的基本步骤如下:1.创建一个 QSerialPort 对象,指定端口名称。
2.使用 open() 方法打开端口,并检查是否成功打开。
3.设置端口参数,如波特率、数据位、停止位和校验位等。
4.使用 read() 或 asyncRead() 方法读取数据,使用 write() 或asyncWrite() 方法发送数据。
5.在通信完成后,使用 close() 方法关闭端口。
qserialport用法

qserialport用法1. 什么是qserialportqserialport是Qt框架中的一个模块,用于在Windows、Linux和macOS等操作系统上进行串口通信。
它提供了一种简单而强大的方式来读取和写入串口数据,并支持多种常见的串口通信协议。
2. 安装qserialport在使用qserialport之前,需要先安装Qt开发环境。
Qt是一个跨平台的应用程序开发框架,可以在官方网站上下载并安装。
安装完Qt后,在项目文件中添加QT += serialport这一行来启用qserialport模块。
3. qserialport基本概念3.1 串口串口是一种常见的计算机外部设备连接接口,用于将计算机与其他设备(如传感器、打印机等)进行数据交换。
每个串口都有一个唯一的标识符,称为端口号。
3.2 波特率波特率是指每秒钟传输的比特数(即数据位)的数量。
它表示了信息传输速度的快慢,单位为bps(bits per second)。
3.3 数据位、停止位和校验位数据位表示每个字节中使用的比特数。
常见的取值为5、6、7和8位。
停止位用于表示一个字节的结束。
常见的取值为1位和2位。
校验位用于检测数据传输中的错误。
常见的取值为无校验、奇校验和偶校验。
3.4 流控制流控制用于控制数据在串口之间的传输速率,以防止数据丢失或溢出。
常见的流控制方式有硬件流控制和软件流控制。
4. qserialport类及其方法4.1 QSerialPort类QSerialPort类是qserialport模块中最重要的类,它提供了与串口进行交互的方法和信号。
4.2 打开和关闭串口使用QSerialPort类打开串口时,需要指定串口名称、波特率、数据位、停止位和校验位等参数。
可以通过调用open()方法来打开串口,并使用close()方法关闭串口。
QSerialPort serial;serial.setPortName("COM1");serial.setBaudRate(QSerialPort::Baud115200);serial.setDataBits(QSerialPort::Data8);serial.setStopBits(QSerialPort::OneStop);serial.setParity(QSerialPort::NoParity);if (serial.open(QIODevice::ReadWrite)) {// 串口打开成功} else {// 串口打开失败}4.3 读取和写入数据使用QSerialPort类可以方便地读取和写入串口数据。
Qt串口通信开发之Qt串口通信模块QSerialPort开发完整实例(串口助手开发)

Qt串⼝通信开发之Qt串⼝通信模块QSerialPort开发完整实例(串⼝助⼿开发)之前⾃⼰写了⽤于上位机做基本收发的界⾯,独⽴出来相当于⼀个串⼝助⼿,先贴图:功能作为串⼝助⼿来说还算完善,五个发送槽,⼀个接收槽,可以检测可⽤串⼝并加上相关标志,串⼝设置,记数功能,还有菜单栏上的⽂件操作和⼀些选择功能。
下⾯说⼀说这个项⽬:做这个串⼝助⼿分为两步,第⼀步是设计界⾯,第⼆部是功能的代码实现。
⼀、界⾯设计界⾯设计⽤Qt Designer,当然⽤Qt Creator的界⾯编辑器也可以,只不过感觉Qt Designer更好⽤⼀点,因为可以随时运⾏查看你的界⾯效果⽽不⽤编译整个项⽬输出⼀个可执⾏程序再看看界⾯效果,这样会影响效率。
界⾯设计你想界⾯是什么样就怎么样设计,拉控件,排版,设置⼤⼩,修改对象名等等,都在这上⾯做好,这些⽤程序写的话会很⿇烦,⼯作量也⼤。
这上⾯的对象名很重要,因为在后⾯的代码实现中会⽤到,这个界⾯⽤到的控件还是挺多的,这⾥也不⼀个⼀个讲,我直接贴出来:senderGB_1 - 5都是⼀样的,改下数就⾏当然,⽤你⾃⼰喜欢的命名也可以,后⾯程序改下名字就⾏。
⼆、代码实现先贴代码basictransceiver.h#ifndef BASICTRANSCEIVER_H#define BASICTRANSCEIVER_H#include <QMainWindow>#include "ui_basictransceiver.h"class QTimer;class SerialPortSetting;class QSerialPort;class QPushButton;class BasicTransceiver : public QMainWindow, public Ui::BasicTransceiver{Q_OBJECTpublic:explicit BasicTransceiver(QWidget *parent = 0);~BasicTransceiver();void StringToHex(QString str, QByteArray &senddata);char ConvertHexChar(char ch);void startAutoSend(QPushButton *sendButton);void setConnections();void writeHex(QTextEdit *textEdit);void writeChr(QTextEdit *textEdit);void resetCnt();protected:void dragEnterEvent(QDragEnterEvent *event); void dropEvent(QDropEvent *event);private slots:void checkAutoSendCB();void on_cleanButton_clicked();void on_receiveTextBrowser_textChanged(); void setBaudRate();void setParity();void setDataBits();void setStopBits();void setFlowCtrl();void on_connectButton_toggled(bool checked); void setComLabel();void setBaudLabel();void writeToBuf();void enabledSendButton();void disabledSendButton();void enabledAutoSend();void disabledAutoButton();void resetAutoSendCB();void readMyCom();void checkAvailablePorts();void on_checkAPButton_clicked();void checkPort();void on_resetCntButton_clicked();void on_exitButton_clicked();bool saveAs();void open();//void about();private:bool loadFile(const QString &fileName);bool readFile(const QString &fileName);bool saveFile(const QString &fileName);bool writeFile(const QString &fileName);QTimer *Timer_AS;//⾃动发送定时器QTimer *Timer_UPDATE;QTimer *Timer_CP;//定时检测串⼝是否存在SerialPortSetting *SPSetting;QSerialPort *mySerialPort;QSet<QString> portSet;QVector<int> iVec;QString senderFlag;QString readData;bool trashFlag = false;bool portIsOpen = false;int BaudCnt = 0;int ParityCnt = 0;int DataBitsCnt = 0;int StopBitsCnt = 0;int FlowCtrlCnt = 0;};#endif // BASICTRANSCEIVER_Hbasictransceiver.cpp#include "basictransceiver.h"#include "serialportsetting.h"#include "ui_basictransceiver.h"#include "ui_serialportsetting.h"#include <QtSerialPort/QSerialPort>#include <QtSerialPort/QSerialPortInfo>#include <QDebug>#include <QMessageBox>#include <QStatusBar>#include <QPushButton>#include <QByteArray>#include <QDataStream>#include <QTimer>#include <QRegExp>#include <QRegExpValidator>#include <QFile>#include <QFileDialog>#include <QDragEnterEvent>#include <QDropEvent>#include <QMimeData>#include <QAction>BasicTransceiver::BasicTransceiver(QWidget *parent) :QMainWindow(parent){setupUi(this);setFixedSize(1074, 627);receiveTextBrowser->setAcceptDrops(false);//缺省情况下,QTextEdit接受来⾃其他应⽤程序拖拽来的⽂本,把⽂件名显⽰出来。
qserialport flush用法 -回复

qserialport flush用法-回复qSerialPort是Qt框架中的一个类,用于实现串口通信。
在该类中,flush()函数用于清空串口的输入输出缓冲区。
本文将向读者介绍qSerialPort类以及flush()函数的用法,并一步一步回答与flush()函数相关的问题。
第一部分:介绍qSerialPort类qSerialPort类是Qt框架中用于串口通信的类。
它提供了一种简单而强大的方式来连接和进行数据交换。
通过qSerialPort,应用程序可以方便地与外部设备(如传感器、机器人或嵌入式系统)进行通信。
第二部分:解释flush()函数的作用flush()函数用于清空qSerialPort对象中的输入输出缓冲区。
当数据通过串口发送或接收时,通常会先存储在缓冲区中,然后再进行读取或发送操作。
使用flush()函数可以清除缓冲区中的数据,以确保接下来的读取或发送操作不会受到之前残留的数据的干扰。
第三部分:解释flush()函数的语法flush()函数是一个无参数的成员函数,可以直接在qSerialPort对象上调用。
调用该函数后,将立即清空输入输出缓冲区。
第四部分:给出flush()函数的示例代码下面是一个简单的示例代码,展示了如何使用qSerialPort类的flush()函数来清空缓冲区。
#include <QtCore/QCoreApplication> #include <QtSerialPort/QSerialPort>#include <QDebug>int main(int argc, char *argv[]){QCoreApplication a(argc, argv);创建一个串口对象QSerialPort serial;serial.setPortName("COM1");serial.open(QIODevice::ReadWrite);在向串口发送数据之前,先清空缓冲区serial.flush();发送数据serial.write("Hello, World!");在接收数据之前,先清空缓冲区serial.flush();读取数据QByteArray data = serial.readAll();qDebug() << "Received data: " << data;关闭串口serial.close();return a.exec();}在上述示例代码中,首先创建了一个串口对象serial,并通过setPortName()函数设置了串口的名称(这里假设为COM1)。
QT第三方串口类qextserialport打不开串口问题

QT第三方串口类qextserialport打不开串口问题我前面的博客提到了,在我的笔记本电脑中用QT的第三方串口类QextSerilPort打不开串口,今天终于解决了,下面简单分享一下:先说下环境:我用的是QT4.8.0,每三方的串口类QextSerialPort, USB转串口的数据线,ZEBRA888-TT的打印机(支持EPL语言);前两天我在QT中试着打开串口,怎么也打不开,奇怪的是在台式机和别人的笔记本电脑中都能打开,而且更令人不解的是我用串口调试可以正常打开串口,说明不是我的笔记本电脑出了问题,那就是QT 出了问题,具体什么问题我并不明白,今天看到一个帖子终于知道怎么解决,具体方法如下:打串口的名子应该是:port =new QextSerialPort("\\\\.\\COM11");而不应该是:port = new QextSerialPort("COM11");这样用第三方的串口类就可以轻松打开串口了,帖子具体的内容如一下:刚才去网上搜了一下:发现了问题。
这样改了。
确实能用:Com = new Win_QextSerialPort("\\\\.\\COM10", QextSerialBase::EventDriven);查到的原因:MS的软件什么事情干不出来,软件bug吧,\\\\.\\com10是标准设备名称,自然是可疑打开的,而直接用com10则经过库函数转换成标准名称才用于设备操作,库函数没考虑超过十个串口,所以出问题了。
看来网上的朋友就是牛,非常感谢网友,帖子的地址如下,大家可以一起学习一下:/u/20101127/16/e65b617a-3395-46ab-b637-2e66765453dc.html。