我是熊宝宝 2019-05-15 17:00 采纳率: 0%
浏览 1401

Qt 创建新线程后,执行到run函数后不执行槽函数

#include "mythread1.h"
#include
#include
#include

//int i = 0; //共享资源
QMutex mutex; //互斥锁

Mythread1::Mythread1()
{

}

void Mythread1::run()
{
// QString aa;
// aa.append("0123456789");
ser = new QSerialPort;
ser->setPortName("COM4");
//串口初始化
ser->setBaudRate(QSerialPort::Baud9600);
ser->setDataBits(QSerialPort::Data8);
ser->setStopBits(QSerialPort::OneStop);
ser->setParity(QSerialPort::NoParity);
//打开串口
bool ret = ser->open(QIODevice::ReadWrite);
if(!ret)
{
//QMessageBox::warning(this,"警告","打开串口失败!");
qDebug() << "打开串口失败!";
return;
}
connect(ser,SIGNAL(readyRead()),this,SLOT(recvserialdata()));
qDebug() << "打开串口成功!";

 //seekserial();

while(1)
{
    //mutex.lock();

    seekserial();
    //preventcrash();

    emit send_data(cardID);
    QThread::sleep(2);

   //mutex.unlock();
}

}

void Mythread1::recvserialdata()
{
qDebug() << "接收串口数据";
QByteArray tmpr = ser->readAll();
qDebug() << "tmpr =" << tmpr;
QString recvd;

for(int i = 0; i < tmpr.count(); i++)
{
    recvd.append(QString::number((quint8)tmpr[i],16));
    recvd.append(" ");
}

//判断命令执行是否成功
if(recvd.mid(4,1) != "0")
{
    qDebug() <<  "命令执行不成功!";
    qDebug() <<  "recvd =" << recvd;
}
else
{
    qDebug() <<  "命令执行成功!";

    qDebug() <<  "recvd =" << recvd;

    if(recvd.mid(6,1) == "4")
    {
        cardID.append("命令执行成功,读到卡号为:");
        cardID.append(recvd.mid(8,2));
        cardID.append(recvd.mid(11,2));
        cardID.append(recvd.mid(14,2));
        cardID.append(recvd.mid(17,2));

        qDebug() <<  "cardID =" << cardID;
        //cardID.clear();
    }
}

}

//寻卡
void Mythread1::seekserial()//07 02 41 01 52 e8 03
{
QByteArray tmpcmd;
tmpcmd.append((unsigned char)0x07);
tmpcmd.append((unsigned char)0x02);
tmpcmd.append((unsigned char)0x41);
tmpcmd.append((unsigned char)0x01);
tmpcmd.append((unsigned char)0x52);
//QByteArray转为unsigned char
uchar *thePointerYouNeed = (uchar *)(tmpcmd.data());
//校验和
tmpcmd.append(CalBCC(thePointerYouNeed, thePointerYouNeed[0]-2));
tmpcmd.append((unsigned char)0x03);

//发送给RFID模块
ser->write(tmpcmd);
qDebug() << "发送寻卡命令!";

}
//防冲突
void Mythread1::preventcrash()//08 02 42 02 93 00 26 03
{
QByteArray tmpcrash;
tmpcrash.append((unsigned char)0x08);
tmpcrash.append((unsigned char)0x02);
tmpcrash.append((unsigned char)0x42);
tmpcrash.append((unsigned char)0x02);
tmpcrash.append((unsigned char)0x93);
tmpcrash.append((char)0x00);
//QByteArray转为unsigned char
uchar *thePointerYouNeed = (uchar *)(tmpcrash.data());
//校验和
tmpcrash.append(CalBCC(thePointerYouNeed, thePointerYouNeed[0]-2));
tmpcrash.append((unsigned char)0x03);

//发送给RFID模块
ser->write(tmpcrash);
qDebug() << "发送防冲突命令!";

}

//校验和
unsigned char Mythread1::CalBCC(unsigned char *buf, int n)
{
int i;
unsigned char bcc = 0;
for(i = 0; i < n; i++)
{
bcc ^= *(buf+i);
}
return (~bcc);
}

代码如上,程序不会执行槽函数recvserialdata(),只执行run函数里的语句。

  • 写回答

3条回答 默认 最新

  • guosongmao 2020-04-29 13:21
    关注

    run函数里最后一个加上this-> exec();不然run函数执行完毕,线程就结束了。不会执行connect槽函数的

    评论

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题