TA的每日心情 | 开心 2018-9-18 07:18 |
---|
签到天数: 18 天 连续签到: 1 天 [LV.4]偶尔看看III
|
UP-Board 试用汇总(2017年2月13日)
这一篇分享是继续使用QT进行程序开发的讲解,使用是串口通信类QtSerialPort,里面有一些我的使用介绍。
先上最终软件的效果图:
通信过程:
1.stm32连接相机ov7670。
2.上位机通过发送拍照指令给stm32
3.stm32拍照后,回传图像数据给上位机。
4.上位机接收图像数据后,将RGB565转换成RGB888显示到label,并保存到本地图像。
硬件连接:
stm32通过usb转ttl连接到UP-Board的USB口。
步骤1:和前面的分享一样,使用QT先画出软件界面框
使用的控件有:
1.Push Button 拍照按键
2.Combo Box 端口选择
3.Progress Bar 进度条
4.Label 图像显示
步骤2:添加串口头文件- #include <QtSerialPort/QSerialPort>
- #include <QtSerialPort/QSerialPortInfo>
复制代码 步骤3:添加拍照信号和槽- //cpp:
- connect(ui.takePictureButton, SIGNAL(clicked()),this, SLOT(takePicture()));
- //h:
- private slots:
- void takePicture();
复制代码 步骤4:进度条初始值设置,根据QVGA图像大小值设置。- pictureHeight=240;
- pictureWidth=320;
- ui.progressBar->setMinimum(0);
- ui.progressBar->setMaximum(pictureWidth*pictureHeight*2);
- ui.progressBar->setValue(0);
复制代码 步骤5:声明串口对象,并把系统的端口显示到ComboBox里- serial=new QSerialPort(this);
- foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
- ui.serialComboBox ->addItem(info.portName());
复制代码 步骤6:加入串口接收到的信号和槽,当串口接收到数据时,调用该函数- connect(serial,SIGNAL(readyRead()),this,SLOT(readSerialPortData()));
复制代码 步骤7:拍照按键触发指令,串口波特率等参数初始化- void PictureViewer::takePicture(){
- receivedLength=0;
-
- if(ui.serialComboBox->count()==0){
- QMessageBox::critical(this,"error","please connect the com device");
- return;
- }
- QString portName=ui.serialComboBox->currentText();
- serial->setPortName(portName);
- if(!serial->open(QIODevice::ReadWrite)){
- QMessageBox::critical(this,"error","fail to open com");
- serial->close();
- return;
- }
- serial->setBaudRate(QSerialPort::Baud115200);
- serial->setDataBits(QSerialPort::Data8);
- serial->setParity(QSerialPort::NoParity);
- serial->setStopBits(QSerialPort::OneStop);
- serial->setFlowControl(QSerialPort::NoFlowControl);
- char takePictureCmd[2]={0x12,0x34};
- serial->write(takePictureCmd,2);
- }
复制代码 步骤8:图像数据接收,并且显示到Label- void PictureViewer::readSerialPortData(){
- QByteArray temp = serial->readAll();
- if(temp.length()>0 ){
-
- memcpy((imageBuffer+receivedLength),temp.data(),temp.length());
- receivedLength+=temp.length();
- //fwrite(temp.data(),1,temp.length(),picture);
- //fflush(picture);
- ui.progressBar->setValue(receivedLength);
- if (receivedLength==pictureWidth*pictureHeight*2)
- {
- QImage img(pictureWidth,pictureHeight,QImage::Format_RGB888);
- unsigned char r,g,b;
-
- unsigned short *pD=(unsigned short*)imageBuffer;
- for(int i=0;i<pictureHeight;i++){
- for(int j=0;j<pictureWidth;j++,pD++){
- unsigned short td=*pD;
- r=(td & 0xf800)>>8;
- g=(td & 0x07e0)>>3;
- b=(td & 0x001f)<<3;
- img.setPixel(j,i,qRgb(r,g,b));
- }
- }
- img.save("receive.png");
- ui.pictureLabel->setPixmap(QPixmap::fromImage(img));
- //fclose(picture);
- receivedLength=0;
- serial->close();
- }
- }
- }
复制代码 OK,本分享就到这里,先不上传代码,如果需要请私信。
|
|