我在主线程中创建打开了一个QSerialPort串口对象,又创建了个子线程任务对象,把主线程的串口对象传入给任务对象,实现在子线程中发送文件。
请问各位后面主线程还要使用这个串口对象的话该怎么操作,直接在主线程中发送信息报了如图的错误。
关于qt串口多线程传输
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
1条回答 默认 最新
关注 - 你可以参考下这篇文章: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项目实战之网络电子白板课程中的 客户端与服务器联调之处理删除与清除消息小节, 巩固相关知识点
解决 无用评论 打赏 举报
悬赏问题
- ¥100 复现论文:matlab仿真代码编写
- ¥15 esp32驱动GC9A01循环播放视频
- ¥15 惠普360g9的最新bios
- ¥30 这个功能用什么软件发合适?
- ¥60 微信小程序,取消订单,偶尔订单没有改变状态
- ¥15 用pytorch实现PPO算法
- ¥15 关于调制信号的星座图?
- ¥30 前端传参时,后端接收不到参数
- ¥15 这是有什么问题吗,我检查许可证了但是显示有呢
- ¥15 机器学习预测遇到的目标函数问题