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标定值
具体代码看附件
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吧