QT串口升级程序时的避坑

        本人目前是一名在读大学生,这是实习期完成的第一个“半成品”,以此记录在项目中的踩坑并希望有些可以作为后车之鉴对部分人起到帮助。经过几天的时间终于完成一个QT升级程序(现在基本功能完成,还需要做进一步界面优化和代码优化才能上交)。具体升级原理就不做赘述了,反正看了两天bootloder代码就去 QT了,网上好多博主介绍的都很明了。

        避坑1:一定要确认硬件没问题再去进行软件开发,不然出问题时候会发现问题莫名其妙,找问题也不好找。

在软件开发之前我对硬件做了简单的485通信测试,觉得收发没问题了就去写软件了。到测试 QT端控制32端重启的时候发现怎么也控制不了,检查波特率和时钟没问题之后就开始对这个错误毫无厘头,直到最后换了一根传输线问题得以解决。原因就是原来那根线收发数据可以,但是收发的数据不对(为什么数据不对还没去研究)。而且,就算收发数据正确也不要以为万事大吉,有时候程序里的一个延时至关重要。可能因为485收发方式切换的特性或者是其他原因,有时候一个延时就能起到天差地别的作用。特别是两条指令之间,一定要加延时,延时时间根据自己调试结果来控制。

        避坑2:在QT端运行时偶尔会出现数组越界导致程序异常结束。

造成这个情况主要原因还归属硬件问题就是32端的一条数据被断开成了两条比如本来32端发的“11 22 33 44 55 66”结果QT端读成了“11 22 33 44”和“55 66”,这样会造成在判断时的越界。网上也有通过定时解决的,本人的解决方法是判断发来消息的针头和帧尾将指令再拼接回去:

    QByteArray info= m_serialPort->readAll();
   
    if((info.at(0)=='\xaa')&&(info.at(info.size()-1)!='\xee'))//接收到数据前半段
    {

            qDebug()<<"数据前半段 "<<hexData;
            recvdata=info;

    }
     if((info.at(0)!='\xaa')&&(info.at(info.size()-1)=='\xee'))//接收到数据后半段
     {
            qDebug()<<"数据后半段 "<<hexData;
            recvdata=recvdata.append(info);
            qDebug()<<recvdata.toHex()<<"拼接后";
            recvflag=1;
     }
     if((info.at(0)!='\xaa')&&(info.at(info.size()-1)!='\xee'))//接收到非正常指令
     {
            qDebug()<<"收到非指令"<<hexData;
     }

     if(((info.at(0)=='\xaa')&&(info.at(info.size()-1)=='\xee'))||(recvflag==1))//接收到完整的消息 或者数据后半段读完进入信息解析处理
     {
        //这里面执行数据解析
     }

         避坑3:把无符号类型记在心里。

在最后测试阶段我传普通文件就可以完成传输,但是传bin这种二进制文件就会一直“校验失败”,问题原因就在于我是用char类型加的校验和。这个问题很容易不注意,在找问题时候找了好久。

        在这次掉头发的过程中主要踩了这三个比较难跳出来的坑,感觉程序员最煎熬的就是改BUG了,各种莫名其妙闻所未闻的BUG。改之前还要确定是软件的问题还是硬件的问题,有的问题可能现在有过一会就突然没了。可能是我BUG改的太少,以至于不断的测试BUG原因和想办法去改BUG占用了整个项目大约百分之七十的时间。在读一个博主文章时读到过这样一段“任何事物都有它的局限性,任何组织和个人能力都是有限的”,在完成项目的时候没少得到各位博主和大佬文章的帮助,故完成后把一些问题分享在此。我目前还是小白一个,如果上面三个坑对读完的你有些许帮助,我倍感荣幸。如果我的文章里出现了什么知识性的问题也请大佬斧正,感激不尽。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值