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

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 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?
  • ¥100 求三轴之间相互配合画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败