POVLED 上位机实现(3)文件数据发送

上章节我们把从文件中读取到数值存放到了QVector <uint> displayCode 中,但是考虑到串口发送数据使用的便利,我们改为存储到QByteArray codeArray,这样就可从串口函数直接使用。

在发送数据之前我们需要让上下位检测通信线以及做好准备进入数据下载阶段,所以我们需要一个设备连接的交互。

捕获

由于我调试的时候图省事直接将串口设备的RX与TX连接到一起让它自发自收,所以代码中的帧信息与协议有区别。

设备连接

void MainWindow::on_DeciceConnect_clicked() 
{
    //这里需要向下位机发送设备连接代码  0xf1,0-100
    QByteArray headMsg;
    headMsg[0] = 0x64;
    headMsg[1] = 0x01;
    qDebug() << headMsg;


    m_serialPort->write(headMsg);


    if(m_serialPort->waitForReadyRead(20))             //  超时跳过
    {
         QByteArray info = m_serialPort->readAll();
         qDebug() << info.toHex();
         if((0x64 == (info[0] & 0xff))&&(0x01 == (info[1] & 0xff)))
         {
             ui->DeviceState->setText("设备已连接");
             headMsg[0] = 0x65;                       //前面两帧用于测试通信,最后一帧使能下位机烧录模式
             headMsg[1] = 0x01;
             headMsg[2] = 0x01;
             qDebug() << headMsg;
             m_serialPort->write(headMsg);


             ui->SendData->setEnabled(true);
             ui->DeviceDiscnt->setEnabled(true);
             ui->DeciceConnect->setEnabled(false);
         }
    }
}

数据发送程序

void MainWindow::on_SendData_clicked() //test
{
    //srlPortTrMsg();
    uint dataCn = 0;
    uint sdcn = 0;
    ui->SendState->setValue(0);
    ui->SendState->setRange(0,(numCd+2));


    while(dataCn < (numCd+2))
    {
        QByteArray sdmsg;
        sdmsg[0] = 0xf1;
        sdmsg[1] = dataCn + 1;
        if(dataCn < 2)
        {
            sdmsg[2] = numCd;
        }
        else
        {
            sdmsg[2] = int(codeArray[dataCn - 2]);
        }
        qDebug() << sdmsg.toHex();
        m_serialPort->write(sdmsg);
        sdcn++;
        if(sdcn > 5)     //发送失败自动重发最多5次,判断发送失败
        {
            ui->DeviceState->setText("下载失败");
            return;
        }


        if(m_serialPort->waitForReadyRead(20))     // 超时跳过
        {
            QByteArray rvData = m_serialPort->readAll();
            qDebug() << rvData.toHex();
            if((0xf1 == (rvData[0] & 0xff))&&((dataCn + 1) == (rvData[1] & 0xff)))
            {
                dataCn ++;
                sdcn = 0;
                ui->SendState->setValue(dataCn);    //设置进度条状态


                if(dataCn == (numCd+2))
                {
                     ui->DeviceState->setText("下载成功");
                }
            }
        }
    }
}

上位机所需的基本功能已完成,接下来就是对稳定性的优化,小bug修复。

链接:https://pan.baidu.com/s/1DiPwXYnUJ4oXIGD5aFBxLA
提取码:lmib
复制这段内容后打开百度网盘手机App,操作更方便哦

文章没有讲明白的地方或者链接失效可以联系我。

现在这种发一个byte立即回复消息进行检测的方法,稳定性好,但是效率偏低,回复消息要占用很大一部分系统时间,所以在这个的基础上我修改为连续发送长数据帧,发送完成再回复消息进行校验,减少回复消息占用系统时间。

posted @ 2021-04-15 23:45  steven_lg  阅读(238)  评论(-1)    收藏  举报