Qt串口通信开发之QSerialPort模块简单使用方法与实例

时间:2022-11-09 19:12:05

我这里主要是对串口类的简单使用,实现的功能是以读写方式打开串口,点击发送数据按钮将发送区的数据发送到缓冲区,然后在接收区显示出来,界面如下:(源码可以在这里下载)

Qt串口通信开发之QSerialPort模块简单使用方法与实例

这里使用了QSerialPort模块提供的两个类:QSerialPort类和QSerialPortInfo类,QSerialPort类提供了对串口的操作,QSerialPortInfo类提供了对串口信息的获取。下面是主要代码,包含了对串口类的简单使用。

首先,一定要在.pro文件中添加:QT += serialport

串口初始化如下:

  1. /****************************串口初始化*****************************/
  2. void MainWindow::initPort()
  3. {
  4. //读取串口信息
  5. foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
  6. {
  7. qDebug()<<"Name:"<<info.portName();
  8. qDebug()<<"Description:"<<info.description();
  9. qDebug()<<"Manufacturer:"<<info.manufacturer();
  10.  
  11. //这里相当于自动识别串口号之后添加到了cmb,如果要手动选择可以用下面列表的方式添加进去
  12. QSerialPort serial;
  13. serial.setPort(info);
  14. if(serial.open(QIODevice::ReadWrite))
  15. {
  16. //将串口号添加到cmb
  17. ui->cmbPortName->addItem(info.portName());
  18. //关闭串口等待人为(打开串口按钮)打开
  19. serial.close();
  20. }
  21. }
  22.  
  23. QStringList baudList;//波特率
  24. QStringList parityList;//校验位
  25. QStringList dataBitsList;//数据位
  26. QStringList stopBitsList;//停止位
  27.  
  28. baudList<<"50"<<"75"<<"100"<<"134"<<"150"<<"200"<<"300"
  29. <<"600"<<"1200"<<"1800"<<"2400"<<"4800"<<"9600"
  30. <<"14400"<<"19200"<<"38400"<<"56000"<<"57600"
  31. <<"76800"<<"115200"<<"128000"<<"256000";
  32.  
  33. ui->cmbBaudRate->addItems(baudList);
  34. ui->cmbBaudRate->setCurrentIndex(12);
  35.  
  36. parityList<<"无"<<"奇"<<"偶";
  37. parityList<<"标志";
  38. parityList<<"空格";
  39.  
  40. ui->cmbParity->addItems(parityList);
  41. ui->cmbParity->setCurrentIndex(0);
  42.  
  43. dataBitsList<<"5"<<"6"<<"7"<<"8";
  44. ui->cmbDataBits->addItems(dataBitsList);
  45. ui->cmbDataBits->setCurrentIndex(3);
  46.  
  47. stopBitsList<<"1";
  48. stopBitsList<<"1.5";
  49. stopBitsList<<"2";
  50.  
  51. ui->cmbStopBits->addItems(stopBitsList);
  52. ui->cmbStopBits->setCurrentIndex(0);
  53.  
  54. //设置按钮可以被按下
  55. ui->btnOpen->setCheckable(true);
  56. }

这里通过遍历所有串口将我们需要使用的串口添加到了combox中,如果想要手动选择可以将串口名称通过列表的方式添加到combox中,到使用的时候再选择。

串口设置如下:

  1. /****************************串口设置******************************/
  2. void MainWindow::on_btnOpen_clicked()
  3. {
  4. if(ui->btnOpen->text() == "打开串口")
  5. {
  6. my_serialport = new QSerialPort(this);
  7.  
  8. //设置串口号
  9. my_serialport->setPortName(ui->cmbPortName->currentText());
  10. //以读写方式打开串口
  11. if(my_serialport->open(QIODevice::ReadWrite))
  12. {
  13. //设置波特率
  14. my_serialport->setBaudRate(ui->cmbBaudRate->currentText().toInt());
  15. //设置数据位
  16. my_serialport->setDataBits(QSerialPort::Data8);
  17. //设置校验位
  18. my_serialport->setParity(QSerialPort::NoParity);
  19. //设置流控制
  20. my_serialport->setFlowControl(QSerialPort::NoFlowControl);
  21. //设置停止位
  22. my_serialport->setStopBits(QSerialPort::OneStop);
  23.  
  24. //每秒读一次
  25. timer = new QTimer(this);
  26. connect(timer, SIGNAL(timeout()), this, SLOT(readComDataSlot()));
  27. timer->start(1000);
  28.  
  29. setNonSelectable();
  30. }
  31. else
  32. {
  33. QMessageBox::about(NULL, "提示", "串口没有打开!");
  34. return;
  35. }
  36. }
  37. else
  38. {
  39. timer->stop();
  40. setSelectable();
  41. my_serialport->close();
  42. }
  43. }

这里是对串口的设置,需要先打开串口才能设置串口参数。参数设置好之后就可以通过read()和write()函数进行数据的读写,我这里用的是1秒的定时器来读缓冲区的数据。

数据收发如下:

  1. /****************************数据传输******************************/
  2. void MainWindow::readComDataSlot()
  3. {
  4. //读取串口数据
  5. QByteArray readComData = my_serialport->readAll();
  6.  
  7. //将读到的数据显示到数据接收区的te中
  8. if(readComData != NULL)
  9. {
  10. ui->teReceiveData->append(readComData);
  11. }
  12.  
  13. //清除缓冲区
  14. readComData.clear();
  15. }
  16.  
  17. void MainWindow::on_btnSend_clicked()
  18. {
  19. //获取发送区的数据
  20. QString sendData = ui->teSendData->toPlainText();
  21. QByteArray sendData_2 = sendData.toLatin1();
  22.  
  23. //写入缓冲区
  24. my_serialport->write(sendData_2);
  25. }

本文简单介绍了下Qt串口通信模块QSerialPort简单使用方法与实例,更详细的Qt串口通信模块QSerialPort知识请查看下面的相关链接

原文链接:https://blog.csdn.net/lmhuanying1012/article/details/78747737