- /*检查时间:2013-10-20
- *检查人员:刘典武
- */
- #include "myds7400api.h"
- #include "myhelper.h"
- myDS7400API::myDS7400API(QObject *parent) :
- QObject(parent)
- {
- checkConnectCount=0;//检测连接次数
- checkDisConnectCount=0;//检测未连接次数
- isCheckDisConnect=false;
- isConnect=false;
- isOpen=false;
- myReadTimer=new QTimer(this);
- myReadTimer->setInterval(300);
- connect(myReadTimer,SIGNAL(timeout()),this,SLOT(ReadData()));
- timerConnect=new QTimer(this);
- timerConnect->setInterval(2000);
- connect(timerConnect,SIGNAL(timeout()),this,SLOT(DoConnect()));
- timerDisConnect=new QTimer(this);
- timerDisConnect->setInterval(2000);
- connect(timerDisConnect,SIGNAL(timeout()),this,SLOT(DoDisConnect()));
- }
- bool myDS7400API::Open()
- {
- myCOMDS7400=new QextSerialPort(this->hostConnectValue);
- bool IsOpen=myCOMDS7400->open(QIODevice::ReadWrite);
- if (IsOpen)
- {
- myCOMDS7400->flush();//清空串口缓冲区
- myCOMDS7400->setBaudRate(BAUD2400);
- myCOMDS7400->setDataBits(DATA_8);
- myCOMDS7400->setParity(PAR_NONE);
- myCOMDS7400->setStopBits(STOP_1);
- myCOMDS7400->setFlowControl(FLOW_OFF);
- myCOMDS7400->setTimeout(10);
- isOpen=true;
- myReadTimer->start();
- //开启定时器判断上线下线
- timerConnect->start();
- timerDisConnect->start();
- }
- return IsOpen;
- }
- void myDS7400API::Close()
- {
- myCOMDS7400->close();
- isOpen=false;
- myReadTimer->stop();
- timerConnect->stop();
- timerDisConnect->stop();
- }
- void myDS7400API::DoConnect()
- {
- if (checkConnectCount>0)
- {
- checkConnectCount=0;
- emit this->Connect(this->hostID);
- timerConnect->stop();
- }
- }
- void myDS7400API::DoDisConnect()
- {
- if (isConnect)
- {
- checkDisConnectCount=0;
- isCheckDisConnect=false;
- }
- else
- {
- checkDisConnectCount++;
- }
- if (checkDisConnectCount>8 && !isCheckDisConnect)
- {
- isCheckDisConnect=true;
- emit this->DisConnect(this->hostID);
- checkConnectCount=0;
- timerConnect->start();
- }
- isConnect=false;
- }
- void myDS7400API::ReadData()
- {
- //这个判断尤为重要,否则的话直接延时再接收数据,空闲时和会出现高内存占用
- if (myCOMDS7400->bytesAvailable()<=0){return;}
- myHelper::Sleep(100);//延时100毫秒保证接收到的是一条完整的数据,而不是脱节的
- QByteArray data=myCOMDS7400->readAll();
- isConnect = true;
- checkConnectCount++;
- QList<uchar> buffer;
- int len=data.length();
- //这里没有做每四位的判断,因为后面的错误数据可以丢弃
- //例如0x85 0x0B 0x11 0x6A 0x85 0x17 0x11
- //只要保证前面的数据都是0x85开头,并且都是四位就可以
- //逐个构建以0x85开头的正确数据
- if (data[0].operator==(0x85))
- {
- for (int i = 0; i < len; i++)
- buffer.append(myHelper::GetUChar(data[i]));
- this->TakeInfo(buffer);
- }
- else if (data[1].operator==(0x85))
- {
- for (int i = 1; i < len; i++)
- buffer.append(myHelper::GetUChar(data[i]));
- this->TakeInfo(buffer);
- }
- else if (data[2].operator==(0x85))
- {
- for (int i = 2; i < len; i++)
- buffer.append(myHelper::GetUChar(data[i]));
- this->TakeInfo(buffer);
- }
- else if (data[3].operator==(0x85))
- {
- for (int i = 3; i < len; i++)
- buffer.append(myHelper::GetUChar(data[i]));
- this->TakeInfo(buffer);
- }
- }
- void myDS7400API::TakeInfo(QList<uchar> data)
- {
- int num=data.count()/4;
- int startIndex = 0;
- for (int i = 0; i < num; i++)
- {
- this->TakeInfo(data[startIndex + 1], data[startIndex + 2]);
- startIndex=startIndex+4;
- }
- }
- void myDS7400API::TakeInfo(uchar type, uchar defenceID)
- {
- QString DefenceID="000";
- switch (type) {
- case 0x18://防区断开
- DefenceID=QString::number(defenceID+1);
- if (DefenceID.length()==1)
- {
- DefenceID="00"+DefenceID;
- }
- else if(DefenceID.length()==2)
- {
- DefenceID="0"+DefenceID;
- }
- emit this->DuanKai(this->hostID,DefenceID);
- break;
- case 0x0B://防区故障
- DefenceID=QString::number(defenceID+1);
- if (DefenceID.length()==1)
- {
- DefenceID="00"+DefenceID;
- }
- else if(DefenceID.length()==2)
- {
- DefenceID="0"+DefenceID;
- }
- emit this->GuZhang(this->hostID,DefenceID);
- break;
- case 0x17://故障恢复
- case 0x19://断开恢复
- DefenceID=QString::number(defenceID+1);
- if (DefenceID.length()==1)
- {
- DefenceID="00"+DefenceID;
- }
- else if(DefenceID.length()==2)
- {
- DefenceID="0"+DefenceID;
- }
- emit this->HuiFu(this->hostID,DefenceID);
- break;
- case 0x10://24小时防区旁路
- case 0x0F://防区旁路
- DefenceID=QString::number(defenceID+1);
- if (DefenceID.length()==1)
- {
- DefenceID="00"+DefenceID;
- }
- else if(DefenceID.length()==2)
- {
- DefenceID="0"+DefenceID;
- }
- emit this->PangLu(this->hostID,DefenceID);
- break;
- case 0x07://防区报警
- DefenceID=QString::number(defenceID+1);
- if (DefenceID.length()==1)
- {
- DefenceID="00"+DefenceID;
- }
- else if(DefenceID.length()==2)
- {
- DefenceID="0"+DefenceID;
- }
- emit this->BaoJing(this->hostID,DefenceID);
- break;
- case 0x0E://主机布防
- emit this->BuFang(this->hostID,defenceID+1);
- break;
- case 0x0C://24小时防区报警后取消报警
- case 0x0D://主机撤防
- emit this->CheFang(this->hostID,defenceID+1);
- break;
- }
- }
- //该片段来自于http://www.codesnippet.cn/detail/140720149980.html
来源: http://www.codesnippet.cn/detail/140720149980.html