Qt编写Linux上的Gird_Eye上位机

Gird_Eye红外摄像头上位机

  • Gird_Eye模块的传输格式
  • Qt基于Linux串口编程
  • 解析接收到的数据
  • 根据数据绘图

Gird_Eye模块的传输格式

一个完整的大数据帧长度是826,一个大数据帧里包括10小帧数据,其中包括的信息有帧数,人检人数,人检位置,人检输出,原始温度,合成温度,差分温度等。

Qt编写Linux上的Gird_Eye上位机_第1张图片

底下划横线的是小帧数据的帧头和帧尾(字可能有点丑)

这就是Gird_Eye模块传回来的数据格式。

Qt基于Linux的串口通信编程

在我的另一篇博客里面有详细介绍
传送门:qt串口编程

解析接收到的数据

我是用一种简单粗暴的方法,但是这种方法会丢失数据,现在还没想到更好的方法,有大牛想到了,可以私信我。
方法就是,现在一大帧数据长度是826,要是在接收回来的数据随便选取长度为826的数据,进行解析的话,可能会导致这一帧的数据不完整。这时,我们可以扩大接收数据的长度,例如接收1652长度的数据,就是两帧数据的长度,这1652的数据里面一定会存在一帧完整的数据,然后按照查找相应的帧头帧尾去解析相应的数据。

void MainWindow::haveStart(QByteArray ba)
{
    QList<int> position;
    QList<int> jianchu;
    QList<int> tempure;
    QList<int> hecheng;
    QList<int> beijing;
    QList<int> chafen;
    unsigned char buffStr[1652]={0,};
    memcpy(buffStr,ba,1652);

    for(int i=0;i<826;i++)
    {
        //这是一大帧数据的帧头帧尾
        if((buffStr[i] == 0xcc)&&(buffStr[i+1] == 0x00)&&(buffStr[i+2] == 0x04)&&(buffStr[i+3] == 0x00)&&(buffStr[i+824] == 0xcc)&&(buffStr[i+825] == 0x6f))
        {
            cout << "success";
            //人检位置
            if((buffStr[i+47] == 0xcc)&&(buffStr[i+48] == 0x11)&&(buffStr[i+49] == 0x05)&&(buffStr[i+50] == 0x02)&&(buffStr[i+61] == 0xcc)&&(buffStr[i+62] == 0x1f))
            {
                for(int j=1;j<=10;j++)
                    position << buffStr[i+50+j];
                emit sendWeizhi(position);

            }
            //检出
            if((buffStr[i+63] == 0xcc)&&(buffStr[i+64] == 0x22)&&(buffStr[i+65] == 0x0f)&&(buffStr[i+66] == 0x0f))
            {
                for(int j=1;j<=225;j++)
                    jianchu << buffStr[i+66+j];
                emit sendJianchu(jianchu);

            }
            //温度
            if((buffStr[i+294] == 0xcc)&&(buffStr[i+295] == 0x33)&&(buffStr[i+296] == 0x08)&&(buffStr[i+297] == 0x08))
            {
                for(int j=1;j<=64;j++)
                    tempure << buffStr[i+297+j];
//                cout <
                emit sendTempture(tempure);
            }
            //合成
            if((buffStr[i+364] == 0xcc)&&(buffStr[i+365] == 0x44)&&(buffStr[i+366] == 0x0f)&&(buffStr[i+367] == 0x0f))
            {
                for(int j=1;j<=225;j++)
                    hecheng << buffStr[i+367+j];
                emit sendHecheng(hecheng);
//                cout << hecheng;
            }
            //背景
            if((buffStr[i+364] == 0xcc)&&(buffStr[i+365] == 0x55)&&(buffStr[i+366] == 0x0f)&&(buffStr[i+367] == 0x0f))
            {
                for(int j=1;j<=225;j++)
                    beijing << buffStr[i+367+j];
//                cout << beijing;
                emit sendBeijing(beijing);
            }
            //差分
            if((buffStr[i+595] == 0xcc)&&(buffStr[i+596] == 0x66)&&(buffStr[i+597] == 0x0f)&&(buffStr[i+598] == 0x0f))
            {
                for(int j=1;j<=225;j++)
                    chafen << buffStr[i+598+j];
                emit sendChafen(chafen);
//                cout << chafen;
            }
        }
    }
}

显示部分

解析出来的数据,每一个值都用一个像素显示相应的颜色来表示,用的是Qt绘图中的QImage,先把一个像素点放大,然后显示。

这是数值与颜色的关系函数

int Show::initColorArray(QImage *image1)
{
//    image1->setColorCount(41);
    int Mid = (N - 1)/2;                        //数组中间那个数的数组下标20
    int n;
    int red=0;
    int green=0;
    int blue=0;
    float d = (float)255 / (float)((MaxTemp - MinTemp)*2);  //公差12.75
    for(n=0;nif(n < Mid)
        {
            red = 0;
            green = (int)(n * d);
            blue = (int)((Mid-n)* d);

        }else if(n >= Mid)
        {
            red = (int)((n-Mid) * d);
            green = (int)((N-n-1) * d);
            blue = 0;
        }
        image1->setColor(n,qRgb(red,green,blue));
    }

    return 0;
}

这是根据数值,给相应的像素上相应的颜色,只是原始温度

//原始温度
void Show::drawImage(QPainter *painter)
{
    if(tempture.size()==0)
        return;
    image = QImage(8, 8, QImage::Format_Indexed8);

    initColorArray(&image);

    int k = 0;

    int i,j;
    for(i=0; i<8; ++i)
    {
        for(j=0; j<8; ++j)
        {
            int count = putcolor((float)(tempture.at(k)*0.25));
            image.setPixel(i, j, count); //绘制像素图
            k++;
        }
    }
    painter->drawImage(0, 0, image);
}

最后上一个效果图
Qt编写Linux上的Gird_Eye上位机_第2张图片
选项只是写了一个,其他可以往上添

Qt编写Linux上的Gird_Eye上位机_第3张图片
这是显示的效果图

源码下载:源码在这里

希望多交流:904922898(QQ)

你可能感兴趣的:(嵌入式研发,Qt)