首先我把图片转化为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); //打开定时器
}