2019.6.19Qt 串口的线程问题

57 篇文章 7 订阅

记一次Qt串口的线程问题,自己构造的一个串口类如下:

把这个类     this->moveToThread(thread);

之后发现会程序会有崩溃等问题。

我个人猜测是 线程里用到了m_serial_port->readAll()

主线程里又用到了m_serial_port并发出信号当同一时间主线程和副线程共同使用了m_serial_port这块内存就会引发错误

解决方法如下:方法一:将m_serial_port也放入该线程

                         方法二:加线程访问锁

                          解决的代码就不放出来了 自己写去

class RXBluetoothSerialPort : public RXSerialport
{
    Q_OBJECT
public:
    RXBluetoothSerialPort();
    ~RXBluetoothSerialPort();
    void SetTotalBytes(int value);//外部设置统计的总的byte数字
    void Init(); //初始化参数

private:
    int total_Byte;//统计接受到的总的Byte
    QByteArray history_aray;//缓存字节
    bool receiving_pressure_data; //表示正在接受压力数据中
    
    QThread *thread;//将该对象放入线程,该类的槽函数执行在线程里
    
    //如果头在缓存字节串里则为true 否则为false
    //优先级 instruction_head_exist>data_head_exist
    //这两个头标记互斥 不存在值一样的情况
    bool data_head_exist; //接受到的数据头
    bool instruction_head_exist;//指令头部

    //校验位 求和验证
    bool SumVerification(QByteArray byte_array);
    void InitBufData(); //清空缓存 初始化头标记

signals:
    void SendPressureData(QList<RXSerialPortNamespace::PressureData>);
    void SendPressureData(RXSerialPortNamespace::PressureData);
    void ShowInstructionData(QByteArray bytes);
    void ShowReceiveHexData(QString);
    void SendPressureData(double pressure_value, double heart_rate);
    void ShowConsoleData(QString);

    //可读性考虑,不用参数来判定,直接4个信号
    void ShowPressureInfo(int,RXSerialPortNamespace::BloodPressureType); //发送舒张压

    void ErrorPort();//错误情况串口关闭时发出该信号
public slots:
     void WriteData(QString);
     //写指令数据
     void WriteData(RXSerialPortNamespace::InstructionToBleType);
     //写连接第几个Mac地址
     void WriteData(int mac_num);

protected slots:
     void ReadData();
};

 

2019.7.23

//在线程对象里构造函数new的子变量 是属于主线程的 在线程start触发的函数里new的是属于子线程的

所以说尽量还是new在线程里 不影响释放

 

2019.12.25

如上可以将QSerialPort封装的类放入线程 打开串口 关闭 设置等操作走主线程 接收处理数据这种耗时操作可以放在其他线程中去。如果一直发 QSerialPort不readall的话 可能这个对象的缓存区会溢出 需要及时flush

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值