QT5串口编写简单的上位机

来源:互联网 发布:苹果cms忘记登录密码 编辑:程序博客网 时间:2024/05/16 05:50

本文转自:http://blog.csdn.net/u014695839/article/details/50611549


最近在学习嵌入式,而上位机又是一个不可缺少的工具,于是就开始接触QT,学习编写上位机。刚开始的时候什么都不懂,发现http://www.devbean.net/2012/08/qt-study-road-2-catelog/这里有比较好的入门教程。学习了前面部分(我只看到了事件...),对QT有了大概的了解后,就开始在网上寻找上位机的编写方法。通过好几天的学习,终于写出了一个用于串口通信的上位机。下面开始介绍串口类的使用。

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

QT       += serialport

然后直接引用头文件就可以使用了。
[cpp] view plain copy
  1. #include <QtSerialPort/QSerialPort>  
  2. #include <QtSerialPort/QSerialPortInfo>  

QSerialPort:提供访问串口的功能 

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

接下来需要创建一个QSerialPort的对象,对串口的名称、波特率、数据位、校验位、停止位等参数进行设置,然后才进行串口读写操作。
大概总结了一下,设置、读、写的过程。
一、设置(举例):
[cpp] view plain copy
  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打开文档看类、函数等数据的手册。

二、读取数据
[cpp] view plain copy
  1. void MainWindow::Read_Data()  
  2. {  
  3.     QByteArray buf;  
  4.     buf = serial->readAll();  
  5. }  

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


三、发送数据
[cpp] view plain copy
  1. serial->write(data);  
使用write函数便可以把字符串data一个个字节发送出去。

使用串口就只需以上步骤,使用完后只需要执行
[cpp] view plain copy
  1. serial->close();  
就可以关闭串口了。


我使用了ui界面设计来编写上位机的,界面如下:


代码如下:
[cpp] view plain copy
  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  

[cpp] view plain copy
  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.         defaultbreak;  
  71.         }  
  72.         //设置奇偶校验  
  73.         switch(ui->ParityBox->currentIndex())  
  74.         {  
  75.         case 0: serial->setParity(QSerialPort::NoParity); break;  
  76.         defaultbreak;  
  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.         defaultbreak;  
  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. }  

[cpp] view plain copy
  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. }  


工程文件在这里可以下载:

版本一:已经被下载很多次了,但因为评论里的小伙伴提出了一些小问题,已经修改更新并重新上传到版本二了

http://download.csdn.net/detail/u014695839/9423213

版本二:删除mythread.h和mythread.c以及代码里面多余的#include "mythread.h",Read_Data()槽函数里的if(buf!=NULL)改成了if(!buf.isEmpty())

http://download.csdn.net/detail/u014695839/9763670

以上程序若有问题,大家及时提醒,我定会马上更正!

希望大家在学习过程中相互交流。如果文章有错误,欢迎大家指出!