• 5827阅读
  • 2回复

请问我这样通过串口传大图片行吗? [复制链接]

上一主题 下一主题
离线磐石
 
只看楼主 正序阅读 楼主  发表于: 2009-12-07
首先我把图片转化为QByteArray数组,再把这个数组按1024字节分成若干小的数组,把这样的数组一个个通过串口发过去,在接收端再把这些数组重组。可是这样行不通,收发代码是这样的,请高手看看,哪里错了
代码写的不工整,辛苦大哥们看一下了,谢谢。
整个程序中有几个相关的程序语句
QextSerialPort *port;  //定义一个串口
QTimer *serialTimer;  //该定时器用于设定读串口时间间隔
port = new QextSerialPort("COM1");
      ...................................  
   serialTimer=new QTimer;
   serialTimer->start(5);
   .........................................
connect(serialTimer,SIGNAL(timeout()),this,SLOT(timerEvent()));

发:
void chatDialog::on_sendBtn_clicked()

          serialTimer->stop();            //开始传图片就关闭定时器 
          QImage image(pictureName);       //假定这里pictureName="F:/aa.png" 
          QByteArray ba; 
          QBuffer buffer(&ba); 
          buffer.open(QIODevice::WriteOnly); 
          image.save(&buffer, "PNG");              //上面这几句是把QImage 格式转化为 QByteArray 
          int num_packet; 
          num_packet=ba.size()/1024+1;    //得到数据包的个数,每个是1024字节 
          QByteArray  num(QString::number(num_packet,10));  
          port->write(num);     //上面这两句是先传一个数据给对方,告知数据包个数,对方收到后会发一个确认信号。
          QByteArray packet;          
         QByteArray Ack;
          for(int x=0;x<num_packet;x++)
          { 
                 packet=ba.left(1024); 
                  ba.remove(0,1024);         得到第 x 个数据包
                 while(port->bytesAvailable()<0);  //等待确认信号
                 Ack=port->readAll();
                 QString sAck(Ack); 
                  if(sAck=="ok")                       //在这个程序中定义的确认信号是字符串"ok"
                   port->write(packet);        //传第 x 数据包
          }
        serialTimer->start(5);          图片传结束后开启定时器
      }
}
收:

void chatDialog::timerEvent()

      serialTimer->stop();//关闭定时器 
      int num_packet;     //数据包个数 
      QByteArray picture;  //储存整个图片数据用 
      QByteArray packet;   //临时储存一个数据包用 
      QByteArray num; 
      num=port->readAll(); 
      QString numstring(num); 
      num_packet=numstring.toInt(); //上面几句是得到传过来数据包的个数 
       r_mesEdit->append(QString::number(num_packet,10)); 
       QByteArray Ack("ok");   //定义确认信号 
       for(int x=0;x<num_packet;x++) 
        { 
            port->write(Ack);  //每次接收到数据包都发一个确认信号
             while(port->bytesAvailable()<0);//等待接收一个数据包
             packet=port->readAll(); 
             picture+=packet;//将这个数据包加到已接收到的数据包中,一直到接收完成

         }
        /**下面是对接收到的数据进是存储,以下代码是没问题**/
        int button=QMessageBox::question(this,tr("收到图片"),tr("是否保存图片"),
            QMessageBox::Yes | QMessageBox::No);  
        if(button==QMessageBox::Yes)
        { 
              QString filename=QFileDialog::getSaveFileName(this,tr("save picture"),"",tr("Picture (*.png);;All Files(*)")); 
              if(filename.isEmpty())
                    return; 
               else 
                { 
                     QFile file(filename); 
                     if(!file.open(QIODevice::WriteOnly)) 
                       {
                        QMessageBox::information(this,tr("Unable to open file"),file.errorString());
                           return; 
                        }
                         file.write(picture); 
                          file.close();
                                
                } //end else
         }  //end(button==QMessageBox::Yes)
           serialTimer->start(5); //打开定时器
}
不怕做不到,只怕想不到
离线磐石
只看该作者 2楼 发表于: 2009-12-09
突然发现有个地方写错了,改正后就行了
  while(port->bytesAvailable()<0);//等待接收一个数据包 改为
  while(port->bytesAvailable()<=0);//等待接收一个数据包
但发现传的速度很慢,就是传个几百K的图片都要将近10分钟,真是无语
不怕做不到,只怕想不到
离线磐石
只看该作者 1楼 发表于: 2009-12-08
自己顶个,哪位高人提个建议
不怕做不到,只怕想不到
快速回复
限100 字节
 
上一个 下一个