p1p1g 2023-06-09 00:07 采纳率: 54.5%
浏览 7

关于qt串口多线程传输

我在主线程中创建打开了一个QSerialPort串口对象,又创建了个子线程任务对象,把主线程的串口对象传入给任务对象,实现在子线程中发送文件。
请问各位后面主线程还要使用这个串口对象的话该怎么操作,直接在主线程中发送信息报了如图的错误。

img

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-06-09 06:01
    关注
    • 你可以参考下这篇文章:QT QSerialPort在子线程中无法发送数据问题
    • 除此之外, 这篇博客: Qt入门教程【硬件编程】QSerialPort串口对象中的 函数 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    • //波特率
      qint32 baudRate(QSerialPort::Directions directions = AllDirections) const
      //根据给定的方向,丢弃输出或输入缓冲区中的所有字符。 这包括清除内部类缓冲区和 UART(驱动程序)缓冲区。
      //同时终止挂起的读取或写入操作。 如果成功,则返回 true; 否则返回假。
       bool clear(QSerialPort::Directions directions = AllDirections)
      //该属性保存串口的错误状态,I/O 设备状态返回错误代码。 例如,如果 open() 返回 false,或者读/写操作返回 -1,则可以使用此属性找出操作失败的原因。
      //调用 clearError() 后,错误代码设置为默认的 QSerialPort::NoError
      void clearError()
      //帧中的数据位
       QSerialPort::DataBits dataBits() const
       /*该属性保存串口的错误状态
      I/O 设备状态返回错误代码。 例如,如果 open() 返回 false,或者读/写操作返回 -1,则可以使用此属性找出操作失败的原因。
      调用 clearError() 后,错误代码设置为默认的 QSerialPort::NoError*/
       QSerialPort::SerialPortError error() const
       /* 此属性保存所需的流控制模式
      如果设置成功或者在打开端口之前设置,返回true; 否则返回 false 并设置可以通过访问 QSerialPort::error 属性的值获得的错误代码。
      注意:如果设置是在打开端口之前设置的,那么实际的串口设置是在打开端口成功后立即在 QSerialPort::open() 方法中自动完成的。
      默认值为 NoFlowControl,即无流量控制。*/
       QSerialPort::FlowControl flowControl() const
      /*  该函数尽可能多地从内部写缓冲区写入底层串口而不阻塞。 如果写入了任何数据,则此函数返回 true; 否则返回假。
      调用此函数将缓冲的数据立即发送到串口。 成功写入的字节数取决于操作系统。 在大多数情况下,不需要调用此函数,因为一旦控制权返回到事件循环,QSerialPort 类将自动开始发送数据。 在没有事件循环的情况下,请改为调用 waitForBytesWritten()。
      注意:在尝试刷新任何缓冲数据之前,必须打开串口; 否则返回 false 并设置 NotOpenError 错误代码。*/
       bool flush()
       /* 如果平台支持且串口打开,则返回本机串口句柄; 否则返回 -1。
      警告:此功能仅供专家使用; 需要您自担风险使用它。 此外,此函数在次要 Qt 版本之间没有兼容性承诺。
      这个函数是在 Qt 5.2 中引入的。*/
       QSerialPort::Handle handle() const
      /* 该属性保持传输线处于中断状态
       成功返回真,否则返回假。 如果标志为真,则传输线处于中断状态; 否则处于非中断状态。
       注意:在尝试设置或获取此属性之前,必须打开串口; 否则返回 false 并设置 NotOpenError 错误代码。 与类的常规 Qt 属性设置相比,这有点不寻常。 但是,这是一  个特殊的用例,因为该属性是通过与内核和硬件的交互来设置的。 因此,这两种情况不能完全相互比较。
       这个属性是在 Qt 5.5 中引入的。*/
       bool isBreakEnabled() const
       //此属性保存线路信号 DTR 的状态(高或低)
       bool isDataTerminalReady()
       //此属性保存线路信号 RTS 的状态(高或低)
       bool isRequestToSend()
       //该属性持有奇偶校验模式
      //如果设置成功或者在打开端口之前设置,返回true; 否则返回 false 并设置可以通过访问 QSerialPort::error 属性的值获得的错误代码。
      //注意:如果设置是在打开端口之前设置的,那么实际的串口设置是在打开端口成功后立即在 QSerialPort::open() 方法中自动完成的。
      //默认值为 NoParity,即无奇偶校验。
       QSerialPort::Parity parity() const
       //以位图格式返回线路信号的状态。
      //根据这个结果,可以通过应用掩码“AND”来分配所需信号的状态,其中掩码是来自 QSerialPort::PinoutSignals 的所需枚举值。
      //注意:此方法执行系统调用,从而确保正确返回线路信号状态。 当底层操作系统无法提供有关更改的适当通知时,这是必要的。
      //注意:在尝试获取引脚分配信号之前,必须打开串口; 否则返回 NoSignal 并设置 NotOpenError 错误代码。
       QSerialPort::PinoutSignals pinoutSignals()
       QString portName() const
       //读取缓冲区大小
       qint64 readBufferSize() const
       //如果终端正在使用异步串行数据,则在以毫秒为单位的指定时间段内发送连续的零位流。 如果成功,则返回 true; 否则返回假。
      //如果持续时间为零,则传输零位至少 0.25 秒,但不超过 0.5 秒。
      //如果持续时间不为零,则根据实现在特定时间段内传输零位。
      //注意:在尝试发送中断持续时间之前,必须打开串口; 否则返回 false 并设置 NotOpenError 错误代码。
       bool sendBreak(int duration = 0)
       bool setBaudRate(qint32 baudRate, QSerialPort::Directions directions = AllDirections)
       bool setBreakEnabled(bool set = true)
       bool setDataBits(QSerialPort::DataBits dataBits)
       bool setDataTerminalReady(bool set)
       bool setFlowControl(QSerialPort::FlowControl flowControl)
       bool setParity(QSerialPort::Parity parity)
       void setPort(const QSerialPortInfo &serialPortInfo)
       void setPortName(const QString &name)
       void setReadBufferSize(qint64 size)
       bool setRequestToSend(bool set)
       //设置停止位
       bool setStopBits(QSerialPort::StopBits stopBits)
       //停止位
       QSerialPort::StopBits stopBits() const
      
    • 您还可以看一下 安晓辉老师的Qt项目实战之网络电子白板课程中的 客户端与服务器联调之处理删除与清除消息小节, 巩固相关知识点
    评论

报告相同问题?

问题事件

  • 创建了问题 6月9日

悬赏问题

  • ¥100 复现论文:matlab仿真代码编写
  • ¥15 esp32驱动GC9A01循环播放视频
  • ¥15 惠普360g9的最新bios
  • ¥30 这个功能用什么软件发合适?
  • ¥60 微信小程序,取消订单,偶尔订单没有改变状态
  • ¥15 用pytorch实现PPO算法
  • ¥15 关于调制信号的星座图?
  • ¥30 前端传参时,后端接收不到参数
  • ¥15 这是有什么问题吗,我检查许可证了但是显示有呢
  • ¥15 机器学习预测遇到的目标函数问题