使用Air720H 进行OTA升级,下载数据异常

发表在 Bootloader2020-2-11 21:13 [复制链接] 5 120

本帖最后由 面码1314 于 2020-2-11 21:14 编辑
: n4 r9 y8 Y1 M. v+ x
9 T& T9 B. y3 ^( X, ?& d! d; [) x采用4G模块Air720H 通过HTTP进行下载固件升级。未采用webclient组件,采用了AT指令的形式。
. N9 e# Z2 a" D- q4 W+ H! s1 H/ c8 m3 v

' j* a0 J# n/ i' R+ D3 @1.使用串口调试助手和Air720H通信
0 ~6 q* K( {% G7 \: @8 X! _% k0 w* E& @
+ v6 A/ j5 y4 ^! \, o通过AT指令成功获取到 HTTP服务器上的固件。具体如下:
9 j' {# L# ?3 n( e2 z: T( G% \1 ^5 I/ [( ~1 @
1.png
- H4 s3 Y- V5 Z/ v5 R4 N% n" {通过AT指令  AT+HTTPACTION=0  获取到了整个固件的大小字节  +HTTPACTION: 0,200,92240  固件一共92240字节。- ^7 m9 {" g* R" P4 y  ?
: i5 x; L" M5 y/ n" A* K/ g
通过AT指令 AT+HTTPREAD=0,100  获取固件的起始的前100个字节,而 RBLk??^app2.0.000010203040506070809`?荱{qa苎餲噗?%2? 就是获取到的固件前100字节。9 B! D. I4 {2 L7 c, H: D9 @  y2 \- O
) g( K( h( D* i3 I# `
串口调试助手和Air720H通信测试正常。
% M6 C) t, B: E4 ~0 d5 s
+ y3 ?! f) q2 R# H$ ]. h2. 使用AT组件在程序中进行通信4 Q# e& [! r% Z+ T! Z" x; Z

/ c1 l: {2 J3 K! S经过一系列AT指令设置Air720H后,都是成功的。: ^3 ~0 K) Q% Q

5 w8 C$ F& E) a& Q- W7 b* V最后两个AT指令 分别为获取固件大小  和 下载固件  运行结果如下:+ \) V7 U: u- i) P, D' Q
2.png
* J) G9 `! Y% E1 _8 c. }( B8 t& [, D6 I
通过 1 可以知道成功获取到了固件大小  +HTTPACTION: 0,200,92240   获取到固件大小为92240字节  (和 串口调试助手测试的一致)。
* v$ M  J1 c  @7 C  h8 A! v" s$ p# K8 K4 B0 g6 m$ f
通过 2 可以看出向 服务器请求获取固件的前100字节 。 6 \8 T3 k$ n$ W" V+ J" f

7 n! G; \# l/ R第3个圈 是这次请求返回的所有数据 。7 J; k# \( B+ ]: B
正常情况下 第3行应该是 固件的前100字节的数据。但是可以看出返回的数据是  06070809  而不是之前使用串口调试助手返回的 RBLk??^app2.0.000010203040506070809`?荱{qa苎餲噗?%2? 的数据。 感觉返回的数据是其中的一段。
& w0 F6 L; D. l) c4 B! y) W* |3 w+ g- O$ m
以下是上面两个命令AT指令的代码部分& g: n8 h+ @4 e4 c6 h! R! n1 w; [

  H& v* W7 i- Q. P5 C# N
  1.    resp = at_create_resp(200, 4, rt_tick_from_millisecond(5000));                /* 创建响应结构体*/
    : g  W" P6 a$ D' h
  2.     /*获取HTTP 状态码, 由远端服务器响应 200确定(OK)
    & R  t! |, m, x" t. _
  3.             获取请求下载总大小              */, W/ ~. x8 C7 a4 Z+ b+ u! m
  4.           /* AT+HTTPACTION=0 GET 开始9 X# s2 }: M8 [; c% \2 j
  5.   % F) B2 C! c- R2 Q- x
  6.      OK
    3 u  D/ z' s- W* z
  7. ( `/ k3 w# y7 i5 j% W5 i2 x0 ^' D. T) M
  8.      +HTTPACTION: 0,200,92240
      P8 W* X# @% W- X
  9.          */
    4 C4 X1 O+ h9 ~3 P" q8 N/ V
  10.                 if (at_exec_cmd(resp,"AT+HTTPACTION=0") != RT_EOK)% G( z9 y) V3 c- |0 J& Y9 ~. G/ @
  11.     {0 r) K; D8 S- @( F6 Q% k
  12.         LOG_E("AT+HTTPACTION=0, send commands failed , response error or timeout !");
    ! e* R; L* J5 |
  13.         return -RT_ETIMEOUT;
    / z) ]2 G; i2 v2 h* v+ ~- i
  14.     }
    * h, U5 [: f9 v( `: x" r0 x) w- z
  15.      /*提取固件的大小*/
    9 q6 {5 \2 N, h0 z! R5 `9 O
  16.                  resp__buf_data=at_resp_get_line_by_kw(resp,"+HTTPACTION:");" z. V, D7 M$ d$ p2 G/ o
  17.                  at_resp_parse_line_args(resp, 4,"+HTTPACTION: %d,%d,%d", &num1, &resp_status, &file_size);
    + [3 M, B" W( s0 s0 x" |
  18.                  LOG_I("%d,%d,%d",num1, resp_status, file_size);
    9 [4 e* Z: I# I

  19. 5 K2 }+ r# u0 R
  20.                 /*HTTP 服务器响应状态是否正确*/+ I" W8 {! W* i0 P
  21.     if (resp_status != 200)% n- l' k+ i4 v6 o- o) V" u; |! b) s
  22.     {/ h9 U: W2 L6 n( x. J- X
  23.         LOG_E("webclient GET request failed, response(%d) error.", resp_status);, T( d$ P. u3 g! T! g  c( x3 S4 n
  24.         ret = -RT_ERROR;
    6 G2 |+ U6 w# Z
  25.     }
    + c* Q/ X& r! u4 f9 |) P
  26.     at_delete_resp(resp);    /*删除响应结构体*/2 W" z1 \  t9 d' N6 n0 M  ?, n! N
  27.                 # o* a/ L" r* H4 V) E9 H# g" _
  28.                 resp = at_create_resp(1024, 0, rt_tick_from_millisecond(4000));                /* 创建响应结构体*/: ^) J* t- S0 [( L6 S- a4 a) k
  29.                 if(resp == NULL)
    # \& Q3 y, }) ~  E* S
  30.                 {- C  c+ D8 S( V9 t7 ]/ H
  31.                          LOG_E(" create HTTP resp no memory");
    4 {3 P- `* S. x; g
  32.                 }, Z; ?( X6 M5 d# r% u+ }- @
  33.                 ! n7 D" f4 Q/ S3 m' J, Y/ j! }
  34.                 /*请求下载固件的前100字节*/8 G( i' M9 @; x% e% j# k, @
  35.                 if (at_exec_cmd(resp,"AT+HTTPREAD=0,100") != RT_EOK)
    : [) o" q# X2 h- O( o5 i. i. v) w
  36.     {" r- b6 s0 V. n3 Q  C0 `. c' g
  37.         LOG_E("AT+HTTPACTION=0, send commands failed , response error or timeout !");; t. f' P) j. H8 D% K& A2 o
  38.         return -RT_ETIMEOUT;
    / J& U0 B" {0 g$ Q- L8 p8 o8 G
  39.     }5 Z# u+ K4 I% r
  40.                 resp__buf_data=at_resp_get_line_by_kw(resp,"+HTTPREAD:");& R5 s5 a/ A& Y3 c# J' B7 V# o2 ~+ o
  41.                 LOG_I("%s",resp__buf_data);
    0 I+ L$ ^- K6 p6 b  p
  42.                 if(resp__buf_data==RT_NULL)) M# H$ A% {% \2 d9 m6 b
  43.                 {4 K/ v* Q" s8 V! F7 j0 e
  44.                           LOG_E("no +HTTPREAD:");' G# |3 a. h" L
  45.                 }
      W4 n  B. t" {% l  }; R& J8 P
  46.                                 
    ; x+ E+ |. \0 x  ]) m' E
  47.                   /* 按行数循环打印接收到的响应数据 */" A/ o# Y! r3 ]& P5 t! B, D- g! F
  48.     {3 Y* u+ q% U) c" E! E0 K
  49.         const char *line_buffer = RT_NULL;
    % T1 A, s' M5 I: F" h0 E

  50. ( q* ~5 V# X( S" X$ p
  51.         LOG_D("Response buffer");
    - N; [6 M/ |0 w4 Y+ z
  52.         for(rt_size_t line_num = 1; line_num <= resp->line_counts; line_num++), U# `+ z( L% J9 R
  53.         {
    % z9 m( q3 q: H3 @% {: }
  54.             if((line_buffer = at_resp_get_line(resp, line_num)) != RT_NULL)
    1 ^1 b- Q. g* n
  55.             {
    & u. {4 b( T2 G3 T* i. v7 Y5 ~
  56.                 LOG_E("line %d buffer : %s", line_num, line_buffer);, P0 F# m" u  k- F
  57.             }' k5 ?3 Z* Y, @
  58.             else  ~0 Q2 n' L6 A$ r  M( Y9 P8 P9 r
  59.             {! X& V# P2 d& W) V$ W2 s. v
  60.                 LOG_E("Parse line buffer error!");( @) t$ m# B3 O
  61.             }
    ( W& T' }' Q. @8 K
  62.         }* c/ y, k7 t2 T0 N9 b5 u1 q+ l
  63.     }
复制代码
, H: {8 p. H$ ^* V) N2 x* q
9 G: W1 y  C; _% p4 \

  `: {7 O: A. c" l! o, Y# R其中还遇到了另外一个问题, 在请求下载固件AT指令前如果先进行了 对 download 分区擦除下载分区 。那么将会出现以下情况。
2 ?6 Y4 q* `- Y2 ^3 S, p 3.png
" \' Y, K# N+ `6 f$ V9 U) z' r
  k3 ]: d' Q9 C( }: J2 o7 a+ j可以看到  依然获取到了待下载固件文件的大小  并找到了download分区,并成功擦除了分区
( z8 l& L" k# f- J: ]但是从最后的打印数据来看 似乎没有自己想要的固件数据 ,甚至可以说什么返回数据都没。
) y3 y  n  g, x0 @- h  F( I
3 O9 d5 T7 O% B+ Z" x这部分代码如下 ,仅仅在 获取云端固件大小  和 下载固件两个操作中间加上了 一段擦除download分区。
3 A# R& x1 d4 j# o  j; y* b1 ~
  1.    resp = at_create_resp(200, 4, rt_tick_from_millisecond(5000));                /* 创建响应结构体*/7 E$ V$ [& {7 r# s5 u  N- k" v
  2.     /*获取HTTP 状态码, 由远端服务器响应 200确定(OK)
    - [  r0 r0 g# U( `! b& h
  3.             获取请求下载总大小              */
    * P  J, p, [3 f+ X3 y% \) F$ g
  4.           /* AT+HTTPACTION=0 GET 开始
    ( R# b" a3 q/ t7 b; K. S
  5.   % `) V8 v+ a2 q* }3 A
  6.      OK
    6 Y& v/ {! R5 `' g

  7. 7 ^+ I6 k# X7 B$ T3 x$ e. w" X2 c
  8.      +HTTPACTION: 0,200,92240
    + s7 j8 E& i( X$ ~' ^
  9.          */* Y) m8 I1 P* |! b1 g9 W" o' n8 Y0 ~
  10.                 if (at_exec_cmd(resp,"AT+HTTPACTION=0") != RT_EOK)
    ( M0 p' s: k9 E" S0 `
  11.     {
    + L$ G0 a; h0 X& K3 |$ E4 }2 H
  12.         LOG_E("AT+HTTPACTION=0, send commands failed , response error or timeout !");' `: l& \: }! i. A9 ?: c) U+ R
  13.         return -RT_ETIMEOUT;) \3 L9 s& N& s! H8 z7 Y
  14.     }
    : \: W/ B, y' C# B  X
  15.      /*提取固件的大小*/
    1 t. o+ R, ?* V6 k2 V/ P8 X' N
  16.                  resp__buf_data=at_resp_get_line_by_kw(resp,"+HTTPACTION:");
    - ~4 ~1 X) L3 s( L5 f1 t
  17.                  at_resp_parse_line_args(resp, 4,"+HTTPACTION: %d,%d,%d", &num1, &resp_status, &file_size);
    & L# B. k2 ?+ c  f' g3 J) B
  18.                  LOG_I("%d,%d,%d",num1, resp_status, file_size);3 G3 X7 v5 I% t( i1 j: ^

  19. 7 C! g: o. Z: y6 j3 n- m2 r: w# a1 C
  20.                 /*HTTP 服务器响应状态是否正确*// u- @. \  M" f# o9 k
  21.     if (resp_status != 200)
    4 Y/ p# M: @9 W
  22.     {
    $ E+ A6 R7 N" F* Z' A- o
  23.         LOG_E("webclient GET request failed, response(%d) error.", resp_status);" `" t; l. D' l$ |! c( v& V/ J
  24.         ret = -RT_ERROR;
    - ~' n0 M' l3 A. i/ Y- H$ s) X
  25.     }
    ) U7 m' S- M, }8 x# I
  26.     at_delete_resp(resp);    /*删除响应结构体*/
    4 Z0 S: T. q* t$ K, v5 X& }- ]# {
  27.                 5 W& J2 g- B  }
  28.                 /************************添加擦除 下载分区代码 ***************************/( _) T3 c  J) f
  29.                 ( b" P$ Q( k% ]# f! i, U
  30.                 //    /*获取总共固件大小 合理性检测*/* E6 O+ C" f) B# y
  31.     rt_kprintf("http file_size:%d\n",file_size);4 T# G( B" U5 x* L4 G* ?4 B1 J4 D
  32.     if (file_size == 0)! _8 l: M7 g9 d& ]9 o
  33.     {3 \2 W& G+ m; o) k0 o' y" M6 E
  34.         LOG_E("Request file size is 0!");
    3 n" R! h# D, [  |' c% y
  35.         ret = -RT_ERROR;3 C1 f1 Z9 k6 x) Z4 @$ X
  36.     }: q6 d) l" ^4 q2 c8 x6 ?- ]
  37.     else if (file_size < 0)
    / A8 T. W: ~; i' h: t
  38.     {
    % Y: x! Y+ f/ R" f
  39.         LOG_E("webclient GET request type is chunked.");
    0 l, @7 J% u# W
  40.         ret = -RT_ERROR;$ w4 |, z7 E! W2 W
  41.     }' v# W2 ]( f4 Y7 F0 @. S6 ?
  42.     /* 获取下载分区信息并删除下载分区数据 */+ b# x1 a( i, s* Y: V/ x8 J) O' n8 I
  43.     /* Get download partition information and erase download partition data */: u8 A. f. [7 y! Y6 T/ u, ?  p
  44.     if ((dl_part = fal_partition_find("download")) == RT_NULL)
    * ]* x, L6 Z& o* ~  t5 e; O5 _
  45.     {
      K1 F& F* _: @
  46.         LOG_E("Firmware download failed! Partition (%s) find error!", "download");
    : V' ]7 T" o, y' v# w
  47.         ret = -RT_ERROR;
    2 d" a( ]. H! ?
  48.     }# p% K* T( p! a! S( F
  49. % z2 d# _1 g' V1 A0 M% s4 ?2 e) b# }
  50.     LOG_I("Start erase flash (%s) partition!", dl_part->name);
    3 R. c# i+ h( C' i

  51. , E7 l! D$ [5 c" e2 C
  52.                  /* 擦除下载分区 */4 E) |/ B2 Z% E7 T' F9 v
  53.     if (fal_partition_erase(dl_part, 0, file_size) < 0)8 S8 t7 W/ d3 O+ A+ P1 T
  54.     {
    ! F3 E8 G1 l* X* X! N
  55.         LOG_E("Firmware download failed! Partition (%s) erase error!", dl_part->name);
    4 O, c. {' z$ ]" T: k
  56.         ret = -RT_ERROR;
    ) U0 z6 C4 X" y% G; {
  57.     }- J6 i1 M2 p( x0 b# B
  58.     LOG_I("Erase flash (%s) partition success!", dl_part->name);# {! ~) b( k' S7 s( w

  59. 0 t8 _# [% c% {8 G
  60.     buffer_read = rt_malloc(HTTP_OTA_BUFF_LEN);  /*申请4k存储空间*/. v2 q4 g; K0 P& V. M
  61.     if (buffer_read == RT_NULL)0 u9 {* c/ I2 P/ ~
  62.     {
    " t' V9 y( i* d! }5 O
  63.         LOG_E("No memory for http ota!");
    , c6 V; o/ m8 t1 q$ X3 @6 q% F9 g
  64.         ret = -RT_ERROR;
    / v9 E/ O" h7 ^& S8 q. l
  65.     }
    3 I" {0 e* s4 `4 I# F- D: f! c
  66.     memset(buffer_read, 0x00, HTTP_OTA_BUFF_LEN);
    5 L' j% v3 H& E0 V2 F6 v! A. }2 e
  67. / A6 H2 j% m! e# s5 v7 Z
  68.     LOG_I("OTA file size is (%d)", file_size);
    * R  j$ g/ ^' o7 U% F8 A. q
  69.                 4 p; _5 H4 z) U1 K8 h
  70.                 /************************添加擦除 下载分区代码结束段 ***************************/) `, Q# H0 s, V* [
  71.                
    1 a! Z4 t" B' {  R0 e1 M* Z
  72.                 resp = at_create_resp(1024, 0, rt_tick_from_millisecond(4000));                /* 创建响应结构体*/
    - H/ z5 E% H, A' O; t
  73.                 if(resp == NULL)5 C: z, _: V0 v; n. d; }% Q* ]9 ^& S, Y, Q
  74.                 {% ]* S3 \! I% C6 I; h/ |8 Z
  75.                          LOG_E(" create HTTP resp no memory");' Y9 i/ q" N6 L- o$ `
  76.                 }3 @3 J; T7 {' X. W" t
  77.                 5 H/ Z3 ?: L) T% v$ a+ u
  78.                 /*请求下载固件的前100字节*/
    " @! P  ]  f, n+ u, e  R& ?. K
  79.                 if (at_exec_cmd(resp,"AT+HTTPREAD=0,100") != RT_EOK)& I. X. E' e9 `6 I5 e, Y
  80.     {
    0 H. I/ T6 ^9 [- Y; q4 s. K
  81.         LOG_E("AT+HTTPACTION=0, send commands failed , response error or timeout !");8 r  T# V9 j; m# Q, x; i/ Z
  82.         return -RT_ETIMEOUT;
    1 Z3 O- X7 B& P# r
  83.     }, L9 B8 a. G; `4 o( P
  84.                 resp__buf_data=at_resp_get_line_by_kw(resp,"+HTTPREAD:");1 u/ k# W2 G* C9 X
  85.                 LOG_I("%s",resp__buf_data);
    2 u' @% b0 Y- q; q3 \. m" I% Y
  86.                 if(resp__buf_data==RT_NULL)" }" u7 z8 J6 G8 k# v+ X
  87.                 {
    4 Q" Z" C: U+ p( X
  88.                           LOG_E("no +HTTPREAD:");% J  R' Z0 Q8 O0 ?- B0 z
  89.                 }: E+ T8 H$ G- C5 }' ^+ a
  90.                                 1 M0 X* \3 w: W
  91.                   /* 按行数循环打印接收到的响应数据 */
    3 K2 `, C6 l% J! ?
  92.     {3 p, I  a2 l' x% R; H8 e) q
  93.         const char *line_buffer = RT_NULL;, N. V8 T+ k% ^) i7 `
  94. $ V5 n% g3 x# |6 s" {1 y7 F$ U9 G
  95.         LOG_D("Response buffer");' {; D3 ^3 f4 b$ _" Y2 A$ c
  96.         for(rt_size_t line_num = 1; line_num <= resp->line_counts; line_num++)
    : @, ~* D6 Z* X8 s
  97.         {0 N1 W; }. N7 [# I+ @& G
  98.             if((line_buffer = at_resp_get_line(resp, line_num)) != RT_NULL); D4 S& M5 F' L# c
  99.             {
    - k0 S6 y; A3 a
  100.                 LOG_E("line %d buffer : %s", line_num, line_buffer);
    + H% U* ~& F" r1 C8 Q. O5 Q
  101.             }, {+ O% A# X4 c0 H
  102.             else
    - J; T, z' t5 J; ?# |- V- x) h5 R
  103.             {
    $ m5 E9 E+ H) z. @0 L. @/ |8 p5 l
  104.                 LOG_E("Parse line buffer error!");4 P0 B) X9 T) @1 G5 r
  105.             }. f" q' p. e- d% N3 D  u; c1 K
  106.         }
    / y/ N- l" G  i; D$ a4 h  M7 Z8 Q
  107.     }0 g; G3 \' U" A% H
复制代码

) e2 X) R) ?' Z- X8 Z6 r5 c1 j4 C' h
; _4 F3 {2 ]4 L: p3 x) B" u
1 z8 N+ }9 z* Y. j2 p* U, K; e
各位网友帮我提提意见,接下来我应该如何调试
! x- B7 E- i( i3 c: u" x
9 ~# \1 E: z* b  g
使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 2020-2-11 22:27:12 | 显示全部楼层
本帖最后由 面码1314 于 2020-2-11 22:28 编辑 7 [. K5 k2 h7 X6 D
$ @0 N: n& U+ O! E# c1 s0 I
继续测试发现,突然想起之前重新使用 ENV后忘了改串口缓存大小  
; K# g) T* x! D0 o; P/ G" S7 V% k  G修改 打印串口大小 RT_SERIAL_RB_BUFSZ = 2048
3 P1 u$ p. o* W# n2 [4 l自己用于AT指令的客户端 串口大小已经设置为  5632* u5 Q& V8 e3 p
  1. int at_client_uart2_init(void)
    : J% t. |3 M3 n$ r
  2. {* S/ h# e3 @% ~) H8 d. i. `
  3. #define AT_CLIENT_RECV_BUFF_LEN         5632    /*串口2接收缓存*/- d* N' o" s/ K5 K
  4. #define AIR720_UART  "uart2"
    , o, y' a2 |7 H5 h+ ?$ x3 [$ c- e
  5.     rt_int32_t error_num = 0;        
    ) f3 u) l' L. S2 j
  6.     error_num=at_client_init(AIR720_UART, AT_CLIENT_RECV_BUFF_LEN);   /*配置at客户端*/
    6 V; o: @5 S" `) O" r
  7.                 return error_num;$ a: D/ f' ~9 [7 }! @- F( J6 a. ^0 L
  8. }8 M. Z  h. G5 ]8 v. f% o6 y8 r
  9. INIT_DEVICE_EXPORT(at_client_uart2_init);    /*外设驱动类自动初始化*/
