当前位置:   article > 正文

Qt之串口收发数据_qt串口通信的接收与发送

qt串口通信的接收与发送

参考:http://blog.csdn.net/u014695839/article/details/50611549

参考:http://blog.csdn.net/zbw1185/article/details/51496663

通过好几天的学习,终于写出了一个用于串口通信的上位机。下面开始介绍串口类的使用。

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

QT       += serialport

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

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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/132968
推荐阅读
相关标签
  

闽ICP备14008679号