V1.0可以一句话下载 对于W5500这种高性能模块 非常棒!

V2.0一句话TX在RX这样分布下载 对于W5500也很好

V3.0遇到SIM800C的问题

1 一句话下载很被动 后面一直是RX等待 模块很慢也容易close

2多次TX的话它的问题是你要2048字节它不会一次性给你 它给你1036+若干个 有时候104个 

有时候2个RX过来非常快来不及处理

有时候模块给你其他数据也被你拿走导致BIN不对

所以我想到自己的轮子:

还是多次TX保证自己有主动权 2针对RX有时候很慢有时候很急促我用KFIFO

状态机设计原理:

状态机设计:
1---》
一开始是睡觉 获得信号以后启动干活
干活儿失败以后会再次会到这里
如果有活儿没有干完会在干活
case OTA_STA_SLEEP:
    if(ota.mark.file_len || xQueueReceive( xUPQueue, &pst, 1000 ) == pdTRUE)
  
        log_e("BIG --up_task_entry go to work!\r\n"); 
        ota.otaStatus = STA_WORK_CNTTCP; 
2---》
去连接TCP服务器
如果成功就继续
如果失败就回去睡觉
case STA_WORK_CNTTCP:      
ret = ota_connect_tcp();
if( ret== 0)
{
    ota.otaStatus = STA_WORK_GETHEAD;
    log_e("BIG -- up_task_entry is goto STA_WORK_GETHEAD\r\n");
}
else 
{
    ota.otaStatus = STA_SLEEP;
}
连接TCP的函数自己去搞参数
3---》
去操作尝试下载如果成功就继续
如果失败就睡觉

如果前面已经操作过来 这个就不执行了

            case OTA_STA_GETHEAD:      
                ret = ota_get_httpheadlen();
                if( ret== 0)
                {
                    ota.otaStatus = OTA_STA_SLEEP;
                }
                else 
                {   log_e("BIG -- up_task_entry is goto STA_WORK_INITFIFO\r\n");
                    ota.otaStatus = STA_WORK_INITFIFO;

                }
                
4--》
把socket做出FIFO模式
            case OTA_STA_INITFIFO:      
                KFIFO_ota_Init();
                log_e("BIG -- up_task_entry is goto STA_WORK_DOWNLOAD\r\n");
                ota.otaStatus = OTA_STA_DOWNLOAD_TX;
            break;    
5--》
执行一个TX基本是不会出错的
            case OTA_STA_DOWNLOAD_TX:      
                if(  http_download_file_tx(1)== 0)
                {
                    ota.otaStatus = OTA_STA_DOWNLOAD_RX;
                }
                else 
                {
                   ota.otaStatus  = OTA_STA_SLEEP;
                }
            break;
6--》
            开始接受 出错的话就睡觉 成功的话分为2个情况就复位或者完成接受
            有细节:
            第一失败的处理:需要回退循环看单独文章--也要close在睡觉
            第二成功的话区分独立一次的成功和全部BIN的成功
            注意全部的成功 最后一个不能硬读FIFO它需要软读
            测试一次发行 软度是见鬼的 还是计算一下在硬度吧!!!!
            去做硬度 发现也不对!我的计算错误
            虽然直接发送是可以的 但是它导致我del的头部不对!
            所以TX也要修改!!
            那么在TX修改了RX也就没有必要修改了
            
            测试发现 也有可能是发http_download_file_tx FAIL
            也就是发不出 直接去睡觉 L--LL的逻辑需要优化 
            不如直接放在睡觉的时候操作!!!
            也就是 超时机制+防错撤退机制
            放到睡觉
            但是问题又来了 正常的回去睡觉也会给回退
            我做一个标记吧!
                                ota.mark.once_get_len=ota.mark.file_len - ota.mark.saved_cnt*4096;
            case OTA_STA_DOWNLOAD_RX: 
                ret = http_download_file_rx();   
                if( ret == 0)
                {
                    ota.otaStatus = OTA_STA_RETRY;
                    log_e("BIG -- up_task_entry is goto OTA_STA_RETRY\r\n");
                }
                else if(  ret== 1)
                {
                    ota.otaStatus = OTA_STA_CHKBIN;
                }
                else 
                {
                    ota.otaStatus  = OTA_STA_SLEEP;
                    log_e("BIG -- up_task_entry is goto OTA_STA_SLEEP\r\n");
                }
