dwinForumAdmin 发表于 2022-4-26 14:07:54

【开源】COF案例分享:基于迪文屏和QT上位机的图表远程监控

——文档转载自电子发烧友

使用迪文COF结构智能屏及其串口通信接口,结合电脑端QT上位机进行基于串口通信的上位机的图表远程监控界面。图案完全由QT上位机DIY定制,省去造轮子,可以使用QT上位机的高级GUI控件如渐变图层或OpenGL,具体显示效果由迪文COF结构智能屏的显示材质所表现。QT上位机端可开发各种基于QLabel控件所显示的图案或图表,如仪表盘,折线图,AD采集曲线图,电子罗盘等。这里为了方便就只做了仪表盘和折线图,并且QT描绘的矢量图占用空间过大,导致刷屏速率和分辨率都很低,只能做两张200*200的矢量图,如果迪文厂家在后续扩充flash空间,则可配置更多类型的QT上位机图案或图表。
在DGUS软件中添加两个显示控件,两个控件的起始坐标重叠,描述指针分别为0x1010和0x2020,内存地址分别为0x7FFE和0xBFFE,使用两个控件更改坐标交替显示图案和图表可以实现双缓冲效果。




使用到的QT上位机图案,仪表盘支持OpenGL加速,渐变图层显示。

仪表盘
折线图为矢量图表,可以任意描绘坐标点。本来打算做AD采集的波浪曲线图的,但是无奈矢量曲线图占用空间真的大,采集一帧600*400曲线图的JPG文件都达到了100K以上,只能用这种显示内容简单的折线图。



仪表盘和折线图内容均取自QT上位机,可以在上面做基于XML或QTWidget套件操作,因为懒得造轮子,又想显示的内容够精美,只能出此上策!


原计划是打算显示AD采集曲线的,但是这个矢量图的占用空间是真的大,没写一点点进去就已经刷满GRAM了:


QT代码中抓取单个LABEL标签为JPG文件,并将JPG文件分片通过串口上传到GRAM:void MainWindow::on_PB_GRAB_clicked(){    int res = 0;    unsigned char recvbuf ={0};    unsigned char commbuf =    {0x5a , 0xa5 , 0xf3 , 0x82};
    unsigned short word_offset = 0x8000;
。。。
    IF(fileName.isEmpty())    {      QMessageBox mesg;      mesg.warning(this,"警告","打开图片失败!");      return;    }    else    {      QFile file(fileName);      QImage img(fileName);      file.open(QIODevice::ReadOnly);
      while(1)      {            memset(commbuf , 0 , 246);            commbuf = 0x5a;            commbuf = 0xa5;            commbuf = 0xf3;            commbuf = 0x82;            commbuf = ( word_offset & 0xff00 ) >> 8;            commbuf =   word_offset & 0xff;
            res = file.read((char*)commbuf + 6 , 240);            if(res < 240)            {                qdebug("res = %d eof" , res);                break;            }            else            {                word_offset += 0x78;            }
            QString qscommbuf;            for(int n = 0 ; n < sizeof(commbuf); n++)            {                qscommbuf += QString().sprintf("%02x", (unsigned char)commbuf);            }            qDebug()<<"res =" << res << qscommbuf;
            res = commt->sendMyComm(commbuf , 246);            qDebug()<<"ressend =" << res;      }      file.close();    }}void MainWindow::on_PB_GRAB_2_clicked(){    int res = 0;    unsigned char recvbuf ={0};    unsigned char commbuf =    {0x5a , 0xa5 , 0xf3 , 0x82};
    unsigned short word_offset = 0xC000;
。。。
    if(fileName.isEmpty())    {      QMessageBox mesg;      mesg.warning(this,"警告","打开图片失败!");      return;    }    else    {      QFile file(fileName);      QImage img(fileName);      file.open(QIODevice::ReadOnly);
      while(1)      {            memset(commbuf , 0 , 246);            commbuf = 0x5a;            commbuf = 0xa5;            commbuf = 0xf3;            commbuf = 0x82;            commbuf = ( word_offset & 0xff00 ) >> 8;            commbuf =   word_offset & 0xff;
            res = file.read((char*)commbuf + 6 , 240);            if(res < 240)            {                qDebug("res = %d eof" , res);                break;            }            else            {                word_offset += 0x78;            }
            QString qscommbuf;            for(int n = 0 ; n < sizeof(commbuf); n++)            {                qscommbuf += QString().sprintf("%02x", (unsigned char)commbuf);            }            qDebug()<<"res =" << res << qscommbuf;
            res = commt->sendMyComm(commbuf , 246);            qDebug()<<"ressend =" << res;      }      file.close();    }}
更改显示坐标,实际上就是切换隐藏或显示图案:void MainWindow::on_PB_MOVE_11_clicked(){    unsigned char commbuf =    {0x5A , 0xA5 , 0x07 , 0x82 , 0x10 , 0x11 , 0x00 , 0x00 , 0x00 , 0x00};    int res = commt->sendMyComm(commbuf , 10);    qDebug()<<"ressendshow =" << res;}void MainWindow::on_PB_MOVE_12_clicked(){    unsigned char commbuf =    {0x5A , 0xA5 , 0x07 , 0x82 , 0x10 , 0x11 , 0x02 , 0xd0 , 0x02 , 0xd0};    int res = commt->sendMyComm(commbuf , 10);    qDebug()<<"ressendshow =" << res;}void MainWindow::on_PB_MOVE_21_clicked(){    unsigned char commbuf =    {0x5A , 0xA5 , 0x07 , 0x82 , 0x20 , 0x21 , 0x00 , 0x00 , 0x00 , 0x00};    int res = commt->sendMyComm(commbuf , 10);    qDebug()<<"ressendshow =" << res;}void MainWindow::on_PB_MOVE_22_clicked(){    unsigned char commbuf =    {0x5A , 0xA5 , 0x07 , 0x82 , 0x20 , 0x21 , 0x02 , 0xd0 , 0x02 , 0xd0};    int res = commt->sendMyComm(commbuf , 10);    qDebug()<<"ressendshow =" << res;}
循环显示:void MainWindow::on_PB_GRAB_3_clicked(){      on_PB_MOVE_22_clicked();      on_PB_MOVE_12_clicked();
      while(1)      {            on_PB_GRAB_clicked();            on_PB_MOVE_11_clicked();            on_PB_GRAB_2_clicked();            on_PB_MOVE_21_clicked();            Sleep(2000);            on_PB_MOVE_22_clicked();      }}











页: [1]
查看完整版本: 【开源】COF案例分享:基于迪文屏和QT上位机的图表远程监控