QT5串口编写简单的上位机
2016-01-30 15:51
686 查看
最近在学习嵌入式,而上位机又是一个不可缺少的工具,于是就开始接触QT,学习编写上位机。刚开始的时候什么都不懂,发现http://www.devbean.net/2012/08/qt-study-road-2-catelog/这里有比较好的入门教程。学习了前面部分(我只看到了事件...),对QT有了大概的了解后,就开始在网上寻找上位机的编写方法。通过好几天的学习,终于写出了一个用于串口通信的上位机。下面开始介绍串口类的使用。
首先,QT5是自带QSerialPort这个类的,使用时需要在pro文件里面添加一行:
QT += serialport
然后直接引用头文件就可以使用了。
QSerialPort:提供访问串口的功能
QSerialPortInfo:提供系统中存在的串口的信息
接下来需要创建一个QSerialPort的对象,对串口的名称、波特率、数据位、校验位、停止位等参数进行设置,然后才进行串口读写操作。
大概总结了一下,设置、读、写的过程。
一、设置(举例):
二、读取数据
当串口收到数据并且接收完毕后,会发出一个readyRead()的信号,因此只需要编写一个槽函数Read_Data(),设置信号槽,并在槽函数中使用readAll()把收到的数据读到buf中。
三、发送数据
使用串口就只需以上步骤,使用完后只需要执行
我使用了ui界面设计来编写上位机的,界面如下:
![](http://img.blog.csdn.net/20160131131526600?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
代码如下:
工程文件在这里可以下载:
http://download.csdn.net/detail/u014695839/9423213
希望大家在学习过程中相互交流。如果文章有错误,欢迎大家指出!
首先,QT5是自带QSerialPort这个类的,使用时需要在pro文件里面添加一行:
QT += serialport
然后直接引用头文件就可以使用了。
#include <QtSerialPort/QSerialPort> #include <QtSerialPort/QSerialPortInfo>
QSerialPort:提供访问串口的功能
QSerialPortInfo:提供系统中存在的串口的信息
接下来需要创建一个QSerialPort的对象,对串口的名称、波特率、数据位、校验位、停止位等参数进行设置,然后才进行串口读写操作。
大概总结了一下,设置、读、写的过程。
一、设置(举例):
QSerialPort *serial = new QSerialPort; //设置串口名 serial->setPortName(name); //打开串口 serial->open(QIODevice::ReadWrite); //设置波特率 serial->setBaudRate(BaudRate); //设置数据位数 serial->setDataBits(QSerialPort::Data8); //设置奇偶校验 serial->setParity(QSerialPort::NoParity); //设置停止位 serial->setStopBits(QSerialPort::OneStop); //设置流控制 serial->setFlowControl(QSerialPort::NoFlowControl);这里设置了串口名为name,打开串口并设置为可读可写,波特率为BaudRate,数据位为8位,没有奇偶校验位,停止位为1位,没有流控制。设置完这些就能进行读写操作了。作为一名新手,发现遇到不懂得可以在QtCreator里面可以选择关键字,按F1打开文档看类、函数等数据的手册。
二、读取数据
void MainWindow::Read_Data() { QByteArray buf; buf = serial->readAll(); }
当串口收到数据并且接收完毕后,会发出一个readyRead()的信号,因此只需要编写一个槽函数Read_Data(),设置信号槽,并在槽函数中使用readAll()把收到的数据读到buf中。
三、发送数据
serial->write(data);使用write函数便可以把字符串data一个个字节发送出去。
使用串口就只需以上步骤,使用完后只需要执行
serial->close();就可以关闭串口了。
我使用了ui界面设计来编写上位机的,界面如下:
代码如下:
//mianwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QDebug>
#include <QtSerialPort/QSerialPort> #include <QtSerialPort/QSerialPortInfo>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_clearButton_clicked();
void on_sendButton_clicked();
void on_openButton_clicked();
void Read_Data();
private:
Ui::MainWindow *ui;
QSerialPort *serial;
};
#endif // MAINWINDOW_H
//mainwindow.c #include "mainwindow.h" #include "ui_mainwindow.h" #include "mythread.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); //查找可用的串口 foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) { QSerialPort serial; serial.setPort(info); if(serial.open(QIODevice::ReadWrite)) { ui->PortBox->addItem(serial.portName()); serial.close(); } } //设置波特率下拉菜单默认显示第三项 ui->BaudBox->setCurrentIndex(3); //关闭发送按钮的使能 ui->sendButton->setEnabled(false); qDebug() << tr("界面设定成功!"); } MainWindow::~MainWindow() { delete ui; } //清空接受窗口 void MainWindow::on_clearButton_clicked() { ui->textEdit->clear(); } //发送数据 void MainWindow::on_sendButton_clicked() { serial->write(ui->textEdit_2->toPlainText().toLatin1()); } //读取接收到的数据 void MainWindow::Read_Data() { QByteArray buf; buf = serial->readAll(); if(buf!=NULL) { QString str = ui->textEdit->toPlainText(); str+=tr(buf); ui->textEdit->clear(); ui->textEdit->append(str); } buf.clear(); } void MainWindow::on_openButton_clicked() { if(ui->openButton->text()==tr("打开串口")) { serial = new QSerialPort; //设置串口名 serial->setPortName(ui->PortBox->currentText()); //打开串口 serial->open(QIODevice::ReadWrite); //设置波特率 serial->setBaudRate(ui->BaudBox->currentText().toInt()); //设置数据位数 switch(ui->BitNumBox->currentIndex()) { case 8: serial->setDataBits(QSerialPort::Data8); break; default: break; } //设置奇偶校验 switch(ui->ParityBox->currentIndex()) { case 0: serial->setParity(QSerialPort::NoParity); break; default: break; } //设置停止位 switch(ui->StopBox->currentIndex()) { case 1: serial->setStopBits(QSerialPort::OneStop); break; case 2: serial->setStopBits(QSerialPort::TwoStop); break; default: break; } //设置流控制 serial->setFlowControl(QSerialPort::NoFlowControl); //关闭设置菜单使能 ui->PortBox->setEnabled(false); ui->BaudBox->setEnabled(false); ui->BitNumBox->setEnabled(false); ui->ParityBox->setEnabled(false); ui->StopBox->setEnabled(false); ui->openButton->setText(tr("关闭串口")); ui->sendButton->setEnabled(true); //连接信号槽 QObject::connect(serial, &QSerialPort::readyRead, this, &MainWindow::Read_Data); } else { //关闭串口 serial->clear(); serial->close(); serial->deleteLater(); //恢复设置使能 ui->PortBox->setEnabled(true); ui->BaudBox->setEnabled(true); ui->BitNumBox->setEnabled(true); ui->ParityBox->setEnabled(true); ui->StopBox->setEnabled(true); ui->openButton->setText(tr("打开串口")); ui->sendButton->setEnabled(false); } }
//main.c #include "mainwindow.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); }
工程文件在这里可以下载:
http://download.csdn.net/detail/u014695839/9423213
希望大家在学习过程中相互交流。如果文章有错误,欢迎大家指出!
相关文章推荐
- Qt中文件类型过滤器
- OSG+QT5+vs2010编译
- Qt——信号槽连接:基于字符串与基于函数的连接之间的不同
- 将DLL和EXE打包成一个EXE
- 利用Qt自带的windeployqt复制依赖文件
- Qt序列化格式分析(qint,QString)(非常简单好用)
- 使用Visual Studio(VS)开发Qt程序代码提示功能的实现
- Qt浅谈之右下角浮出界面
- Debian8.1-x64下安装Qt5.5.1+sip4.17+QScintilla-gpl-2.9.1+PyQt-gpl-5.5.1+eric6-6.1.1
- 基于Qt5图形视图框架的“俄罗斯方块”
- Qt调用摄像头(截取并保存图片)
- error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2”
- QT5 添加 newtwork 库后还是无法找到库(LNK2019)的解决方法
- Qt5 多显示器获取不同显示器的分辨率和位置的方法
- QT create快捷键
- qt qml中PropertyAnimation的几种使用方法
- QTP知识点总结
- Using the Qt Creator IDE with non Qt projects
- how to get current path in qt
- how to add external library in qt under ubuntu