6--》
            所谓的复位就是TCP断开一下 冷静一会儿            
                case OTA_STA_RETRY:    
                ota_disconnect_tcp();
                ota.otaStatus  = OTA_STA_SLEEP;
                log_e("BIG -- up_task_entry is goto OTA_STA_SLEEP\r\n");
            break;
    
7--》
        对文件检车一般    目前没有写
                        case OTA_STA_CHKBIN:    
                ota.otaStatus  = OTA_STA_SYSUP;
            break;
                
8--》
        准备写入标记位在复位
                        case OTA_STA_SYSUP:
                goto_reset(ota.mark.save_cnt);
                break;

 

代码中嵌入的很深 比如保存bin文件到flash 用到page++ 还有2048这样 后面可以剥离

代码嵌入的深 比如说一下回退机制 后面做了flag回退!

建议 每次上电的时候把回退flag设置为1 !!!

***************************************************单独说明

uint32_t ota_get_httpheadlen(void)
{

            ota.mark.L=0; 
            ota.mark.LL=0; 
            
int http_download_file_tx(uint8_t n4k)
{    

    ota.mark.L =ota.mark.LL;
    ota.mark.LL=ota.mark.L+n4k*4096; 
    此时 一直循环下去
    0-0
    0-4096
    4096-4096+4096
    存在的问题是 我默认了每次都会成功
    一旦有失败的时候我需要把LL撤退回来!
int http_download_file_rx(void)
{
    static struct
    {
        uint16_t   len;
        uint8_t    buf[2048];
    }save;    
    memset(&save,0,sizeof(save));
/* 假如  ota.mark.all_cnt=(n4k*4096)/ota.mark.once_get_len;
每次TX要n4k=1 也就是要4096 而我宏定义是每次读FIFO是2048
那就是ota.mark.all_cnt=2
我第一次是ota.mark.now_cnt 0XFF 拿到HTTP头部丢弃
而ota.mark.now_cnt=0=1=2就是等于ota.mark.all_cnt 完成了
*/
    while(1)
    { 
        if(++save.len==65530){ota.mark.LL = ota.mark.L ;return 1;}//超时机制+防错撤退机制
       
********************************

下图标识http头部del标定值

 

OTA-APP最强状态机

具体代码看附件

GIT暂时太大了TOUCH-KING 银城

 

+++++++++++++++

还是有问题
原稿是:
           case OTA_STA_DOWNLOAD_TX:      
                if(  http_download_file_tx(1)== 0)
                也就是每次去下载1个4K
                当我修改为2的话问题就来了 
                就是最后一包的判断有问题!
                比如
p->file_len= 57724
p->save_cnt= 15
p->saved_cnt= 13

全文是57724 你每次保存4096 一共需要14+1次 没有问题
问题在你每次去保存到硬盘的时候p->saved_cnt的步进值不是1
以前是0-1-2-3-4---14这个样子 你用saved比save小1可以判断
现在是0-2-4-6-8--12-14
比较绕口 打算放弃这个逻辑
如果判断是不是最后一次TX
全文-已经获得的=留下的
如果留下的<前面正常吃需要的 那就是最后一次!

 

测试发现可以work但是问题还有

在保存到硬盘的时候 如果需要回退呢?现在是不需要的 一个4096就是2次 正正好好page++ 但是现在你2个4096的话就page+2了

需要回退一步!

你需要重新写保存的这个++逻辑了! 还是1个4K吧

 

相关文章:

  • 2022-12-23
  • 2021-11-18
猜你喜欢
  • 2022-03-01
  • 2022-12-23
  • 2021-11-07
  • 2021-05-09
  • 2022-12-23
  • 2021-05-17
  • 2022-02-24
相关资源
相似解决方案