Qt 串口收发数据

Qt 串口收发数据

用于串口通信的上位机。下面开始介绍串口类的使用。

首先,QT5是自带QSerialPort这个类的,使用时需要在pro文件里面添加一行:

QT       += serialport

然后直接引用头文件就可以使用了。

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

QSerialPort:提供访问串口的功能

QSerialPortInfo:提供系统中存在的串口的信息

接下来需要创建一个QSerialPort的对象,对串口的名称、波特率、数据位、校验位、停止位等参数进行设置,然后才进行串口读写操作。
大概总结了一下,设置、读、写的过程。

CSDN QT开发路线推荐:Qt开发必备技术栈学习路线和资料

一、设置(举例)

 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位,没有流控制。设置完这些就能进行读写操作了。作为一名新手,发现遇到不懂得可以在QtCreator里面可以选择关键字,按F1打开文档看类、函数等数据的手册。

二、读取数据

1 void MainWindow::Read_Data()  
2 {  
3     QByteArray buf;  
4     buf = serial->readAll();  
5 }

当串口收到数据并且接收完毕后,会发出一个readyRead()的信号,因此只需要编写一个槽函数Read_Data(),设置信号槽,并在槽函数中使用readAll()把收到的数据读到buf中。

三、发送数据

serial->write(data);  

使用write函数便可以把字符串data一个个字节发送出去。

使用串口就只需以上步骤,使用完后只需要执行

serial->close();

就可以关闭串口了。我使用了ui界面设计来编写上位机的,界面如下:

代码如下:

 1 //mianwindow.h  
 2 #ifndef MAINWINDOW_H  
 3 #define MAINWINDOW_H  
 4 #include <QMainWindow>  
 5 #include <QDebug>  
 6 #include <QtSerialPort/QSerialPort>  
 7 #include <QtSerialPort/QSerialPortInfo>  
 8 namespace Ui {  
 9 class MainWindow;  
10 }  
11 class MainWindow : public QMainWindow  
12 {  
13     Q_OBJECT  
14 public:  
15     explicit MainWindow(QWidget *parent = 0);  
16     ~MainWindow();  
17 private slots:  
18     void on_clearButton_clicked();  
19     void on_sendButton_clicked();  
20     void on_openButton_clicked();  
21     void Read_Data();  
22 private:  
23     Ui::MainWindow *ui;  
24     QSerialPort *serial;  
25 };  
26 #endif // MAINWINDOW_H
  1 //mainwindow.c  
  2 #include "mainwindow.h"  
  3 #include "ui_mainwindow.h"  
  4   
  5 MainWindow::MainWindow(QWidget *parent) :  
  6     QMainWindow(parent),  
  7     ui(new Ui::MainWindow)  
  8 {  
  9     ui->setupUi(this);  
 10     //查找可用的串口  
 11     foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())  
 12     {  
 13         QSerialPort serial;  
 14         serial.setPort(info);  
 15         if(serial.open(QIODevice::ReadWrite))  
 16         {  
 17             ui->PortBox->addItem(serial.portName());  
 18             serial.close();  
 19         }  
 20     }  
 21     //设置波特率下拉菜单默认显示第三项  
 22     ui->BaudBox->setCurrentIndex(3);  
 23     //关闭发送按钮的使能  
 24     ui->sendButton->setEnabled(false);  
 25     qDebug() << tr("界面设定成功!");  
 26 }  
 27 MainWindow::~MainWindow()  
 28 {  
 29     delete ui;  
 30 }  
 31 //清空接受窗口  
 32 void MainWindow::on_clearButton_clicked()  
 33 {  
 34     ui->textEdit->clear();  
 35 }  
 36 //发送数据  
 37 void MainWindow::on_sendButton_clicked()  
 38 {  
 39     serial->write(ui->textEdit_2->toPlainText().toLatin1());  
 40 }  
 41 //读取接收到的数据  
 42 void MainWindow::Read_Data()  
 43 {  
 44     QByteArray buf;  
 45     buf = serial->readAll();  
 46     if(!buf.isEmpty())  
 47     {  
 48         QString str = ui->textEdit->toPlainText();  
 49         str+=tr(buf);  
 50         ui->textEdit->clear();  
 51         ui->textEdit->append(str);  
 52     }  
 53     buf.clear();  
 54 }  
 55 void MainWindow::on_openButton_clicked()  
 56 {  
 57     if(ui->openButton->text()==tr("打开串口"))  
 58     {  
 59         serial = new QSerialPort;  
 60         //设置串口名  
 61         serial->setPortName(ui->PortBox->currentText());  
 62         //打开串口  
 63         serial->open(QIODevice::ReadWrite);  
 64         //设置波特率  
 65         serial->setBaudRate(ui->BaudBox->currentText().toInt());  
 66         //设置数据位数  
 67         switch(ui->BitNumBox->currentIndex())  
 68         {  
 69         case 8: serial->setDataBits(QSerialPort::Data8); break;  
 70         default: break;  
 71         }  
 72         //设置奇偶校验  
 73         switch(ui->ParityBox->currentIndex())  
 74         {  
 75         case 0: serial->setParity(QSerialPort::NoParity); break;  
 76         default: break;  
 77         }  
 78         //设置停止位  
 79         switch(ui->StopBox->currentIndex())  
 80         {  
 81         case 1: serial->setStopBits(QSerialPort::OneStop); break;  
 82         case 2: serial->setStopBits(QSerialPort::TwoStop); break;  
 83         default: break;  
 84         }  
 85         //设置流控制  
 86         serial->setFlowControl(QSerialPort::NoFlowControl);  
 87         //关闭设置菜单使能  
 88         ui->PortBox->setEnabled(false);  
 89         ui->BaudBox->setEnabled(false);  
 90         ui->BitNumBox->setEnabled(false);  
 91         ui->ParityBox->setEnabled(false);  
 92         ui->StopBox->setEnabled(false);  
 93         ui->openButton->setText(tr("关闭串口"));  
 94         ui->sendButton->setEnabled(true);  
 95         //连接信号槽  
 96         QObject::connect(serial, &QSerialPort::readyRead, this, &MainWindow::Read_Data);  
 97     }  
 98     else  
 99     {  
100         //关闭串口  
101         serial->clear();  
102         serial->close();  
103         serial->deleteLater();  
104         //恢复设置使能  
105         ui->PortBox->setEnabled(true);  
106         ui->BaudBox->setEnabled(true);  
107         ui->BitNumBox->setEnabled(true);  
108         ui->ParityBox->setEnabled(true);  
109         ui->StopBox->setEnabled(true);  
110         ui->openButton->setText(tr("打开串口"));  
111         ui->sendButton->setEnabled(false);  
112     }  
113 } 
 1 //main.c  
 2 #include "mainwindow.h"  
 3 #include <QApplication>  
 4 int main(int argc, char *argv[])  
 5 {  
 6     QApplication a(argc, argv);  
 7     MainWindow w;  
 8     w.show();  
 9     return a.exec();  
10 } 

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

  • 3
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Qt串口数据解析是指在Qt开发环境中对串口接收到的数据进行解析处理的过程。 首先,需要在Qt中打开串口,并设置对应的波特率、数据位、停止位和校验位等参数。然后,通过监听串口接收到的数据,使用Qt提供的读取数据的函数对数据进行读取。 接收到的串口数据通常是二进制的形式。要对数据进行解析,首先需要根据数据的协议进行拆包操作。拆包的操作根据不同的协议会有所区别,可以根据数据的长度、起始标志位等进行处理。拆包后得到的数据可以是数字、字符或者其他类型。 对于数字数据,可以使用Qt内置的函数将二进制数据转换为对应的整数或浮点数。例如,使用QByteArray的toHex()函数可以将二进制数据转换为十六进制表示的字符串,使用QByteArray的toInt()函数可以将二进制数据转换为整数。 对于字符数据,可以使用QString的构造函数将二进制数据转换为字符串。例如,使用QString的fromUtf8()函数将二进制数据转换为UTF-8编码的字符串。 在解析过程中,还需要考虑数据的格式和顺序。如果数据是按照特定的格式排列的,可以使用结构体等数据结构进行解析。如果数据是按照顺序传输的,可以使用计数器等方式进行解析。 最后,根据解析后得到的数据进行相应的处理。可以将数据显示到界面上,存储到文件中,进行计算等操作。 总之,Qt串口数据解析是通过对串口接收到的数据进行拆包、转换和处理等操作,将二进制数据转换为可识别的数据形式的过程。通过理解数据的协议、格式和顺序,可以实现对串口数据的准确解析和应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值