使用QSerialport讀取串列埠資料並處理

fourierr發表於2017-07-18

寫了一個函式將ASCII轉換為int

int DataToInt(char data)

{
    int num = 0;
    if(data>='0'&&data<='9')
        num = data - 48;
    if(data>='a'&&data<='f')
        num = data - 87;
    return num;
}

buff = new QByteArray; 
void Serial::ReadData()
{
    QByteArray arr = port->readAll();   
    QByteArray array =arr.toHex();  //轉為16進位制
    buff->append(array);//一個串列埠傳來的資料由兩個16進位制字元組成
    if(buff->length()<16)
    {
        return;
    }

    QString buffdata;
    buffdata.prepend(*buff);//QString中存放的是字元型
    if(buffdata[0]=='e'&&buffdata[1]=='e'&&buffdata[2]=='c'&&buffdata[3]=='c')
    {
        if(buff->at(8)==97)   //97=a   filter zhouqixiaoxi
        {
            buff->remove(0,buff->size());
            return;
        }
        if(buff->at(7)==53)//5 deascii shi 53   fliter motor2
        {
            buff->remove(0,buff->size());
            return;
        }
        if(buff->at(7)==57)//9 deascii shi 57     filter moter
        {
            buff->remove(0,buff->size());
            return;
        }
        if(buff->at(7)==97)//a deascii shi 97   filter shake
        {
            buff->remove(0,buff->size());
            return;
        }
        emit this->diliverSerial(array);
        int NodeSeq=buff->at(5)-48;
        int NodeID=buff->at(7)-48;
        int Command=buff->at(9)-48;
        qDebug()<<NodeSeq;
        qDebug()<<NodeID;
        qDebug()<<Command;
        if(NodeID==9)
        {
            buff->remove(0,buff->size());
            return;
        }
        if(NodeID==3)   //tempAndhum
        {
            float temph = DataToInt(buff->at(10))*16.0+DataToInt(buff->at(11));
            float templ = DataToInt(buff->at(12))*16+DataToInt(buff->at(13));
            float temp=((temph)*256+(templ))*0.01;
            QString Datatemp = QString("%1").arg(temp);
            float humh = DataToInt(buff->at(14))*16+DataToInt(buff->at(15));
            float huml = DataToInt(buff->at(16))*16+DataToInt(buff->at(17));
            float humi=((humh)*256+(huml))*0.01;
            QString Datahumi = QString("%1").arg(humi);
            /*
            float temph = (buff->at(10)-48)*16+(buff->at(11)-48);
            float templ = (buff->at(12)-48)*16+(buff->at(13)-48);
            float temp=((temph)*256+(templ))*0.01-100;
            QString Datatemp = QString("%1").arg(temp);
            float humh = (buff->at(14)-48)*16+(buff->at(15)-48);
            float huml = (buff->at(16)-48)*16+(buff->at(17)-48);
            float humi=((humh)*256+(huml))*0.01;
            QString Datahumi = QString("%1").arg(humi);
            */
            emit this->diliverTemp(Datatemp);
            emit this->diliverHumi(Datahumi);
            QString DatatempAndhumi=Datatemp+","+Datahumi;
            SensorInfo *info =new SensorInfo(NodeSeq,NodeID,Command,DatatempAndhumi);  // ba data zhuang string
            CreateJson(info);
            buff->remove(0,buff->size());
        }
        if(NodeID==4) //shake
        {
            float shake = (buff->at(11)-48);
            QString Datashake="no alarm";
            if(shake==1)
            {
                Datashake = "1";
                //ui->textEdit_smk->setText("alarm");****************
            }
            else{
                Datashake = "0";
                //ui->textEdit_smk->setText("no alarm");*************
            }
            emit this->diliverSmk(Datashake);
            //QByteArray ByteData=Data.toUtf8();
            SensorInfo *info =new SensorInfo(NodeSeq,NodeID,Command,Datashake);  // ba data zhuang string
            //qDebug("Temprature From Serial ---------"+ByteData);
            //emit DiliverSerial(ByteData);
            CreateJson(info);
            buff->remove(0,buff->size());
        }
    }


}
void Serial::CreateJson(SensorInfo *info)
{
    QJsonObject obj;
    obj.insert("NodeSep",info->getSeq());
    obj.insert("NodeID",info->getID());
    obj.insert("Command",info->getCmd());
    obj.insert("Data",info->getData());
    QJsonDocument doc;
    doc.setObject(obj);
    QByteArray arry = doc.toJson(); // zhuancheng JSON
    //qDebug(arry);
    emit this->SendData(arry);
}

相關文章