复制代码

2 ]! g1 q) `- N1 f2 R4 J) L8 m& R9 W, `, x7 i) n* e3 d
接着继续调试测试 ,发现加上 对download分区的擦除代码后,AT指令获取服务器固件数据有了。6 F4 K9 l6 T2 ~' ]3 h, n
但是 只有开头的3个字母   RBL    恰好是固件未乱码数据部分的开头  RBLk??^app2.0.000010203040506070809`?荱{qa苎餲噗?%2?8 N0 b6 [& ]5 W7 Y% n
) \$ J. {2 ]+ X& ?6 d5 j6 x
4.png 2 s. E7 c, w1 N0 T

# @2 F. Y6 k$ x1 I$ T同时还发现个问题 ,此条AT指令响应结构体设置的为 " c' A0 U. I0 s2 z. Y
. L4 ?: H( x: S( J# y3 {

1 Q1 D# }5 t7 r8 g! d! H6 @resp = at_create_resp(1024, 0, rt_tick_from_millisecond(4000));   % N: |8 M- G  b7 T: |9 c

4 }% D# A0 I  t, u4 `
$ [$ |" W9 `1 c* n+ g  ^3 n6 v
意思是,在未超时的情况下,只有收到 OK 或者 ERROR 才会认为接收完毕。 但是最后打印的所有接收数据缺没有 OK 或ERROR。* d& Y+ W6 D$ i
( a" \& T9 M3 @' V
- o: s' v- o' ?8 @
现在我就觉得是不是数据乱码的问题导致的。
: `+ |3 l, j% F4 D& s4 Q6 V) f" j  L' O! ?
测试:  上传了一个文件文件  进行下载打印前100字节4 i) y' ?' h9 f, J6 y
/ S' D1 t. O5 C& J) W7 o8 S/ ?
5.png
. ?7 g  b% o& |2 g# Z" `8 i' z8 s5 ~4 v
下载  结果如下
( O) ]6 H# t1 N# |' I& h+ Y. n 6.png * o3 D: t" u) y1 V
通过1知道了文本 大小126字节
* R# f/ l* i5 Y通过2知道 成功下载了前100字节+ \9 C. O8 E5 k2 A4 K% b1 t' |
通过3知道 得到了响应的OK
) @1 y- Z, }9 |2 w
! }' x: R7 j* `# B7 ]. b: J8 }) z

