用Qt写大量二进制文件自动切割成256Byte的小数据包,并按顺序依次通过串口发出,中间发送间隔可调

131 阅读1分钟

因为一个无线收发模块缓存器比较小,发指令可以,一次性发大量二进制文件会丢包,但是发完一小包等几毫秒由可以正常发下一包(应该是缓存区通过判断间隔时间进行了清空),这样就需要一个把大量文件切割然后按着规定间隔时间依次发送的小上位机工具,找了半天,没找到,自己用Qt写了个,在原来串口调试基础上更改而来(可见前期博客)

以下是核心代码(别人写的,我就是集成应用,感谢互联网),其它的有机会上传

void MainWindow::transmitDataFun (int cnt)             //发送文件
{

    qint16 temp = 0;            //剩余待传数据
    qint16 FileSendEndFg;


    QFile *binFile = new QFile(fileLocation);
    binFile->open (QIODevice::ReadOnly);
    binFile->seek (cnt * 256);

    qDebug()<<"正在第"<<cnt+1<<"次发送数据给单片机"<<endl;
    ui->loadButton->setEnabled (false);

    char * binByte = new char[256];//bin缓存
    memset (binByte, 0xff, 256);

    QByteArray binTransmit;
    binTransmit.resize (0);

    temp = binSize - 256*cnt;
    qDebug()<<"剩余文件大小:"<<temp<<endl;
    if(temp < 256)
    {
        if(temp>0)//数据大于0
        {

            binFile->read (binByte, temp);
            binTransmit.insert(0, binByte, 256);

        }
        ui->loadProgressBar->setValue (100);
        ui->pushButton->setEnabled (true);
        FileSendEndFg=1;
    }
    else
    {
        binFile->read (binByte, 256);
        binTransmit.insert(0, binByte, 256);

        int i = (1 - float(temp) / float(binSize)) * 100;
        ui->loadProgressBar->setValue (i);
        FileSendEndFg=0;
    }

    delete binByte;
    if(temp>0)//数据大于0
      {
         p_Com->myCom->write(binTransmit);//数据与后面命令打包一起发送
         int time_256 = ui->AutoSendTime_256->text().toInt();
         Sleep(time_256);
         qDebug()<<"一次256B数据发送完毕:"<<endl;
      }

}

 

小bug:最后如果剩下122Byte没发送,也会发送256Byte,无效数据填充0XFFFF,不过STM32的FLASH被擦除后也是0XFFFF