#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函数里的语句。