查看: 4425|回复: 5

[UP-Borad]windows应用开发--串口图像显示上位机

[复制链接]
  • TA的每日心情
    开心
    2018-9-18 07:18
  • 签到天数: 18 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2017-2-9 18:20:55 | 显示全部楼层 |阅读模式
    分享到:
    UP-Board 试用汇总(2017年2月13日)

    这一篇分享是继续使用QT进行程序开发的讲解,使用是串口通信类QtSerialPort,里面有一些我的使用介绍。

    先上最终软件的效果图:
    10.jpg

    通信过程:
    1.stm32连接相机ov7670。
    2.上位机通过发送拍照指令给stm32
    3.stm32拍照后,回传图像数据给上位机。
    4.上位机接收图像数据后,将RGB565转换成RGB888显示到label,并保存到本地图像。

    硬件连接:
    stm32通过usb转ttl连接到UP-Board的USB口。

    步骤1:和前面的分享一样,使用QT先画出软件界面框
    11.jpg
    使用的控件有:
    1.Push Button  拍照按键
    2.Combo Box   端口选择
    3.Progress Bar 进度条
    4.Label           图像显示


    步骤2:添加串口头文件
    1. #include <QtSerialPort/QSerialPort>
    2. #include <QtSerialPort/QSerialPortInfo>
    复制代码
    步骤3:添加拍照信号和槽
    1. //cpp:
    2. connect(ui.takePictureButton, SIGNAL(clicked()),this, SLOT(takePicture()));

    3. //h:
    4. private slots:
    5. void takePicture();
    复制代码
    步骤4:进度条初始值设置,根据QVGA图像大小值设置。
    1. pictureHeight=240;
    2.         pictureWidth=320;

    3.         ui.progressBar->setMinimum(0);
    4.         ui.progressBar->setMaximum(pictureWidth*pictureHeight*2);
    5.         ui.progressBar->setValue(0);
    复制代码
    步骤5:声明串口对象,并把系统的端口显示到ComboBox里
    1. serial=new QSerialPort(this);
    2.         foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    3.                 ui.serialComboBox ->addItem(info.portName());        
    复制代码
    步骤6:加入串口接收到的信号和槽,当串口接收到数据时,调用该函数
    1. connect(serial,SIGNAL(readyRead()),this,SLOT(readSerialPortData()));
    复制代码
    步骤7:拍照按键触发指令,串口波特率等参数初始化
    1. void PictureViewer::takePicture(){
    2.         receivedLength=0;
    3.         

    4.         if(ui.serialComboBox->count()==0){
    5.                 QMessageBox::critical(this,"error","please connect the com device");
    6.                 return;
    7.         }
    8.         QString portName=ui.serialComboBox->currentText();
    9.         serial->setPortName(portName);
    10.         if(!serial->open(QIODevice::ReadWrite)){
    11.                 QMessageBox::critical(this,"error","fail to open com");
    12.                 serial->close();
    13.                 return;
    14.         }

    15.         serial->setBaudRate(QSerialPort::Baud115200);
    16.         serial->setDataBits(QSerialPort::Data8);  
    17.         serial->setParity(QSerialPort::NoParity);
    18.         serial->setStopBits(QSerialPort::OneStop);  
    19.         serial->setFlowControl(QSerialPort::NoFlowControl);

    20.         char takePictureCmd[2]={0x12,0x34};
    21.         serial->write(takePictureCmd,2);

    22. }
    复制代码
    步骤8:图像数据接收,并且显示到Label
    1. void PictureViewer::readSerialPortData(){
    2.         QByteArray temp = serial->readAll();
    3.         if(temp.length()>0 ){
    4.                
    5.                 memcpy((imageBuffer+receivedLength),temp.data(),temp.length());
    6.                 receivedLength+=temp.length();
    7.                 //fwrite(temp.data(),1,temp.length(),picture);
    8.                 //fflush(picture);
    9.                 ui.progressBar->setValue(receivedLength);
    10.                 if (receivedLength==pictureWidth*pictureHeight*2)
    11.                 {
    12.                         QImage img(pictureWidth,pictureHeight,QImage::Format_RGB888);
    13.                         unsigned char r,g,b;

    14.                         
    15.                         unsigned short *pD=(unsigned short*)imageBuffer;
    16.                         for(int i=0;i<pictureHeight;i++){
    17.                                 for(int j=0;j<pictureWidth;j++,pD++){
    18.                                         unsigned short td=*pD;
    19.                                         r=(td & 0xf800)>>8;
    20.                                         g=(td & 0x07e0)>>3;
    21.                                         b=(td & 0x001f)<<3;
    22.                                         img.setPixel(j,i,qRgb(r,g,b));
    23.                                 }
    24.                         }
    25.                         img.save("receive.png");
    26.                         ui.pictureLabel->setPixmap(QPixmap::fromImage(img));        
    27.                         //fclose(picture);
    28.                         receivedLength=0;
    29.                         serial->close();
    30.                 }
    31.         }
    32. }
    复制代码
    OK,本分享就到这里,先不上传代码,如果需要请私信。


    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2019-8-27 21:30
  • 签到天数: 219 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2017-2-10 09:43:53 | 显示全部楼层
    这个不错,关键是32和up之间的串口通信的图像数据如何转换是一个比较重要的问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-9-18 07:18
  • 签到天数: 18 天

    连续签到: 1 天

    [LV.4]偶尔看看III

     楼主| 发表于 2017-2-10 12:25:38 | 显示全部楼层
    michael_llh 发表于 2017-2-10 09:43
    这个不错,关键是32和up之间的串口通信的图像数据如何转换是一个比较重要的问题 ...

    最后那段代码就是图像数据转换,stm32得到的是RGB565图像,所以需要转换成RGB888,转换代码如下
    1. or(int i=0;i<pictureHeight;i++){
    2.                                 for(int j=0;j<pictureWidth;j++,pD++){
    3.                                         unsigned short td=*pD;
    4.                                         r=(td & 0xf800)>>8;
    5.                                         g=(td & 0x07e0)>>3;
    6.                                         b=(td & 0x001f)<<3;
    7.                                         img.setPixel(j,i,qRgb(r,g,b));
    8.                                 }
    9.                         }
    复制代码
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2019-8-27 21:30
  • 签到天数: 219 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2017-2-12 15:35:42 | 显示全部楼层
    colin2135 发表于 2017-2-10 12:25
    最后那段代码就是图像数据转换,stm32得到的是RGB565图像,所以需要转换成RGB888,转换代码如下 ...

    恩恩,谢谢回复
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-3-14 09:26
  • 签到天数: 9 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2017-2-14 08:47:18 | 显示全部楼层
    很强,感谢楼主分享。赞一个。如果是windows。我感觉delphi开发串口类工具非常的nice。虽然我几个工具都用。嘿嘿。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-9-18 07:18
  • 签到天数: 18 天

    连续签到: 1 天

    [LV.4]偶尔看看III

     楼主| 发表于 2017-2-14 10:54:34 | 显示全部楼层
    wmslecz 发表于 2017-2-14 08:47
    很强,感谢楼主分享。赞一个。如果是windows。我感觉delphi开发串口类工具非常的nice。虽然我几个工具都用 ...

    是的啊,不管是QT,或者C#,或者delphi这些工具都很方便啊。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-4-26 23:35 , Processed in 0.156115 second(s), 26 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.