分享

在QT6中实现串口模块Qt6SerialPort

 myallmy 2021-12-15

最新的Qt6没有串口模块QSerialPort,只能自己去编译Qt5的源码。

1.找到QSerialPort的源码

QSerialPort源码在这里,没有源码,需要自己安装源码模块,我这里用的是5.15.2的源码。

2.构建工程

将sqerialport整个文件夹复制到其他地方,用qtcreator打开,选择编译器qt6 msvc2019 64bit

打开qtserialport.pro,有如下内容

  1. lessThan(QT_MAJOR_VERSION, 5) {
  2. message("Cannot build current QtSerialPort sources with Qt version $${QT_VERSION}.")
  3. error("Use at least Qt 5.0.0 or try to download QtSerialPort for Qt4.")
  4. }
  5. requires(!integrity)
  6. requires(!vxworks)
  7. requires(!winrt)
  8. requires(!uikit)
  9. requires(!emscripten)
  10. load(configure)
  11. qtCompileTest(ntddmodm)
  12. load(qt_parts)

load(qt_parts)替换为下面内容

  1. #load(qt_parts) 以下部分全是文件qt_parts.prf中的内容,删除了examples,test
  2. #
  3. # W A R N I N G
  4. # -------------
  5. #
  6. # This file is not part of the Qt API. It exists purely as an
  7. # implementation detail. It may change from version to version
  8. # without notice, or even be removed.
  9. #
  10. # We mean it.
  11. #
  12. # Ensure that each module has a .qmake.cache when properly qmake'd.
  13. cache()
  14. load(qt_configure)
  15. load(qt_build_config)
  16. TEMPLATE = subdirs
  17. bp = $$eval($$upper($$TARGET)_BUILD_PARTS)
  18. !isEmpty(bp): QT_BUILD_PARTS = $$bp
  19. exists($$_PRO_FILE_PWD_/src/src.pro) {
  20. sub_src.subdir = src
  21. sub_src.target = sub-src
  22. SUBDIRS += sub_src
  23. exists($$_PRO_FILE_PWD_/tools/tools.pro) {
  24. sub_tools.subdir = tools
  25. sub_tools.target = sub-tools
  26. sub_tools.depends = sub_src
  27. # conditional treatment happens on a case-by-case basis
  28. SUBDIRS += sub_tools
  29. }
  30. }
  31. QT_BUILD_PARTS -= libs tools examples tests
  32. !isEmpty(QT_BUILD_PARTS): warning("Unknown build part(s): $$QT_BUILD_PARTS")
  33. QMAKE_DISTCLEAN += \
  34. .qmake.cache \
  35. config.cache \
  36. config.log \
  37. mkspecs/modules/*.pri \
  38. mkspecs/modules-inst/*.pri
  39. tests = $$files($$_PRO_FILE_PWD_/config.tests/*.pro, true)
  40. testdirs =
  41. for (t, tests): \
  42. testdirs += $$relative_path($$dirname(t), $$_PRO_FILE_PWD_)
  43. testdirs = $$unique(testdirs)
  44. for (td, testdirs) {
  45. t = $$basename(td)-distclean
  46. $${t}.commands = -$$QMAKE_CD $$shell_path($$td) && $(MAKE) distclean
  47. QMAKE_EXTRA_TARGETS += $$t
  48. DISTCLEAN_DEPS += $$t
  49. }

然后整个项目就变为下图所示

3.修改文件内容

去掉所有文件中路径前缀QtSerialPort

  1. #include <QtSerialPort/qserialportglobal.h>
  2. //改为
  3. #include "qserialportglobal.h"

4.编译生成库文件

构建serialport工程,最后会生成如下文件。

5.使用Qt6SerialPort

该库的用法Qt5一样,经过测试可以使用。

  1. QSerialPort *m_serialPort;
  2. m_serialPort = new QSerialPort();//实例化串口类一个对象
  3. if(m_serialPort->isOpen())//如果串口已经打开了 先给他关闭了
  4. {
  5. m_serialPort->clear();
  6. m_serialPort->close();
  7. }
  8. //设置串口名字 假设我们上面已经成功获取到了 并且使用第一个
  9. m_serialPort->setPortName("COM10");
  10. m_serialPort->setBaudRate(QSerialPort::Baud9600,QSerialPort::AllDirections);//设置波特率和读写方向
  11. m_serialPort->setDataBits(QSerialPort::Data8); //数据位为8位
  12. m_serialPort->setFlowControl(QSerialPort::NoFlowControl);//无流控制
  13. m_serialPort->setParity(QSerialPort::NoParity); //无校验位
  14. m_serialPort->setStopBits(QSerialPort::OneStop); //一位停止位
  15. if(!m_serialPort->open(QIODevice::ReadWrite))//用ReadWrite 的模式尝试打开串口
  16. {
  17. qDebug()<<"COM10打开失败!";
  18. return;
  19. }
  20. connect(m_serialPort,&QSerialPort::readyRead,[this]() {
  21. QByteArray info = m_serialPort->readAll();
  22. qDebug()<<info;
  23. m_serialPort->write(info);
  24. });

源码:https://download.csdn.net/download/qq_40732350/15042644

 

 

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多