5 p1 o/ E0 D9 i  A难道真的是数据格式的问题? 如果是接下来应该怎么办呢. O9 D# O; [  k/ A9 I% X! y
/ o0 {" ~# W8 R
使用道具 举报 回复
发表于 2020-2-11 23:23:22 | 显示全部楼层
继续调试  C0 o" T5 \0 V3 Q' T  {

9 F2 J# w# i; E) o4 k
  1.   /*请求下载固件的前100字节*/( P$ H8 q/ s1 b; e0 {- z
  2.                 if (at_exec_cmd(resp,"AT+HTTPREAD=0,100") != RT_EOK)
    ' E3 `! ~8 Y& v# I
  3.     {+ P/ ]- g" K* J, x, O- q) l  \
  4.         LOG_E("AT+HTTPACTION=0, send commands failed , response error or timeout !");0 y- B4 r% \! _0 ^  i- x  I2 r3 y
  5.         return -RT_ETIMEOUT;
    4 }1 d3 P$ \  s; i
  6.     }/ I2 O( H! P# H- g' |- {
  7.                 resp__buf_data=at_resp_get_line_by_kw(resp,"RBL");
    2 ]) y7 \$ p3 u$ k! X8 @% r. m6 K4 w
  8.                 LOG_I("%s",resp__buf_data);% ~* i0 L& j; S: Z& {
  9.                 if(resp__buf_data==RT_NULL)9 L% Q1 i$ n8 t3 v" y' b8 M
  10.                 {4 ^3 g$ H0 S1 U& Q
  11.                           LOG_E("no RBL");+ G6 n; [! A4 K( o3 j+ K: A, V
  12.                 }; Z* k6 h1 m" b9 ?2 a* {
  13.                 ulog_hexdump(LOG_TAG, 16, (rt_uint8_t *)resp__buf_data, 100);
复制代码
使用  ulog_hexdump(LOG_TAG, 16, (rt_uint8_t *)resp__buf_data, 100); 将 数据进行16进制的形式打印。
% M0 {. Y5 S4 z" I7 @8 e: N# L

& C% d8 Q+ C7 d5 H得到了如下数据2 I8 c7 [0 f- W
7.png 0 \9 a6 p3 V5 P* k  P$ H

7 s4 M) x7 m$ X; H使用UltraEdit 以十六进制 打开源文件    对比1 Y% H7 o/ X. a4 N3 t* S9 Z

; v5 v) K3 a) W1 h0 K* ^& o 8.png ( p+ n7 k" v' ?5 O/ Y
5 j+ ~+ ?5 l2 r8 _9 f" @
一致诶  。数据没错2 k2 H. ?3 f5 d- b. F

1 k7 X6 Q1 z* j/ m5 r; u8 B明天继续搞 下载进去看行不行,看能升级不6 \; |* ~% |" W1 ?5 w

9 N& v6 t0 S: T) }8 P" x; M1 r8 ]
使用道具 举报 回复
发表于 2020-2-14 17:18:53 | 显示全部楼层
没有详细看完,太多了。在使用AT指令读取下载固件的不能使用正常的at指令发送,接收应答的方式,这是因为固件中数据变成了AT指令的应答,固件什么数据都有,比如是OK, ERROR,\r,\n这样的数据,这些数据会导致AT模块代码分析AT指令的应答时产生错误,你的问题原因出在这里。% ]) O. H$ r( m* h3 j
         告诉你修改的方法。读取固件代码的函数中只发送AT指令,等待一个信号, 对于这条AT指令的返回的数据,使用的urc数据的方式处理,参考模块底层驱动代码中模块接收TCP连接数据时,处理接收数据的方法来实现,接收到数据后发送一个信号给等待信号的函数。
使用道具 举报 回复
发表于 2020-2-14 23:04:05 | 显示全部楼层
fhqmcu 发表于 2020-2-14 17:18
" ?8 p. w* S6 ?& i' _! E没有详细看完,太多了。在使用AT指令读取下载固件的不能使用正常的at指令发送,接收应答的方式,这是因为固 ...
0 [, p# d  X( G: C( @
感谢你提供的解决办法。, u6 r! U8 h' ~) r, _9 K
确实遗漏了关于固件里面什么数据都可能存在的情况。
使用道具 举报 回复
发表于 2020-2-16 14:55:11 | 显示全部楼层
fhqmcu 发表于 2020-2-14 17:18$ F* Y7 D6 f8 U% q1 I
没有详细看完,太多了。在使用AT指令读取下载固件的不能使用正常的at指令发送,接收应答的方式,这是因为固 ...
' k7 U# J0 m) o* Q& R# Y# o3 V0 s
感谢提供的思路和解决方案。已经成功解决之前遇到过的有时无论怎么升级都不能成功的问题。现在测试,已经可以稳定连续升级10个版本了。
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|RT-Thread开发者社区 ( 沪ICP备13014002号-1

有害信息举报电话:021-31165890 手机:18930558079

© 2006-2019 上海睿赛德电子科技有限公司

Powered by RT-Thread

快速回复 返回顶部 返回列表