关于qt串口多线程传输

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

img

  • 你可以参考下这篇文章: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项目实战之网络电子白板课程中的 客户端与服务器联调之处理删除与清除消息小节, 巩固相关知识点