image.png

image.png
在.pro文件添加 serialport

  1. QT += core gui serialport

dialog.h

  1. #ifndef DIALOG_H
  2. #define DIALOG_H
  3. #include <QDialog>
  4. #include <QSerialPort>
  5. namespace Ui {
  6. class Dialog;
  7. }
  8. class Dialog : public QDialog
  9. {
  10. Q_OBJECT
  11. public:
  12. explicit Dialog(QWidget *parent = 0);
  13. ~Dialog();
  14. bool mIsOpen = false; // 判断串口是否连接成功
  15. bool getSerialPortConfig(); // 打开串口函数
  16. private slots:
  17. void on_buttonOpenClear_clicked();
  18. void on_buttonSend_clicked();
  19. // 读取文件槽函数
  20. void on_SerialPort_readyRead();
  21. private:
  22. Ui::Dialog *ui;
  23. QSerialPort mSerialPort; // 串口变量
  24. };
  25. #endif // DIALOG_H

dialog.cpp

  1. #include "dialog.h"
  2. #include "ui_dialog.h"
  3. #include <QDebug>
  4. #include <QSerialPortInfo>
  5. #include <QSerialPort>
  6. Dialog::Dialog(QWidget *parent) :
  7. QDialog(parent),
  8. ui(new Ui::Dialog)
  9. {
  10. ui->setupUi(this);
  11. this->setWindowTitle("串口调试");
  12. // 智能识别当前系统的有效串口号
  13. QList<QSerialPortInfo> serialPortInfo = QSerialPortInfo::availablePorts();
  14. int count = serialPortInfo.count();
  15. for(int i = 0; i<count; i++)
  16. {
  17. // serialPortInfo.at(i).portName() 获取端口号
  18. // serialPortInfo.at(i).description() 获取端口号描述
  19. QString comStr = QString("%1 %2").arg(serialPortInfo.at(i).portName())
  20. .arg(serialPortInfo.at(i).description());
  21. ui->comPortName->addItem(comStr);
  22. }
  23. // 波特率
  24. ui->comBaudRate->addItem("110");
  25. ui->comBaudRate->addItem("300");
  26. ui->comBaudRate->addItem("600");
  27. ui->comBaudRate->addItem("1200");
  28. ui->comBaudRate->addItem("2400");
  29. ui->comBaudRate->addItem("4800");
  30. ui->comBaudRate->addItem("9600");
  31. ui->comBaudRate->addItem("14400");
  32. ui->comBaudRate->addItem("19200");
  33. ui->comBaudRate->addItem("115200");
  34. // 校验位
  35. ui->comParity->addItem("NONE");
  36. ui->comParity->addItem("ODD");
  37. ui->comParity->addItem("EVEN");
  38. ui->comParity->addItem("MARK");
  39. ui->comParity->addItem("SPACE");
  40. // 数据位
  41. ui->comDataBits->addItem("5");
  42. ui->comDataBits->addItem("6");
  43. ui->comDataBits->addItem("7");
  44. ui->comDataBits->addItem("8");
  45. // 停止位
  46. ui->comStopBits->addItem("1");
  47. ui->comStopBits->addItem("1.5");
  48. ui->comStopBits->addItem("2");
  49. ui->buttonSend->setEnabled(false);
  50. // connect(&mSerialPort, SIGNAL(readyRead()), this, SLOT(on_SerialPort_readyRead()));
  51. // 读取数据
  52. connect(&mSerialPort, &QSerialPort::readyRead, this, &Dialog::on_SerialPort_readyRead);
  53. }
  54. // 打开串口函数
  55. bool Dialog::getSerialPortConfig()
  56. {
  57. // 获取选择框的当前值
  58. QString name = ui->comPortName->currentText().split(" ")[0];
  59. QString rate = ui->comBaudRate->currentText();
  60. QString parity = ui->comParity->currentText();
  61. QString dataBits = ui->comDataBits->currentText();
  62. QString stopBits = ui->comStopBits->currentText();
  63. // 设置端口号
  64. mSerialPort.setPortName(name);
  65. // 设置波特率
  66. if(rate == "9600") {
  67. mSerialPort.setBaudRate(QSerialPort::Baud9600);
  68. }else if(rate == "19200"){
  69. mSerialPort.setBaudRate(QSerialPort::Baud19200);
  70. }else if(rate == "115200"){
  71. mSerialPort.setBaudRate(QSerialPort::Baud115200);
  72. }
  73. // 设置校验位
  74. if(parity == "NONE") {
  75. mSerialPort.setParity(QSerialPort::NoParity);
  76. }else if(parity == "ODD"){
  77. mSerialPort.setParity(QSerialPort::OddParity);
  78. }else if(parity == "EVEN"){
  79. mSerialPort.setParity(QSerialPort::EvenParity);
  80. }else if(parity == "MARK"){
  81. mSerialPort.setParity(QSerialPort::MarkParity);
  82. }else if(parity == "SPACE"){
  83. mSerialPort.setParity(QSerialPort::SpaceParity);
  84. }
  85. // 设置数据位
  86. if(dataBits == "5") {
  87. mSerialPort.setDataBits(QSerialPort::Data5);
  88. }else if(dataBits == "6"){
  89. mSerialPort.setDataBits(QSerialPort::Data6);
  90. }else if(dataBits == "7"){
  91. mSerialPort.setDataBits(QSerialPort::Data7);
  92. }else {
  93. mSerialPort.setDataBits(QSerialPort::Data8);
  94. }
  95. // 设置停止位
  96. if(stopBits == "1.5"){
  97. mSerialPort.setStopBits(QSerialPort::OneAndHalfStop);
  98. }else if(dataBits == "2"){
  99. mSerialPort.setStopBits(QSerialPort::TwoStop);
  100. }else {
  101. mSerialPort.setStopBits(QSerialPort::OneStop);
  102. }
  103. // 打开 以读写方式打开
  104. bool isOpen = mSerialPort.open(QSerialPort::ReadWrite);
  105. if(isOpen == true)
  106. {
  107. qDebug() << "成功打开窗口" << name;
  108. }
  109. // 返回bool值
  110. return isOpen;
  111. }
  112. Dialog::~Dialog()
  113. {
  114. delete ui;
  115. }
  116. void Dialog::on_buttonOpenClear_clicked()
  117. {
  118. if(true == mIsOpen)
  119. {
  120. mIsOpen = false;
  121. // 关闭串口
  122. mSerialPort.close();
  123. ui->buttonOpenClear->setText("打开");
  124. // 开启按钮
  125. ui->comPortName->setEnabled(true);
  126. ui->comBaudRate->setEnabled(true);
  127. ui->comParity->setEnabled(true);
  128. ui->comDataBits->setEnabled(true);
  129. ui->comStopBits->setEnabled(true);
  130. // 关闭发送按钮
  131. ui->buttonSend->setEnabled(false);
  132. }else {
  133. if(true == getSerialPortConfig())
  134. {
  135. mIsOpen = true;
  136. // 关闭按钮
  137. ui->buttonOpenClear->setText("关闭");
  138. ui->comPortName->setEnabled(false);
  139. ui->comBaudRate->setEnabled(false);
  140. ui->comParity->setEnabled(false);
  141. ui->comDataBits->setEnabled(false);
  142. ui->comStopBits->setEnabled(false);
  143. // 开启发送按钮
  144. ui->buttonSend->setEnabled(true);
  145. }
  146. }
  147. }
  148. // 发送数据槽函数
  149. void Dialog::on_buttonSend_clicked()
  150. {
  151. if(true == mIsOpen)
  152. {
  153. QString str = ui->textEditWrite->toPlainText();
  154. // 发送数据
  155. mSerialPort.write(str.toUtf8().data());
  156. }
  157. }
  158. // 接收数据槽函数
  159. void Dialog::on_SerialPort_readyRead()
  160. {
  161. // 取出所有的数据
  162. QByteArray recvData = mSerialPort.readAll();
  163. // 转码,支持中文
  164. QString str = QString::fromLocal8Bit( recvData );
  165. qDebug() << str;
  166. // 将数据写到文本框中
  167. ui->textEditRead->append(str);
  168. }