YMODEM协议串口文件传输 GitHub仓库:http://github.com/XinLiGitHub/SerialPortYmodem* I9 [, C) J [& {+ a2 i4 j% b
PS:博文不再更新,后续更新会在GitHub仓库进行。. Y5 y% c! O6 E1 t
; ^6 O; c: \$ }! E
9 K2 L- e# s) a' x k- z7 E 串口通过YMODEM协议进行文件传输。程序中涉及到YMODEM协议知识,详细介绍见维基百科[YMODEM](http://en.wikipedia.org/wiki/YMODEM)。9 A1 X" R. S3 r; N- W/ U
! E$ r. T/ R, ^! M( N0 Q$ `
1,开发环境
, B5 o' K' T2 k4 i2 L 1,框架:Qt 5.7.1
: I' q. M. `, x" o! S6 B* a8 v
% C# z) [+ n' V' N1 {$ i. d 2,编译器:MSVC2015_64bit, E* c6 N7 @0 U3 u- ^8 J4 I3 e
: `" e( X/ l% G& I 3,IDE:Qt Creator 4.2.0 社区版
c1 j+ P* x, @. ~9 b 4,操作系统:Windows 10 专业版
7 {$ [# F' Y% [
0 C; _+ p9 V; v. k( I2,程序源码
3 S C/ G7 { I* v* m9 n Ymodem.h文件0 s1 ?+ U1 d/ V" W( ?+ n
- /**
+ ^- X. h$ r' K7 V - ******************************************************************************
7 K7 ?9 C" C* a2 L - * @file Ymodem.h3 x1 W) a" \- x1 j# u4 T4 t
- * @author XinLi
: s7 ^1 S3 r5 |0 |3 h% [ - * @version v1.0
, H# U m. c$ [* d: T - * @date 21-January-2018
, M/ _, J& ~; `" T" z0 A3 A2 u - * @brief Header file for Ymodem.cpp module.
5 B3 X1 N9 v% j; L, P, f - ******************************************************************************: v" R/ B# \ t
- * @attention2 i% l- m8 {% @/ S
- *3 u' e8 x5 m3 a8 |8 J W
- * <h2><center>Copyright © 2018 XinLi</center></h2>
' w' V& a6 t' x' s5 N: D+ V2 N - *$ r2 [: s" K* x" Q
- * This program is free software: you can redistribute it and/or modify
0 G# C9 X: v: s9 c+ O9 {" \5 I - * it under the terms of the GNU General Public License as published by" e/ x" r6 m" P( b w
- * the Free Software Foundation, either version 3 of the License, or2 _; H2 Z2 Q$ U h5 o# @( L/ R+ r
- * (at your option) any later version.
9 Q4 K' V# ?1 x% o - *# S* m! U) b# o" e' A( T
- * This program is distributed in the hope that it will be useful,) N4 K1 L: j+ n" B0 W, @" F% u
- * but WITHOUT ANY WARRANTY; without even the implied warranty of' `1 m$ I5 W' N2 I: z, M* D
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the# T) Y) K* T: a6 `
- * GNU General Public License for more details.
. y5 z, V9 H6 M2 [7 b - *
8 k- L2 I, @% _& ~+ d - * You should have received a copy of the GNU General Public License/ B+ o5 A6 F+ G7 n+ ^( b7 J- z+ J
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- @- y E7 j$ C5 I2 ]9 Y& w2 h - *
8 j; d& E& ~+ D6 ? g% ^3 ^ - ******************************************************************************
* J: s( J8 ~% x: Y- p - */
. w3 p9 K0 D' v# J - $ t/ `8 b7 d" Q M- u
- #ifndef __YMODEM_H- b4 t, g0 y8 o9 k5 L
- #define __YMODEM_H( F) i. n0 r: O. k9 V5 [# d" k
- , c. k7 R: @: _0 O* Z7 ~
- /* Header includes -----------------------------------------------------------*/) |0 `& S9 F8 E& {
- #include <stdint.h>& w- P3 e* t8 T# d4 V0 x' a* j
- . I9 z0 ^8 D6 c* L* ^# N
- /* Macro definitions ---------------------------------------------------------*/
2 ~8 L5 \- z/ W* F - #define YMODEM_PACKET_HEADER (3)
3 N& T7 M8 {" Q. [# `2 Z# N$ f - #define YMODEM_PACKET_TRAILER (2)
6 {' ^4 [( U) c2 _: a( o p+ r' l2 n - #define YMODEM_PACKET_OVERHEAD (YMODEM_PACKET_HEADER + YMODEM_PACKET_TRAILER)
% \- T2 d1 d) Z2 T - #define YMODEM_PACKET_SIZE (128)
7 }0 `2 Y/ f( f - #define YMODEM_PACKET_1K_SIZE (1024)
7 T' U5 U; `9 B - 4 b; B k$ t, [% c. T$ s% b; K
- #define YMODEM_CODE_CAN_NUMBER (5)
, l4 t+ ?, s6 h. \6 ^ - 2 V( t% E) }& Z, X, f. N6 k6 _
- /* Type definitions ----------------------------------------------------------*/
, C6 O: |* A( ^+ b3 A - class Ymodem
1 H5 h3 O* F( S( j3 l - {
3 [& I/ ?, T' u C; L5 I3 ?( G - public:& d" m9 ~( Z7 r
- enum Code
9 V+ {% S" {5 |. v- ^# e - {
C- c1 }* Z3 R, [ - CodeNone = 0x00,
6 P: s" V6 T$ F- } - CodeSoh = 0x01,
1 D$ F6 e2 ]; e, P: m7 J - CodeStx = 0x02,/ v1 M: ]; h7 R+ _
- CodeEot = 0x04,
. E0 t) e# G9 X+ A) O; l: g - CodeAck = 0x06,: J. A& J" Z) W, {
- CodeNak = 0x15,
* S$ {( m: E% J* J - CodeCan = 0x18,' b) V& c# i0 S
- CodeC = 0x43,
) z# O: `4 ~9 c8 P, { - CodeA1 = 0x41,4 R9 ^2 O9 _& ]
- CodeA2 = 0x61( o8 N) @$ p) {. x1 {& s
- };; A# v: A; Z" E& n/ b
5 v( F6 k( v2 D# G& e: ?( J- enum Stage
2 z. ]8 X; @# j% t2 f - {
7 j4 m( T* f* v! ]3 K - StageNone,# _' P. I( p, L/ R7 @
- StageEstablishing,
: P0 r' ^; o: {* q+ X - StageEstablished,- z( v5 P5 c! ~" C' M* u- i
- StageTransmitting,
) u) B! L" l, ], [* { - StageFinishing,
# e. V2 v4 v' a( @) ? - StageFinished3 M9 R/ j7 l* T+ y, q- ^
- };0 R( m H1 H' S+ j1 P
8 |* t- {7 A% `2 a- enum Status0 l# N$ G9 o, H( z' \1 K
- {
1 q- y7 O& j$ k - StatusEstablish,
6 L/ p% t; P3 V! z0 d4 S" [ - StatusTransmit,
. Z! l4 e# u) H/ |! a - StatusFinish,
* B) z: G0 ` e1 ~5 h1 y - StatusAbort,
" }% `3 C$ M7 G" p, ?9 g, L - StatusTimeout,& n! d9 d6 p9 i- s+ x2 y& i
- StatusError$ a2 k; r& l- s# h* ?/ ]
- };
3 j+ c( }: K v2 B% _, c* |# g5 B
- h0 G2 L/ I2 e+ p' S+ s. x3 f- Ymodem(uint32_t timeDivide = 499, uint32_t timeMax = 5, uint32_t errorMax = 999);
, R/ \, R- ]0 q2 ]. @" T - {1 c9 J* _) X# _) J5 t+ j
- void setTimeDivide(uint32_t timeDivide);0 t- u1 [' l4 C9 i/ a+ ?6 I
- uint32_t getTimeDivide();, v5 a; P. t2 b2 q& ]1 A7 W
- h# Z2 M" A3 {# F, [) N% [9 q' ~- void setTimeMax(uint32_t timeMax);/ z' v; r2 c/ B& U$ D8 }, I2 q* M
- uint32_t getTimeMax();
) m( H/ Y8 p5 P, r1 `
P/ k* g6 ~. W' O; x( |- M7 ?/ e- void setErrorMax(uint32_t errorMax);
3 n2 \( [: A- Y" u7 u L% W - uint32_t getErrorMax();2 K( D* ^' n* W* q7 b8 j& O0 B
4 a( ^: }6 J F- void receive();
9 Z/ P0 u e' a, Q$ B: H/ E - void transmit();2 e' O3 @6 a$ | C8 v# o/ I' r" e
- void abort();
& }2 i; D u: W7 e8 ^- w - / T- T" J+ i/ U2 g" c3 y
- private:
5 W T2 U5 y: a5 R$ O3 x' Q - Code receivePacket();8 g/ b) f+ P8 G8 j
6 J( U. g) g- j8 g% a W6 P- void receiveStageNone();
3 K4 t- A" U U. h - void receiveStageEstablishing();/ q! H8 \; f0 D, i
- void receiveStageEstablished();8 r7 O$ b# a: _7 ]% M$ ^ a
- void receiveStageTransmitting();
4 m6 p" h9 y9 T) o3 `4 p3 k - void receiveStageFinishing();$ i4 w7 p0 W7 ~# y5 s o/ B
- void receiveStageFinished();
7 n8 T7 @ m% K8 H% t5 W4 o+ j- B - 4 E3 w; H# Y# [% L7 S5 I
- void transmitStageNone();
; v! C# u9 B' H. P - void transmitStageEstablishing();) H2 V$ c3 ?0 b, k
- void transmitStageEstablished();+ Q& |( C7 M, o6 G$ {
- void transmitStageTransmitting();1 o! Q3 ?2 h2 f0 Y, ]( s
- void transmitStageFinishing();% g0 b9 b: b5 D4 V
- void transmitStageFinished();
; {% ?/ o Y0 f5 c f - - G" @' T6 K Y8 A# p
- uint16_t crc16(uint8_t *buff, uint32_t len);9 A! _! B* O' \1 F7 N# T
( o! e5 f- E. N- virtual Code callback(Status status, uint8_t *buff, uint32_t *len) = 0;
1 t$ Z- o) Y$ [( l3 ] - # X, M, r/ J" }0 }8 b5 w1 s
- virtual uint32_t read(uint8_t *buff, uint32_t len) = 0;. O* a( }* u. c. l# ?. {
- virtual uint32_t write(uint8_t *buff, uint32_t len) = 0;2 w9 Z6 u( H, L2 |; c9 ^
! S6 J% h' w7 t6 Z- uint32_t timeDivide;/ f" d7 ~' e6 c' O! a6 e- U
- uint32_t timeMax;3 [0 B( |4 U: m+ L9 s" Q: ^
- uint32_t errorMax;. B- u! W7 m4 U1 o3 S' g
- 8 Q# V$ d2 ~" R; k( Y; O3 X
- uint32_t timeCount;
2 u3 B$ l6 [! o) s" v5 p - uint32_t errorCount;7 Y( ^8 l8 f" s$ f1 ~
- uint8_t dataCount;; p8 [4 d0 _- [7 |6 G4 I" w* f: B5 d* y
# X/ `9 l3 P$ V* ]: |& @% x- Code code;9 r" d4 S0 B; c$ ?& k7 p: `& T" m: j
- Stage stage;
7 l' J: G0 x) ^+ ^- m9 ^! E% E - + S0 O* f2 B- c3 T1 O0 `
- uint8_t rxBuffer[YMODEM_PACKET_1K_SIZE + YMODEM_PACKET_OVERHEAD];5 m) t: y8 x5 I* k* X2 g: k* e( {
- uint8_t txBuffer[YMODEM_PACKET_1K_SIZE + YMODEM_PACKET_OVERHEAD];
& Y2 }6 f% A: }- a - uint32_t rxLength;
/ p a) d+ k$ I) \ - uint32_t txLength;" j2 O: ?" @2 E& A& X
- };
& _& u4 a, `# H% T8 ~1 R - & {% D1 c4 J: V0 K5 u. b( U$ i
- /* Variable declarations -----------------------------------------------------*/
4 A1 I3 V1 D- }: z5 _ - /* Variable definitions ------------------------------------------------------*/
7 W, h7 O: [$ d: u% Q0 ^' i# ] - /* Function declarations -----------------------------------------------------*/
, S+ W# u- c6 z. T - /* Function definitions ------------------------------------------------------*// H8 m8 Y+ e# T9 o* i
8 `( X. k, E7 d7 l2 e! m- #endif /* __YMODEM_H */. r: E# n% Z1 B% j& b7 V6 ?! K
复制代码 2 R5 i- {9 u9 @( u
Ymodem.cpp文件
* H/ r' W& G+ W6 e7 k- /**# k0 h2 D1 l U( k/ r
- ******************************************************************************, H! N! c1 a# F4 o- f
- * @file Ymodem.cpp
4 b$ n) f) K" d% l. A - * @author XinLi
( v# K5 Q6 Z0 G7 k' \ - * @version v1.0/ I% n7 g. T1 T4 t4 V# l d1 t
- * @date 21-January-2018* T' g: ~1 _2 @
- * @brief Ymodem protocol module source file.
; D8 \1 Q9 O& w' k - ******************************************************************************' `, }' C5 ?% G$ E& S7 r
- * @attention- u+ M9 ~, A# @" s: i. ~* e- X; u
- * J, V4 W" x% | D" l; e" d
- * <h2><center>Copyright © 2018 XinLi</center></h2>
6 S, @, W: \# {3 F. @ - *
& e$ s, y) s! ?9 f' O7 Y9 @ - * This program is free software: you can redistribute it and/or modify" F5 x3 O8 h' I
- * it under the terms of the GNU General Public License as published by. ? x5 A3 M& g$ q& @3 H; A
- * the Free Software Foundation, either version 3 of the License, or
! H0 H7 x$ w4 u7 g: ]1 d - * (at your option) any later version.
+ I% G- X% q6 H9 Z s! ]; g - *: S- D- O5 Q+ r" L# w% Q
- * This program is distributed in the hope that it will be useful,
5 K7 F# c2 |2 u& N2 Q - * but WITHOUT ANY WARRANTY; without even the implied warranty of% m P l& q+ A! M
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the% u% k7 e) Y: o" Q- x
- * GNU General Public License for more details.3 S) A Q+ X) t+ _$ b6 Y
- *( C3 c% X9 |4 _6 f7 H5 p; V+ I3 ~
- * You should have received a copy of the GNU General Public License) U" J: _& g/ c' }" \) F
- * along with this program. If not, see <http://www.gnu.org/licenses/>.4 F, A. \& M0 q- q
- *
3 U1 T- w7 ^! [1 r - ******************************************************************************0 K/ h+ x( f! ]
- */
K. g7 P( h3 z# Z# ~
) f3 N9 u6 ?$ L/ ~1 ~6 s$ ]- /* Header includes -----------------------------------------------------------*/$ U1 \7 r1 B: ?
- #include "Ymodem.h"
6 n2 X# t0 [, D8 M - #include <string.h>
! x- q( |% }) ]4 d6 r5 s' r - , O& Y* t$ b' G6 A- \
- /* Macro definitions ---------------------------------------------------------*/4 D q" f1 b2 V" t; j
- /* Type definitions ----------------------------------------------------------*/
: h; T( Y3 P3 r1 ?3 @5 e* P. L1 P+ G - /* Variable declarations -----------------------------------------------------*/2 A* ?6 x+ u( n; r# d! ^
- /* Variable definitions ------------------------------------------------------*/
. g& f" i o9 L; o# y1 G, L: K# K. ` - /* Function declarations -----------------------------------------------------*/
* p9 B1 Z, `+ A$ q - /* Function definitions ------------------------------------------------------*/
9 A, K/ A$ `- ?7 Y7 O, U' u
( I1 X3 z, _- l8 E; e- /**
. z1 F) S. K# u8 s - * @brief Ymodem constructor.
9 C% R5 _9 t) O7 \. ? - * @param [in] timeDivide: The fractional factor of the time the ymodem is called.- Q4 F/ p6 a; x& I' c0 d
- * @param [in] timeMax: The maximum time when calling the ymodem.
% g" d, K( L; A - * @param [in] errorMax: The maximum error count when calling the ymodem.% S. d: S2 B4 a) r9 v. A
- * @note The longest waiting time = call time / (@timeDivide + 1) * (@timeMax + 1).
% a+ |! ?0 O9 G+ y - * @return None.' t# [4 x# u5 i, r+ q
- */
9 H; ~0 K# h t - Ymodem::Ymodem(uint32_t timeDivide, uint32_t timeMax, uint32_t errorMax)
8 {5 C8 E; a, N8 _ k - {
% T$ E3 ?8 d' @( m) z: s8 X - this->timeDivide = timeDivide;" P/ J8 u. }5 ^
- this->timeMax = timeMax;( q- v. O% t/ Y r$ F; {! _- n
- this->errorMax = errorMax;
L: D% s/ L& L& ~5 a4 b - ; R- N; l7 t I: x6 A
- this->timeCount = 0;1 H x( S) X" K- P: O
- this->errorCount = 0;0 y& c+ j6 q# Z! |5 u
- this->dataCount = 0;( `9 x2 T+ C3 f
- ^6 |9 @$ {3 r {( ]. `- this->code = CodeNone;0 Z7 I( h+ L3 v8 Z" g2 y
- this->stage = StageNone;
% T4 a1 d6 h" V - }" J% g8 d+ g' r$ O# `& f: H: q
! }2 C% x- k) Z O- /**& |# ^$ d8 ?$ G+ e
- * @brief Set the fractional factor of the time the ymodem is called.
7 T% I9 H0 C/ O- z1 Y7 @: ] - * @param [in] timeDivide: The fractional factor of the time the ymodem is called.
% ?4 U4 Z6 N& ]! }# t. q - * @return None.0 U2 O4 l. G j8 W6 A+ o2 l: a- Y
- */
0 E! g5 E( D& E& S2 {% l - void Ymodem::setTimeDivide(uint32_t timeDivide)
0 @) L4 k1 y. b( @0 }7 U% W2 V - {* {, J6 l! f q8 c1 j
- this->timeDivide = timeDivide;5 q) i- E. S/ D# Z
- }
7 X- i/ e8 Q; ]% d- f& B
2 ^: m+ k$ c, v1 C! f/ w/ y- /**
/ ^3 i! o* K& g - * @brief Get the fractional factor of the time the ymodem is called.) ?5 n$ D# f2 P
- * @param None." Z( M# g8 \6 t" x2 `
- * @return The fractional factor of the time the ymodem is called.2 x. n$ e" K) ~ G( ?4 t! {
- */
6 H+ ]$ P* o/ {8 q3 z* f# G - uint32_t Ymodem::getTimeDivide()2 O7 ^. B- n o) n6 n+ d
- { [ k0 y+ d0 r! m
- return timeDivide;5 U h& K, L1 K4 \8 U# f
- }
, M) e% u6 a/ s2 h$ o6 r$ j) P
1 F+ a# D! d3 G- /**' m( l* ^5 X. a8 w. t7 H9 R0 r
- * @brief Set the maximum time when calling the ymodem.
* h0 ?# m1 t* l" {! \7 H - * @param [in] timeMax: The maximum time when calling the ymodem.
& x1 Y3 z2 N( i( B) z* k - * @return None.
5 P. ]2 k# d8 @4 [6 t V4 r) F - */0 H8 v( l2 o- M. I
- void Ymodem::setTimeMax(uint32_t timeMax)5 P; z k5 x+ M" V: |' \3 v5 u7 k
- {
# n. C' E# Q2 L6 L- G* I) v6 d - this->timeMax = timeMax;3 c: e) S" [4 B" K. p# k
- }5 I1 F8 g+ \6 e
- , P7 K( L H$ q! V) j
- /**
3 ` O& U" i4 m+ B; x - * @brief Get the maximum time when calling the ymodem.
* S9 G% d. N2 s - * @param None.
, O# R- s# c* W8 o; h - * @return The maximum time when calling the ymodem.) S6 v3 I, z/ q& u) g6 R
- */
8 V6 ?4 h6 [; e! ]& ^6 z( x - uint32_t Ymodem::getTimeMax()
' l8 K+ V3 @5 v) q. F" L) S - {
. N+ z' g# W) F. s V+ I - return timeMax;
$ Z" |% A( ?% U0 x8 C$ Z9 e! ?" t - }0 A4 {( Q: _- t! ?
- % J7 { e- T7 z4 W5 q' j
- /**5 B B# p; ?5 y" e- m
- * @brief Set the maximum error count when calling the ymodem.
* j6 A& {3 _ K. d- g6 h# ]- F - * @param [in] errorMax: The maximum error count when calling the ymodem.1 `4 N: f8 t0 G4 C! a5 |+ m
- * @return None.: w' n3 r2 {* k( X$ a, n0 l
- */( |5 s" z/ l9 a3 a) l2 G
- void Ymodem::setErrorMax(uint32_t errorMax)5 h# _3 h6 B1 |5 Q7 g
- {
* p# u/ P& l% |& |) a. l0 j B% f - this->errorMax = errorMax;
6 N) Y8 m/ o* D3 Q. m6 j. a! [ - }0 x6 ]& `" b, W* d/ u6 m
' \+ c, B w- p. U2 {1 c/ R- /**
9 v7 ?! e5 q* B- H% _ - * @brief Get the maximum error count when calling the ymodem.- d4 k6 r2 b ~, r- R- Z
- * @param None.8 i9 d* u8 ~. r* _1 z; ]7 @+ h
- * @return The maximum error count when calling the ymodem.
: A6 D/ N2 U# u) Z8 j/ o - */
! x/ {6 T9 k/ I - uint32_t Ymodem::getErrorMax()
( v2 O( |/ q+ x - {
# d; I6 L# b8 r - return errorMax;# Y$ ~! f% O' U, B$ }
- }, ]& q6 y: o( f7 ?) d- B6 G0 b
- 2 o4 w: j' y- g$ S: v
- /**; J* o+ w- G4 T; K1 J/ y9 o2 L
- * @brief Ymodem receive.4 k- S; u, E% r
- * @param None.9 L) O2 Z* D* y$ M' V8 |5 n
- * @return None./ |1 [6 t; i0 {% |8 A4 U n
- */2 ]3 z: H/ @& c% K2 P% C6 _
- void Ymodem::receive()
) A9 b9 `' e# U7 |! L' e' ? n - {
3 J/ Q% Z* Q- i# Y+ D - switch(stage)1 p5 G4 X( \" f
- {$ D9 [' v D1 n G/ w5 P
- case StageNone:. X" t' w3 Z' L' g6 ?( l( B+ T8 N! u0 {
- {
- O* ~1 @" b& d$ u - receiveStageNone();
8 I# v, b( [8 S7 L. n4 O - : w$ t5 W! n5 ~) o
- break;
3 ^) U# K6 A. Z. r# x* e% C8 ^/ Z7 W - }( d8 D! E* L/ ~* p; s4 B' {% ~
- F7 t# S" c" D( f% ~
- case StageEstablishing:& n" P3 T1 d( H
- {: s# ?. q. ?4 o& R
- receiveStageEstablishing();2 w! M" p- {8 E9 N
- - w) G/ D5 w/ g. d, ^( ?) s
- break;
& N! n- d3 n B8 o- { - }7 e- w) b& L1 u( [# f& ~
9 {5 x S. Q9 Y! @7 H# q1 U( G3 f- case StageEstablished:: u. i, @$ F9 n% z/ m
- {$ O# Y" b- d, a! [
- receiveStageEstablished();
3 J1 A5 V7 f/ i5 j- d
% E. M9 ~5 d/ a$ E! O9 }9 s: {- break;
( x7 G* e) @2 z5 _$ x* X - }2 u2 B0 `' }8 }1 ?3 j, a6 Y
- 9 |! u( X+ h5 d- C0 F
- case StageTransmitting:8 e. I+ T% k" A4 ^
- {$ o. O% \+ f* l. R) o
- receiveStageTransmitting();
* L+ N" ~: n& F+ _2 B - * t4 m" B5 o" R( T# s7 F+ G
- break; x$ x. b: ?" d! V" \
- }
* Y$ T9 v7 f9 E" u' a- t
3 O) n1 z5 ]( s- V, Y% d8 k- case StageFinishing:
. m% c4 m N4 o - {
! q0 U1 r& X# j: K: J7 Q! K0 R - receiveStageFinishing();
# Y7 W' T9 p6 Y
) @/ _- f" x g3 R* J- break;
0 u2 C; Z) s' Z# z9 ^# ^; j" R - }
9 T4 B8 }% S2 W; p0 h
' P! P6 y9 G X" v, |( C g0 {- default:6 E; {+ | j1 y' Z
- {% o2 b6 O& }2 l1 g: I+ m2 L+ Z+ S
- receiveStageFinished();$ B" Y y, _1 Z4 [
- }% U; G- _0 i2 H. X- J3 \
- }
' j2 A5 A6 A% x$ _ - }; ~3 {" }9 ?/ @ l& l5 v
! v' F" O4 U; `- W2 I: p4 @- /**% K/ ~- k( l2 F! v
- * @brief Ymodem transmit.
3 {2 I2 f4 F5 ]: z; U) l - * @param None./ h3 y1 G! u7 W
- * @return None.
+ e2 H: m8 F- r - */ ~& H+ P" \# l4 y; H% T
- void Ymodem::transmit(); @0 R$ F1 T) f+ z: v! }$ N: s+ u6 w
- {
# R2 b" S( o& h" g% X6 N" Y - switch(stage)
& ^( r# v9 g$ F+ f$ o. T8 n - {
1 H7 n9 Z. y- s - case StageNone:& c: v+ i8 v- l2 o1 k; ^% Q9 y
- {
7 Q$ p3 x2 K4 X$ A+ y2 C - transmitStageNone();
5 S) J- ` V& ^3 m0 f - 7 ~' L! H* u# C
- break;
7 }/ b" W9 @' Z9 ` p - }
. Q4 m) s/ c. _# \ - 1 t* o9 x9 B5 K! v" v7 s M }, @
- case StageEstablishing:) V& w2 }/ N) T4 H' C1 P
- {( p9 h2 @2 f+ S, k1 F# Z4 k9 z! p
- transmitStageEstablishing();
* x1 L, R+ r% b) m6 ~
, _0 n' q# z$ l" c2 w- break;
; h1 D1 f# @! f" D$ E+ |" | - }
. p1 T: a4 P+ J a3 T - 6 X4 P2 }: `; V
- case StageEstablished:
3 ]: i6 A& Z" f - {
9 w* i W/ y' Z. Q1 M% q - transmitStageEstablished();9 m2 @, Q* `, j
4 q3 I& `# K0 v$ h5 {# s5 Q- break;
. [( k d! Y8 \, x8 _ - }$ c$ L) u5 f; y2 a. I# u# s
- 9 p5 y0 z6 x' G
- case StageTransmitting:
) y( N0 i5 H( W4 b' i8 j - {" ~$ y+ Z6 j2 x
- transmitStageTransmitting();; `/ P* z: Q0 g9 F) Z! C
- ( r- w) X G/ A1 D! B' b1 L
- break;+ L( ^8 N. _6 T
- }
3 w0 @& w; U! [' v1 {$ Z S
; w$ d7 w1 _/ {/ @, S; q+ {- case StageFinishing:: I. }, u* c0 m4 p
- {4 t( |; K& z8 `
- transmitStageFinishing();
9 K+ L4 b7 k9 ?/ j, r
1 |8 K5 D% F' N0 t; K' C$ s- break;2 K1 _9 l9 o# ~$ ^& E+ q" v( n
- }% {! w/ E f& P1 { \6 O% ?
- : H* F: ?; q4 N( \8 ?8 \: C
- default:
$ p1 u8 n$ l6 c* ] - {/ B2 c8 [( H7 U9 ?; I* U
- transmitStageFinished();1 Z4 n% e7 U2 n% V7 ~7 Z
- }( [% n* j: K J1 R1 A
- }8 R8 e1 y5 e6 O# }" X, ~7 [
- }
1 K0 f+ N j2 m7 j/ i! ?. P
& ?' m% l3 U& g9 ~+ |) {9 h- /**
5 c4 Z% \3 l3 d- P) c - * @brief Ymodem abort.
/ w1 q" S; N1 c4 N- e& s8 f5 O9 X - * @param None.9 X* Q* b7 |- @5 p! ?% M
- * @return None.5 R8 Z5 s$ M+ J- h8 }
- */" d% F+ n+ F' C: c3 n: Z5 _
- void Ymodem::abort()7 c1 q) I5 u1 G& r
- { ]$ O: i' t' |2 S" a8 N4 }" [
- timeCount = 0;
4 j1 D" p, w b) W) U - errorCount = 0;
2 }3 \/ W# L1 ^ - dataCount = 0;
; D C! K n" }' B - code = CodeNone;
2 b* L7 J4 K7 C! H1 j7 v$ s1 t: K - stage = StageNone;
0 H% b6 K% I6 a' N
0 o$ E! Q( p' E- _; ~+ ?) A$ u N7 m- for(txLength = 0; txLength < YMODEM_CODE_CAN_NUMBER; txLength++)4 ^3 a. u# t. ~% {' C6 c+ {
- {9 `* Z! d" Q7 k) O
- txBuffer[txLength] = CodeCan;* P* D: ` C& T
- }( A# s. ]" v5 s) B
- 1 L9 X1 r6 j5 s! Z2 I" G
- write(txBuffer, txLength);
0 g+ E3 Y+ ]6 H) \5 u" {/ r: a' F, i - }
8 Y. h5 m) C: m
5 @4 r' |! {$ o4 u! E, l- /**% I; g$ s" G& K4 k4 z" |0 k
- * @brief Receives a packet of data.
; v2 k { f( q: Q2 P0 Q& A - * @param None.
3 z9 U7 Z- Y- u2 @0 m! T4 V! F - * @return Packet type.3 ~& W" v1 {. X6 G" A$ T. T* c
- */$ |* _& A& g4 P8 K0 p6 m
- Ymodem::Code Ymodem::receivePacket()
4 Z7 w4 m- M, R+ T0 Q - {* F, n6 |4 S# g& h: h
- if(code == CodeNone)7 r, q, C9 g+ {) {( R# D
- {
) X. J. z; e0 X+ o6 G - if(read(&(rxBuffer[0]), 1) > 0)1 K4 g1 z0 b5 N. W
- {4 K% C0 N) o: a& t" D! S r
- if(rxBuffer[0] == CodeSoh)
' X' g- {& x' s# S% h3 M0 J: X/ s. U - {$ v# X. S. b( L# O! `
- uint32_t len = read(&(rxBuffer[1]), YMODEM_PACKET_SIZE + YMODEM_PACKET_OVERHEAD - 1);' } I9 i- W6 R- [' l! @3 a' i
- t9 G6 w2 ^- u+ s- if(len < (YMODEM_PACKET_SIZE + YMODEM_PACKET_OVERHEAD - 1))
5 V& Q8 {' _3 D4 @ - {
; c" K8 B+ h7 x - rxLength = len + 1;
, \: f, e; Z, k - code = CodeSoh;4 Q0 v9 \0 R1 R8 y6 R
- 7 i8 d) B4 _$ Z$ n
- return CodeNone;
7 G# a O$ V3 J' i% ~ - }; B) `2 y! w& b* \, e/ E/ j
- else
( y8 F5 M# d9 L# m9 x& U - {/ U3 [1 D) G+ {' L: N9 E5 y
- return CodeSoh;* i0 Q9 W3 H! s5 D4 G' V
- }2 p: U( \0 N# J
- }
0 a! r" Y6 R; {& \+ V: r/ t - else if(rxBuffer[0] == CodeStx)3 L8 O- Q' J% j9 g3 A
- {7 w! Q8 c9 ^3 k1 k6 l/ q
- uint32_t len = read(&(rxBuffer[1]), YMODEM_PACKET_1K_SIZE + YMODEM_PACKET_OVERHEAD - 1);5 ^% ^4 n6 E5 D6 U: ]* L
- 4 n* w3 [- B8 Z+ l' u& s3 T0 _8 l
- if(len < (YMODEM_PACKET_1K_SIZE + YMODEM_PACKET_OVERHEAD - 1))4 s7 O* m* x% Y4 N' k5 P+ O
- {7 Y& c& F0 m/ i K$ I2 x3 l
- rxLength = len + 1;
0 J; v' I9 b: A6 p - code = CodeStx;& c" u$ W( b$ w9 j
, q3 v4 ?% [! Z3 k8 }6 P; x- return CodeNone;
0 j; y- |! O* f& I9 [ - }
0 _7 q! U" c. b5 D+ [, C0 E8 f - else+ L5 D) N4 s# H* y) K: A
- {
3 h3 C. ]1 t( A; y - return CodeStx;2 d- u3 q8 f6 k) k
- }9 y: q4 x* f$ y# R1 c8 G. a
- }6 s( |/ c9 [; v" r k+ [
- else
g+ J q4 f" A+ j& r. x - {
: c3 D. ]' m' z5 D. ^4 b - return (Code)(rxBuffer[0]);, M% B; i. ~; ~ W8 H! M3 ~% Z
- }
* _' f$ }# o( j) ^/ h - }
7 s# q9 [; M$ c - else0 X' ^! w; Q% `; K- e
- {2 U M3 t, e) x, j- O/ x
- return CodeNone;
: m4 H0 O. [: N7 r - }
1 F! z* h- d5 N8 k4 Z, M& r. s - }4 A8 q) S: q; e4 g* }
- else
$ l# H. v K( g) F& F0 V% W" c - {* B, Z, z/ X2 ]% w
- if(code == CodeSoh)4 S! P! L7 c+ O2 k( U2 ?3 c
- {* I3 i+ ^, r+ Q& H* @4 m4 j
- uint32_t len = read(&(rxBuffer[rxLength]), YMODEM_PACKET_SIZE + YMODEM_PACKET_OVERHEAD - rxLength);6 \* p# a) s3 t, g/ k, _& _1 x! n
4 I$ e. s( q, g: d2 x1 ]) w3 [- if(len < (YMODEM_PACKET_SIZE + YMODEM_PACKET_OVERHEAD - rxLength)): ]7 D3 i2 O! m+ @
- { Q. h, r; t: J: t7 c M( Y0 A; _
- rxLength += len;
) i& ?& e0 t" p' G$ u( @% s - ; H$ j# Y# P- C0 D
- return CodeNone;
- d# w0 q6 V; S) s' `: L& K# ?3 ~ - }
1 ^5 R2 _- x4 C - else
1 c6 ~. R+ l2 h+ u( `" }) A& C* e - {
. o. y2 Y, t4 n) f - code = CodeNone;/ L/ O/ d2 ]* c) O5 B: c0 I0 b- E
4 Q1 [) X3 V3 H6 z: A- return CodeSoh;
9 A, F/ K/ B& T" [ - }( I$ v* F/ }+ t7 o5 s8 N2 z2 o9 i5 V+ U
- }
+ J4 t F( z% ^- V7 x" y/ W5 } - else if(code == CodeStx)+ L1 ?+ s8 I- }% E: @# \8 f8 ~7 n
- {; W& ~/ ^0 R" s; \/ w
- uint32_t len = read(&(rxBuffer[rxLength]), YMODEM_PACKET_1K_SIZE + YMODEM_PACKET_OVERHEAD - rxLength);8 a7 X2 k( n0 a
- " L: R3 d8 P0 b
- if(len < (YMODEM_PACKET_1K_SIZE + YMODEM_PACKET_OVERHEAD - rxLength))7 C8 }: w7 w8 B; y+ B& U3 ]+ P
- {
' S' M9 `. ?. O W - rxLength += len;, F& P* l5 M% o
4 b" F5 Q- q2 L8 c9 U- return CodeNone;
2 i, P) h7 V: ~* b0 h - }" b z9 a5 I1 u" K9 P
- else
- n" F* o, [* P" W& t - {7 O' h3 K* b0 i% N( Q4 d" I
- code = CodeNone;
; X3 ~: ~" k2 \5 N. e/ ^+ v2 f - 5 d0 b9 f/ Q) q" k. r
- return CodeStx;, `* W, }3 K" v
- }
8 Y) n- p/ F! ? - }
, v$ C0 E: T/ I0 X! y1 o - else
6 U5 I5 }8 m2 S - {/ o( [0 a7 z) Z* x$ ~
- code = CodeNone;
0 P" W- d4 Q, I% q - & q6 ^ O+ [4 z. f% e! z/ w
- return CodeNone;
: K) @. b1 _& p& x- l9 ^ - }
9 w/ g- w1 l1 \- s+ p0 _% G - }* r4 `- B/ Y7 }. `/ d! i4 y- N& B
- }# v8 V P$ v" {" |9 _. H
! ]2 c6 C) n# S( e- /**; a& M: m! i% A6 B% C; i
- * @brief Receive none stage.; p" c+ `' [% V( M+ R
- * @param None.+ b& Z/ i# w" v# f$ U. m
- * @return None.
% E9 e& C9 [* m- \4 Q6 u8 O - */
4 o$ ?3 U9 x3 Q' Y - void Ymodem::receiveStageNone()
, S0 F0 y# x8 S( R& e& B' A; c Q - {
$ H ^' f+ B8 e8 l1 E3 V. w* I - timeCount = 0;
) R- E' n/ p o* ~/ @4 Z - errorCount = 0;
: l, ^# C2 a- s6 Q( O- T1 w - dataCount = 0;/ f6 ^% e; u( P9 @% e
- code = CodeNone;
2 d$ k& ?: g3 k5 _$ M - stage = StageEstablishing;! u) ]5 a& z* [/ t0 C
- txBuffer[0] = CodeC;
; A" n/ u6 ]6 E; S - txLength = 1;2 h9 c6 c0 t a3 S3 m7 I: y, \
- write(txBuffer, txLength);
( ], q( f2 j1 m% P+ |5 J$ A, |! M/ V - }4 p$ {: c; N, }; P6 i- M
- % x% ]3 Q: q2 Z$ ^1 h
- /**
3 r4 a0 W6 v8 K' `, l! J2 w - * @brief Receive establishing stage.5 e( |9 y! j# G T% c: Y+ V
- * @param None.
! D* x+ g9 X+ p' D0 W9 S, ?6 } - * @return None.9 X B& {" S( u, F+ V. W
- */5 Q8 c" a* p7 z D5 X G
- void Ymodem::receiveStageEstablishing()0 b& d( \+ i5 x* n! i
- {
& b, Z9 P7 u( s: h* J8 H: { - switch(receivePacket())* p3 F. ~0 c; I/ W
- {$ @$ W! `2 o4 g! q6 Y/ R2 G" Q
- case CodeSoh:* x+ j! q1 Y0 y _" j* E
- {
8 G$ a" v$ k; P1 c/ W: c6 }8 E/ i - uint16_t crc = ((uint16_t)(rxBuffer[YMODEM_PACKET_SIZE + YMODEM_PACKET_OVERHEAD - 2]) << 8) |& h" K( v; e0 R; U- `
- ((uint16_t)(rxBuffer[YMODEM_PACKET_SIZE + YMODEM_PACKET_OVERHEAD - 1]) << 0);
+ @! S& ~& P8 w
+ ^; _+ s2 G! G' I* P+ I* _- if((rxBuffer[1] == 0x00) && (rxBuffer[2] == 0xFF) &&- X" _6 M: v7 V# u/ V
- (crc == crc16(&(rxBuffer[YMODEM_PACKET_HEADER]), YMODEM_PACKET_SIZE))). z' i/ b! o5 D0 P/ d8 T. _
- {, f& s8 ^2 K3 G' h
- uint32_t dataLength = YMODEM_PACKET_SIZE;* h w* H" U' y6 M+ g: Q8 p+ y: Y
- & v i* Z- f* y; H/ P g! U" ~/ `$ N
- if(callback(StatusEstablish, &(rxBuffer[YMODEM_PACKET_HEADER]), &dataLength) == CodeAck)) \6 T% ^: O2 s- M4 X1 D
- {: d# }0 E. x9 {( O0 H2 A( c* a6 S
- timeCount = 0;
! d5 j. C7 {4 t$ w" u - errorCount = 0;$ U( }4 G3 M: X( N& G9 \
- dataCount = 0;8 L1 u8 X# _; N8 n# K
- code = CodeNone;/ e n1 a' i9 d
- stage = StageEstablished;
( j( t9 K8 F* T+ [4 B* }- i - txBuffer[0] = CodeAck;
1 Y- h1 o, r: @* g# G/ e - txBuffer[1] = CodeC;5 t+ S3 o: ?1 T: S- L8 J& a0 }
- txLength = 2;
7 A' V9 h, k; J T - write(txBuffer, txLength);8 m& z4 A% Y% r, y, ~, w& z d
- }3 z+ G! m6 o/ {7 R
- else: u. h$ J' P, [8 \
- {9 w x, j, i5 u1 P1 o
- timeCount = 0;
# ~' e) R1 D- z5 M - errorCount = 0;
/ a0 g% L3 Y7 p/ T& _2 a8 Z - dataCount = 0;
5 ^$ V7 b# S* Y9 M3 l) k - code = CodeNone;3 w1 S: m* y9 j% q0 v& W
- stage = StageNone;
8 ^# M; I: N8 V; f E) ` - 0 n% t5 O% ]. m3 ~3 W/ D L3 w
- for(txLength = 0; txLength < YMODEM_CODE_CAN_NUMBER; txLength++)
! h0 |# c* i- @' V% G: N - {
+ s, M# r+ L/ @6 e - txBuffer[txLength] = CodeCan;
1 K, h& X* n( A' ^$ @3 z! x - }7 [5 b z' D3 c: Z) a; i* i1 N% I
- 8 P" h, ?; W3 v& B
- write(txBuffer, txLength);! e5 h1 q: R" z
- }% d; V! a4 ]4 n! Q; N4 a
- }
+ _' j! c0 @; l6 h. A0 M - else
1 R1 @ l$ s# S: Q. R7 T3 [ - {
( `! E& S* {7 [, {, B5 [ - errorCount++;
( j- |1 o9 r9 `" M/ K# p; [/ b - 1 Q- T3 E- Y8 R5 q
- if(errorCount > errorMax)1 E- @) y8 t' M- b2 C1 F3 E
- {
) M/ v5 w: D- N5 ]0 F - timeCount = 0;" d4 ~% c* P, p0 z b3 @% {1 f
- errorCount = 0;
- |( G% ]7 E. Q - dataCount = 0;
% [2 @3 x; a6 T: L) {1 g$ } - code = CodeNone; g, g8 m# G( ]! @9 x" r5 J, X; C
- stage = StageNone;8 h( p* U+ J! N B+ @ M
0 C; z# v5 N8 u& L/ a3 }, D- for(txLength = 0; txLength < YMODEM_CODE_CAN_NUMBER; txLength++)
8 n) Q. b( ^; h4 X* u+ S - {# _. A$ H7 d* n+ l2 a0 b% u( V
- txBuffer[txLength] = CodeCan;
! x* X. I& R" T& x - }& p0 B* y2 ~0 l3 s+ z
3 k1 P5 X' m: G1 e$ v$ ^7 @2 Y% X- write(txBuffer, txLength);* q4 Y* t; F5 V- {8 Q/ w
- callback(StatusError, NULL, NULL);& E5 ^; x( A' O# E. m
- }! s: C$ ^4 G3 p
- else* G* K. w; Q* z
- {( U6 ?* W$ C9 w% ^
- txBuffer[0] = CodeC;
3 [. i M5 }) e. ^5 @( n - txLength = 1;
8 }& C2 @% ~" q$ l+ E$ \7 T& l# s, b - write(txBuffer, txLength);. \/ Z' J) N# Y0 K& h, s
- }; F6 ^6 i ^4 ^, |
- }8 q/ r) ^5 T0 K( Y6 Q* A5 _3 ^; y
- 1 R% p& O. T$ i, t, J/ t
- break;
2 Z6 M' k. ]5 p$ o, b# K. { - }
0 ^8 Z! \# K b1 M+ q! m. f9 n" S6 ~; C - 2 b9 Z# W- g0 L3 E( s7 X; ~
- case CodeA1:/ ]- H! r4 t. M) E: C/ `3 t
- case CodeA2:5 n c" |5 w0 h0 S$ x
- case CodeCan:) Z& d! @/ [1 p% m; D* d
- {
0 Z' T+ m h* T5 }- S* ` - timeCount = 0;# h9 V* U$ K* n" B1 _/ C
- errorCount = 0;
2 S; K. F* F! U. _; e& g - dataCount = 0;
. Y1 b' Y3 b2 ] - code = CodeNone;/ B2 h/ s7 n) M! a- @9 n( _3 J
- stage = StageNone;
3 a, ^. p5 o, ?' X% ?' J: `. F( h; o - callback(StatusAbort, NULL, NULL);
8 y; \( g! o9 |( p - 1 G/ l$ v) U4 x/ Y8 y
- break;
) M' W+ G! `* x6 }! i5 ] - }
/ e6 t: U$ H: Q6 e# D8 n - : \5 j9 N; {! \) L5 K7 y3 e9 H% V
- default:- d# O: l+ E( t3 f# g
- {1 R+ | A. ^0 v: ]' x1 W$ |
- timeCount++;
6 w7 e3 ~3 R8 |4 D* T+ h - ! m" _$ t3 Z* |/ S3 w5 J
- if((timeCount / (timeDivide + 1)) > timeMax)8 o% t+ {/ A3 }! w- w0 x) m
- {
+ x: I5 c$ R/ n7 r- S9 `3 ^ - timeCount = 0;
R1 J9 v) n" n* r- j' c* |2 ^& o - errorCount = 0;7 E8 P8 e9 L3 {& V' r
- dataCount = 0;3 M- s3 z1 q$ k
- code = CodeNone;/ S: P( X+ Y* U( A
- stage = StageNone;
% z1 l/ c+ R2 l - 8 M. ^. A" y( b+ g& E8 o7 [
- for(txLength = 0; txLength < YMODEM_CODE_CAN_NUMBER; txLength++)
2 ? A6 H7 L. F/ ]: ?# n - {# P1 v* p: r( w( P$ y/ U$ T; D
- txBuffer[txLength] = CodeCan;( Q) Z5 X, [5 S5 s" T4 `
- }& k% i$ [: s" H2 ^% o7 o! ?
% n; u4 d3 T! s5 q- write(txBuffer, txLength);
$ h; V- K* H- z( K, H - callback(StatusTimeout, NULL, NULL);
' C/ J# k5 p- z% N/ i3 T4 ?: x - }
3 {, T5 F5 N6 i, `, @; Y4 e9 E8 ~ - else if((timeCount % (timeDivide + 1)) == 0), d8 ?4 w+ ^. V2 `3 Z8 ?- g7 M
- {8 Z C# h3 t7 _6 `; n# Z
- txBuffer[0] = CodeC;
4 ~1 ^: u- ^" E$ w - txLength = 1;1 i' ^4 [: J8 a# x
- write(txBuffer, txLength);
9 w5 c, g) Y- T2 u6 b - }
+ |! z; j# V( Z) E! W - }3 n, L W- U* }) O9 I6 Q
- }/ \+ U0 r- g6 c6 c1 R1 N9 [
- }) A; W/ }8 ?$ v& J
- I4 x% j7 G. Y
- /**5 a, W4 \+ r' [6 d# M( S
- * @brief Receive established stage.6 F0 ~. Y$ o7 e y2 M6 m( p
- * @param None.
5 Q" ]+ o2 x. e: v' z, V - * @return None.# z3 w- u9 O, S; E1 i/ ]4 O- a3 |8 |
- */& X2 F1 s- Z y: ]6 \. ?
- void Ymodem::receiveStageEstablished()
( x8 c' w; e& p/ c/ y( Z - {
" E0 E0 b+ _2 ^- E7 V - switch(receivePacket())
3 Y5 d0 a& N; H0 ?! T - {1 ?% ^; W- D& D9 j4 c
- case CodeSoh:( G4 |* @ F" L( \
- {
0 _9 p: c7 [$ E' z& N9 r - uint16_t crc = ((uint16_t)(rxBuffer[YMODEM_PACKET_SIZE + YMODEM_PACKET_OVERHEAD - 2]) << 8) |( f( Y% A5 R" E- A
- ((uint16_t)(rxBuffer[YMODEM_PACKET_SIZE + YMODEM_PACKET_OVERHEAD - 1]) << 0);
, q5 [2 c& h0 X0 U3 c! }( V - 4 ^1 e7 l0 L: K J
- if((rxBuffer[1] == 0x00) && (rxBuffer[2] == 0xFF) &&. w/ [7 b$ a8 I. L, F9 Y- e8 u$ E
- (crc == crc16(&(rxBuffer[YMODEM_PACKET_HEADER]), YMODEM_PACKET_SIZE)))+ S8 ^/ j; f- X. K2 L7 h0 s
- {
9 z" [5 W7 Q' _3 V- r! @8 O" l - errorCount++;
+ E" e# F3 g1 U d% N
! ~0 [; v+ s5 W) e2 P4 ]7 `- if(errorCount > errorMax)- M+ X% i' r) B0 C& G9 A. e
- {/ s0 P; U' N5 a1 P! u7 V. W# M; Q
- timeCount = 0;
, d4 C5 T# O2 p A - errorCount = 0;- u6 t# c7 m% g r2 T
- dataCount = 0;9 q$ e5 d" O- s' }
- code = CodeNone;7 Y( c/ J3 _# q6 z
- stage = StageNone;
% V0 ]& h3 Q. }, a3 H% ~0 B4 I2 e - ' N8 }8 S6 I# f
- for(txLength = 0; txLength < YMODEM_CODE_CAN_NUMBER; txLength++)4 W8 O8 k- {" U1 P! j4 f
- {
- k, w# P# m2 i& X( T* \ - txBuffer[txLength] = CodeCan;* q0 f2 p) S: g1 x. d
- }
5 c2 K1 e' F \: d+ B! S( ~ - ( i& T5 M! X. \9 a: O( |1 v
- write(txBuffer, txLength);
3 p; M8 b1 n4 e" {( |2 i7 w1 i - callback(StatusError, NULL, NULL);+ _3 m: P7 F6 P( e# B
- }
* B; n5 K5 H! N7 D! { - else, | F4 u! ^+ B
- {6 P+ \! z) t# I
- txBuffer[0] = CodeAck;
0 h0 c: a/ }7 q - txBuffer[1] = CodeC;
, Y9 C' t, g2 f - txLength = 2;+ n/ b- a( _$ F3 V3 d, X
- write(txBuffer, txLength);/ V7 C, @/ ?2 u! g
- }
4 ?; f& e* W! B6 E7 G- X6 L/ G - }$ j8 d6 i# {4 |1 m. ]8 o
- else if((rxBuffer[1] == 0x01) && (rxBuffer[2] == 0xFE) &&, L9 t6 b2 _$ M
- (crc == crc16(&(rxBuffer[YMODEM_PACKET_HEADER]), YMODEM_PACKET_SIZE)))
- g/ L* |( U7 @3 y) N* W3 P - {% g. g" t' c7 q) z2 r1 B
- uint32_t dataLength = YMODEM_PACKET_SIZE;( f( u# k( z2 J: n' J" R& F/ w3 v
- , z5 U' B9 K7 H2 s9 x& ?
- if(callback(StatusTransmit, &(rxBuffer[YMODEM_PACKET_HEADER]), &dataLength) == CodeAck)
' C2 n, \) S8 {' X6 Z# j - {4 U) \+ P, q3 d; D
- timeCount = 0;
$ C9 y, Q3 x- ^: ] - errorCount = 0;( J1 v' F" ^" f* N! ~* _
- dataCount = 1;
- I! n N k4 Z5 c+ ^6 x - code = CodeNone;
% @" T- h0 [/ \" L7 t! C; q9 l% w3 G - stage = StageTransmitting;0 [/ J% P, g$ D V! w! M
- txBuffer[0] = CodeAck;
( O4 r6 ^% O) T" V - txLength = 1;
& @# u3 ]( f" T, L - write(txBuffer, txLength); ]! M `; h$ C: S1 I& B1 X
- }
+ r" z! i" I4 s1 ~ H8 n - else
# P" V- B( R( S6 a6 _ - {
$ L6 M& _0 F8 H0 G - timeCount = 0;
* g* d6 s5 E1 G9 [1 j& ?$ ] - errorCount = 0;, u l2 v9 h) k& k
- dataCount = 0;
/ h8 L+ Q2 l; b( J - code = CodeNone;/ _- u A- K! j, f6 q' `
- stage = StageNone;" Y. p! b7 l& C3 J( m
- 1 @6 ?# }* |: v& X
- for(txLength = 0; txLength < YMODEM_CODE_CAN_NUMBER; txLength++)
' I# [- a% G+ P% U. ?* t# i - {
: P1 i& t4 x! ^7 e3 C% G4 u9 ]& B/ o - txBuffer[txLength] = CodeCan;
3 f, G3 M/ |5 y0 M! j! Y - }
: ?4 }, J4 U1 h/ b- b- z# ~4 \4 E" j
+ Y4 V2 T) V! d l! [4 S/ n0 {- write(txBuffer, txLength);3 N* H$ n0 _, y B1 q
- }
5 r8 Y" M7 N( S. D1 Z" ? - }8 \. S- k7 e" |1 S
- else
& M5 `' h0 |$ C8 S - {, _, w1 ^1 Y7 n( e
- errorCount++;
5 N% l( O8 {( s# C8 C+ [/ h# G - 3 k1 P6 Z* `0 X* Z5 ]
- if(errorCount > errorMax)
- I! Y% l0 Z {) q8 D8 N- C - {# U5 p" v. y) ^1 X9 ~% s
- timeCount = 0;- B1 R0 O. j/ T* v: t! N4 u3 P
- errorCount = 0;3 G# w5 P9 X6 n) J4 F) b- Q7 j
- dataCount = 0;! a& t: y2 y1 {2 M
- code = CodeNone;, g8 T. ^; T/ R/ m9 j: `
- stage = StageNone;
e/ d ]) Y, ?; G: S6 b - : h4 [* @3 Y8 n, K @
- for(txLength = 0; txLength < YMODEM_CODE_CAN_NUMBER; txLength++)
9 _7 R/ ?7 A; N/ y - {4 Z- C% H# E" i @7 W; ~
- txBuffer[txLength] = CodeCan;
+ T7 Z. V% z( \ - }; v8 u7 Z, F) E& `0 W3 X+ B3 u
- ( J0 `' Z1 i! K# @7 ^
- write(txBuffer, txLength);( F9 e9 d& I3 _" m# I k
- callback(StatusError, NULL, NULL);
: v# ?! B8 M. k9 m4 V - }+ T6 X$ G2 O5 z. ]5 y& k! I
- else5 k1 n3 ^& t4 ?1 E. L: m
- {
r; r1 ^5 I; v: z* W - txBuffer[0] = CodeNak;1 P0 ?7 Z) E4 d. \7 Y) L
- txLength = 1;2 t+ [' N; u' R; _) z% t9 [1 C4 l( G
- write(txBuffer, txLength);8 m t; g( e$ A9 H. j' C$ k- A( H
- }
' r* a& w( `, ^ - }
8 x) [ ?$ l# n; Q6 h) E. Y - $ Y- Q0 Q' P& {7 K9 k
- break;7 ], F9 M* @8 L; ]3 S8 }
- }
* _1 e8 W; L9 M2 W3 J$ O
! Y& x& S$ k, p- case CodeStx:
m9 k% T, F- `9 x3 x' g - {
" \. \2 o* H$ d' N* w - uint16_t crc = ((uint16_t)(rxBuffer[YMODEM_PACKET_1K_SIZE + YMODEM_PACKET_OVERHEAD - 2]) << 8) |* u! O& Q4 e$ u- R4 G4 c# E9 [
- ((uint16_t)(rxBuffer[YMODEM_PACKET_1K_SIZE + YMODEM_PACKET_OVERHEAD - 1]) << 0);
; z* \ _7 O1 L: B6 G2 n - % p6 H" K! h% Y0 V( Y' x* q7 U. `& j
- if((rxBuffer[1] == 0x01) && (rxBuffer[2] == 0xFE) &&( y L: T% [3 p' v. Y- V
- (crc == crc16(&(rxBuffer[YMODEM_PACKET_HEADER]), YMODEM_PACKET_1K_SIZE)))# Q8 z: c# R3 F( @4 A$ m L6 B
- {
6 T2 K& D+ n: T- }9 {4 \, e: k - uint32_t dataLength = YMODEM_PACKET_1K_SIZE;
$ E) W; \- I, X) s( Y - D- c9 }9 U6 J9 L2 `7 Z
- if(callback(StatusTransmit, &(rxBuffer[YMODEM_PACKET_HEADER]), &dataLength) == CodeAck)1 W# `! L4 B( c2 V6 q( T
- {
v( P" C6 P/ q2 x" P, }1 Y4 D8 [0 h* ~ - timeCount = 0;
+ N2 h, Y' c! g7 ]/ U - errorCount = 0;
- t3 K* V$ d5 {, C - dataCount = 1;7 j( B8 I) G3 u
- code = CodeNone;, _; l+ E7 z$ V/ ]% J: r
- stage = StageTransmitting;
; p% N# h r: S4 m2 G9 t+ A9 | - txBuffer[0] = CodeAck;2 w4 K, h" N- M4 t9 O
- txLength = 1;
7 U% {& Q4 T7 k3 L3 h$ I - write(txBuffer, txLength);* F5 f- Y2 u) P3 V# W
- }
. N7 p2 @. a# ?7 I9 h' O; x$ l - else1 }6 W) a$ t L: e9 n% t( V
- {
$ c9 n& u( _" U8 t. n! I - timeCount = 0;! n$ @5 w- b8 E
- errorCount = 0;
; ~8 k# t6 L0 B: W5 Z& ]) _ - dataCount = 0;
7 A* P' l# [. U! T1 L; I7 M+ y - code = CodeNone;
* i. m6 n: w) n1 A# T - stage = StageNone;
6 n; j* P$ ^, j% z - 4 e7 h7 q9 B! d
- for(txLength = 0; txLength < YMODEM_CODE_CAN_NUMBER; txLength++)- \# t! o" X' }" W
- { p6 \. e' q$ A8 \' T& X1 r4 a
- txBuffer[txLength] = CodeCan;
$ B# o" O* g9 ^ - }
* N1 @4 \% I- ^% S
U2 v Y( _! k# c1 b- write(txBuffer, txLength);
8 r$ a% A; T g$ { - }
8 u, K7 A$ L8 o7 d4 s - }
8 v' h- @, S7 f! f* O" \/ Z - else
6 B6 `9 ^) G% ? - {$ `4 P. d# |: x4 B7 ^( c& Y
- errorCount++;6 J# l1 L4 o0 E
- 4 Y, {8 I3 y7 p6 `; ~
- if(errorCount > errorMax)
: R9 \0 g8 h, g" Q9 v - {
L, X, R! e& B - timeCount = 0;: Z4 x m/ O4 s" u) k$ n
- errorCount = 0;+ \6 q: L+ X" d
- dataCount = 0;% @1 o/ V8 P3 a8 E' {3 I
- code = CodeNone;
* b1 K2 w6 ]5 `& ? - stage = StageNone;
. R, p& R: b( F& r- C- c
3 L g7 E$ e0 `0 y3 K4 e' L- for(txLength = 0; txLength < YMODEM_CODE_CAN_NUMBER; txLength++)" T- p5 o9 C$ Z- Q
- {
. H" u6 J# e0 p: x - txBuffer[txLength] = CodeCan;
, q+ H* I- _% G* [. H; I - }
, u+ j* j( k+ }1 ]4 ` - ' U! i/ d. |8 p: X4 X# L% V
- write(txBuffer, txLength);
3 A: Z; p6 W u6 j/ V% |4 C/ L" Q& I - callback(StatusError, NULL, NULL);" T: T7 {5 {7 [: h* M6 J8 h
- }
" ~$ M* L1 x; S5 Q# h. l - else
p; M% k+ n. ?! u3 m) X2 x& i - {; W; I+ |2 P, w3 A/ w; m
- txBuffer[0] = CodeNak;
7 ]$ r$ Y9 S" I% i. z4 o' [# Y1 \ - txLength = 1;
: l3 V" y! Z$ I% U2 ] - write(txBuffer, txLength);9 p% H4 X, x( R" H, i- E/ p
- }
+ t) j; I" P! }& @ X! P - }# n4 H( R# ?# g; _
* n- @. _) V! v3 y' R6 {) X8 `- break;
0 t# t. i b$ P6 u2 ]" K4 H - }
2 j& ~+ e3 j6 Y+ w+ l4 D
; g" I3 _8 K+ H! K( Z2 S6 q- case CodeEot:5 l% P8 y( u5 Y* ?: z: I
- {4 w, i* U5 n7 |* @* H4 `
- timeCount = 0;
( H7 E, D4 k' v/ w& p+ ~ - errorCount = 0;
9 h/ X) F R1 Z/ ~% |) r8 k - dataCount = 0;
# C9 X' f% J0 I* R) w - code = CodeNone;* ?) C- |" j' @' @5 L/ z' P
- stage = StageFinishing;8 v3 E+ u7 P$ A p4 C
- txBuffer[0] = CodeNak;1 \) v% T* R g" i
- txLength = 1;
+ Q& F; G- k! y! S- K6 k - write(txBuffer, txLength);. q5 F0 j7 @. B" T; T$ s
! P5 Y) w6 r( g, }, u- break;
5 p# T' D, N6 y8 z6 p1 t - }
3 X* }+ q6 \4 s: V- ]5 S
1 X- c" C. z5 e. r. F& o- case CodeA1:
( X; |& K- d1 w# u5 B - case CodeA2:
8 W+ K. I' _$ \ - case CodeCan:2 P* O* e. z2 l# T% I$ T
- {
- ]$ f) w0 @0 _7 Q& ?/ z - timeCount = 0;% M! H! `* W- H2 Y. J3 s& p9 d: _
- errorCount = 0;6 U* W; _5 X) g; O
- dataCount = 0;
! s$ z; u" g3 v! ?/ A - code = CodeNone;0 @4 G3 {- y5 {, r: e
- stage = StageNone;& c7 V0 d; Q5 E9 B, D o8 a
- callback(StatusAbort, NULL, NULL);- u, J) ]6 m. Z \
- ' T8 j+ J% Y, @. R! o
- break;
. |. \$ S- r! ]9 [9 } - }
. ~2 G, O' P3 [) u) o, J# t% w( T6 {1 G - / J# t' t9 I8 \, _7 ?( r o2 t
- default:
4 b* l/ L8 u$ x2 n: K - {
3 @8 D) t0 P( m, C) |, d3 I - timeCount++;# w3 |7 F; @1 o& j- S& u7 c
1 q" P7 _* Q$ K8 z& g B- if((timeCount / (timeDivide + 1)) > timeMax), z6 Z4 d# @1 B0 h) `
- {! d! E7 t' Q6 S
- timeCount = 0;
, N8 d6 }# d' E) J3 U+ `+ K+ z - errorCount = 0;
8 \" ~ q1 @& a' Z7 B - dataCount = 0;
, N; v2 ~' y5 I - code = CodeNone;
4 L1 [6 F V: s+ R5 r3 c) j - stage = StageNone;- s- k0 \. `; p5 ^2 }
8 t* T( i9 }+ B4 J3 K: q7 @1 s) E- for(txLength = 0; txLength < YMODEM_CODE_CAN_NUMBER; txLength++)+ N$ A9 s5 H8 B) A1 e4 }
- {# _. O. i7 e) U+ E0 x# e
- txBuffer[txLength] = CodeCan;5 } E% M; }% r* g, T5 N7 C
- } j+ o+ `! V5 a
- ! M5 F: ^/ ]& h5 Q7 S: F
- write(txBuffer, txLength);
4 ^4 m; d$ @: G5 o& [8 o - callback(StatusError, NULL, NULL);$ b4 A, b/ F( Q! k, W) i) a
- }3 |" ?$ k" `; t6 {) v- Z9 I
- else if((timeCount % (timeDivide + 1)) == 0)
3 ^. y. l7 ]3 e9 L! e1 ]& r - {% u' ?6 w( s ]$ T: F; R
- txBuffer[0] = CodeNak;
1 T5 M/ M6 M% @0 U - txLength = 1;3 }" m' g2 F; a; n) S0 H
- write(txBuffer, txLength);+ K r% N/ c K# J+ P5 O
- }
* ^$ D/ v8 H* S. C - }3 L! u- g5 @; s: a+ o5 l
- }
4 r8 N$ C9 |' o0 Y5 H& O9 u - }5 Z8 H# T+ p% Q, S# P2 g
& U* J7 N$ E( h2 r+ m0 P- /**
' b% W1 I% g! F - * @brief Receive transmitting stage.
3 u6 v; f0 u! Q1 o" G2 R* X p - * @param None.
- e3 y& r6 k4 {0 q+ [. A - * @return None.6 X2 `/ M! f) {% p }
- */2 r! H* [/ j/ i E' d1 G
- void Ymodem::receiveStageTransmitting()6 i* M2 g0 t! w2 Z) y- N. @
- {
; I, j' l; c% g - switch(receivePacket())
3 X* e+ F1 y2 x r% ~+ P6 V - {7 \+ b) I7 a5 S9 m
- case CodeSoh:
0 V1 ^) U' J: M* B# `" c X( H - {
7 X; m2 l: q2 D3 F& p, T9 {+ V+ ? - uint16_t crc = ((uint16_t)(rxBuffer[YMODEM_PACKET_SIZE + YMODEM_PACKET_OVERHEAD - 2]) << 8) |
$ G8 n& i; x% \2 E3 j, H3 ? - ((uint16_t)(rxBuffer[YMODEM_PACKET_SIZE + YMODEM_PACKET_OVERHEAD - 1]) << 0);
- D* ]; y& f$ \# `: C
/ L8 u; n! f. A9 [4 J- if((rxBuffer[1] == (uint8_t)(dataCount)) && (rxBuffer[2] == (uint8_t)(0xFF - dataCount)) && `* j# f- \2 U; x s3 @& L
- (crc == crc16(&(rxBuffer[YMODEM_PACKET_HEADER]), YMODEM_PACKET_SIZE)))
X% M0 K8 [9 H" _/ {# v - {
# n6 b p) t3 y. r4 s R - errorCount++;3 J3 n) b4 ]/ B9 F
- + {2 o( k$ k4 `" X% |3 h- N9 I3 d
- if(errorCount > errorMax)9 x, U. a, J+ {' c1 m' v$ t
- {4 P* y# f2 D4 o- S! _* n$ V
- timeCount = 0;
6 i8 b+ z1 m) i4 \ - errorCount = 0;
O% `# } v& N* R, T; L - dataCount = 0;$ ^5 h2 r. g# F+ N, q' |- E
- code = CodeNone; g! L, a2 B8 u+ }0 N! \) C' I: a
- stage = StageNone;
7 a1 Z4 H2 j( |+ h( I; s) H. o+ J - . y& c- c7 t' U* O& ` o: B
- for(txLength = 0; txLength < YMODEM_CODE_CAN_NUMBER; txLength++)
4 Y! Y5 L2 C6 [/ M$ ^ - {
2 ? x% J# W6 l" A, e( i - txBuffer[txLength] = CodeCan;. m; f. N# i7 j2 i8 T$ l( m7 |0 m
- }$ F5 U& ~* @4 a$ K, K6 m
- # N7 Q8 D" O, h J- |0 p7 Y
- write(txBuffer, txLength);1 ~& i- ^7 [' d, {9 C
- callback(StatusError, NULL, NULL);$ d# C7 d1 w4 }; D
- }; G( s1 B T! b' ?
- else; U- P6 {8 [. u
- {
- q3 o: _' S4 X' ?4 j; m* U - txBuffer[0] = CodeAck;# ]) f1 S9 W" K/ N
- txLength = 1;+ m' \! h! y! I7 F. M3 X5 J1 A
- write(txBuffer, txLength);7 h, `- y# |1 U$ h/ v
- }
+ c$ F. m: p, |$ Y0 a - }
8 V* h: ~1 \, a& f( H9 O - else if((rxBuffer[1] == (uint8_t)(dataCount + 1)) && (rxBuffer[2] == (uint8_t)(0xFE - dataCount)) &&
5 `( S+ I0 B% Z - (crc == crc16(&(rxBuffer[YMODEM_PACKET_HEADER]), YMODEM_PACKET_SIZE)))
0 b; o. z$ ?$ d2 }( {/ ~ - {
: ]% ^# U7 }( A) z: O$ J6 q5 l# ? - uint32_t dataLength = YMODEM_PACKET_SIZE;
/ j- z0 q4 i, }" z7 b: [2 @; l
; x( J; p9 F) S W+ Y& C6 l+ ]- if(callback(StatusTransmit, &(rxBuffer[YMODEM_PACKET_HEADER]), &dataLength) == CodeAck): c! c4 d. l# l9 a; s
- {
3 ]( @/ q* z$ j" l9 D h! b# | - timeCount = 0;
6 ^6 R8 q, r: }! n - errorCount = 0;
/ [/ v2 D) H0 {( \9 ^ - dataCount = dataCount + 1;
) a# M, w9 @# ?- V - code = CodeNone;
$ s) |* |* u: H3 r7 y - stage = StageTransmitting;- t# w. O- Q/ W( a% O9 T
- txBuffer[0] = CodeAck;* W1 \) j1 e3 _2 l) }- q
- txLength = 1;
, O$ T- H( `/ W5 V - write(txBuffer, txLength);
1 ?* x1 w( J0 r - }: p5 W J( N3 V, t: d
- else3 L. s5 v5 W3 J1 F3 g
- {$ S5 e# u9 m8 b; t7 |, {7 Z8 u
- timeCount = 0;' l9 |/ ^2 b# m; }1 B0 I1 d
- errorCount = 0;0 D' O% ?% C) M) }% c+ L5 ~8 w
- dataCount = 0;1 {. G! |) v9 M* I4 Y
- code = CodeNone;% R1 {7 |7 z1 X9 h& X, G; G
- stage = StageNone;
; E8 u5 V$ T' N f0 Z( }. m6 F4 ]4 @ - , ^6 \( Q' X5 g9 F- _6 x& ]0 c
- for(txLength = 0; txLength < YMODEM_CODE_CAN_NUMBER; txLength++)
) f6 c; u! w8 e, \1 J - {7 q/ D2 ]6 U0 z5 d4 s, V0 H
- txBuffer[txLength] = CodeCan;+ S, f/ _6 i* _: D0 a+ b n
- }! s8 P& e; b" o% a" T
/ }( ?" @& F- Z! }* Z6 @7 I3 D' g- write(txBuffer, txLength);! Q, I4 `5 _% u. O8 `0 H
- }
/ s2 c6 N a" ], Y! P p& w! R - }# R7 F! N# h9 S+ Q9 ~- Y0 B$ X$ o
- else" ^. j* @+ t' T: _/ ^* d _" r4 ?7 F
- {4 u8 g+ l" t- F' S
- errorCount++;- V3 s3 t* n4 C6 \
- 6 X9 q) {2 v6 x' @- S' e, T
- if(errorCount > errorMax)# K7 P& ?) s, o7 G1 p' d" \3 P
- {
6 Z6 l8 M8 T0 l. w. [ C* i - timeCount = 0;
0 l! W+ X0 A' s p9 I) b - errorCount = 0;
' ]: V1 s$ m: g7 x h - dataCount = 0;
/ C. \2 r* F3 L6 z - code = CodeNone;
' A. ?5 v# B( g2 C5 P! D. X% W - stage = StageNone;% ?7 V/ N1 R* o) @# @" A5 c
* J3 M1 s4 Z% \) f' O! t- for(txLength = 0; txLength < YMODEM_CODE_CAN_NUMBER; txLength++)9 C6 |* Q, |3 i- }: o# m$ h- s
- {
, a3 w3 z6 V) A) [& z0 N2 t/ C - txBuffer[txLength] = CodeCan;
$ R8 Y$ N* z. f7 y - }' Y# C+ f0 B3 y, O
- + Z, O0 M! v( B4 j8 w( Q; J; k
- write(txBuffer, txLength);: i$ G: t3 H. Y
- callback(StatusError, NULL, NULL); b4 X) V& Q3 I* a5 ^
- }
m8 c( m3 M V - else
; a0 @: {: @3 [0 ^5 S0 Z4 u - {3 z5 F! N) `* ~& f# {$ H
- txBuffer[0] = CodeNak;8 d3 v8 `1 W/ }5 a9 u$ n
- txLength = 1;4 B1 D& T/ P. T- x8 `: B/ j+ t- O
- write(txBuffer, txLength);6 r/ K3 k0 t. S# t7 s$ Y
- }. P) E# c; @+ F. f5 K4 b# b
- }
. N4 p; V: r5 _5 w- o: { K
) u: V! a$ l$ G$ Z3 X# a/ ?: q- break;
# Q. o$ D* F( u k. }2 b - }- o9 I w& q, ^. f- N& H( P
- " z e4 g* I, Q6 h. u; W. U5 \
- case CodeStx:
1 O' | a' s$ V6 a4 W2 G& Q% K - {! M$ K* a+ F: ^! N) i4 \# `
- uint16_t crc = ((uint16_t)(rxBuffer[YMODEM_PACKET_1K_SIZE + YMODEM_PACKET_OVERHEAD - 2]) << 8) |
" V: L; M% c* x9 X( N- ] - ((uint16_t)(rxBuffer[YMODEM_PACKET_1K_SIZE + YMODEM_PACKET_OVERHEAD - 1]) << 0);
9 P$ m0 ~8 n1 u. x O3 |6 K - ' ^5 _4 ~7 I4 T5 u/ e
- if((rxBuffer[1] == (uint8_t)(dataCount)) && (rxBuffer[2] == (uint8_t)(0xFF - dataCount)) &&
: K$ `- z9 l0 d! m" V" i - (crc == crc16(&(rxBuffer[YMODEM_PACKET_HEADER]), YMODEM_PACKET_1K_SIZE)))
+ W/ l! r, ~3 I% F& u - {
$ E9 [ }/ t4 u$ Q2 e - errorCount++;: }& }3 I* V5 l* P; i
- $ U& e* a' j. }# |6 F1 E) b* F; T
- if(errorCount > errorMax)6 q& z: M/ J4 A- D5 _: a: }1 l
- {: |6 {, L; o% \% |# U
- timeCount = 0;
, y+ r4 Q9 L) |' e - errorCount = 0;; b$ j9 \7 c" R( p
- dataCount = 0;
0 A* p% ?" j' `8 E) H! p1 M# a6 z - code = CodeNone;
/ a6 R# D2 J' s6 z - stage = StageNone;: r0 C/ P) G% l. c% u9 C
- ; P/ _) N1 d6 R
- for(txLength = 0; txLength < YMODEM_CODE_CAN_NUMBER; txLength++)
6 M( Q" C. T0 j& o7 v - {
; t! w) y3 k9 a; ` - txBuffer[txLength] = CodeCan;
6 y- Y: ^. }" B9 \( w - }: h3 m5 f2 \, L5 F
+ i% d/ R; r8 W* P9 r- write(txBuffer, txLength);1 `& c% K1 D0 Q
- callback(StatusError, NULL, NULL);# d% p5 ]- j# u6 }0 v
- }" k! N! @' a8 C% c
- else" |6 I' [, v3 r) J2 @- C! f$ o
- {' I# Z9 X# c1 s$ b5 g
- txBuffer[0] = CodeAck;
6 M( V/ X! l; M9 ]' C% ? - txLength = 1;
4 Z ?* h" E5 \8 O9 V) a5 e; V- H - write(txBuffer, txLength);
7 O' s- Z- P5 Y' V - }
& ?! a; \. G% y. d0 t - }
/ ?2 [6 X5 h q$ G; U1 ~ - else if((rxBuffer[1] == (uint8_t)(dataCount + 1)) && (rxBuffer[2] == (uint8_t)(0xFE - dataCount)) &&1 A1 l G/ m( Z1 s/ D+ j' A8 q
- (crc == crc16(&(rxBuffer[YMODEM_PACKET_HEADER]), YMODEM_PACKET_1K_SIZE)))
$ _& s' P+ E" `9 P - {
- D' |" l! J- F - uint32_t dataLength = YMODEM_PACKET_1K_SIZE;+ x9 b8 D' v. J6 S# j7 L) \# w& i, n
2 b- B; G6 A" p5 U! Z- if(callback(StatusTransmit, &(rxBuffer[YMODEM_PACKET_HEADER]), &dataLength) == CodeAck)
* X0 L5 [$ x D' g - {
" U3 U1 G* V: | - timeCount = 0;
+ D# n' A6 A6 v) _ - errorCount = 0;3 |- e( H, k2 @4 W* e4 I
- dataCount = dataCount + 1;
7 B; O7 L* j9 P" I# [* A - code = CodeNone;8 O" } \: E" D3 C3 i/ @5 X
- stage = StageTransmitting;/ Z8 v9 M' s" S( ~" p
- txBuffer[0] = CodeAck;
& u, L7 P6 l. n2 G- w - txLength = 1;$ M$ c0 P9 ~# v% M' ?0 [1 [
- write(txBuffer, txLength);
' K/ v: n% E, l9 Y - }
+ O [! r& K# [: ]/ j - else% M* ^/ K+ O- n3 {+ e2 Y
- {: b" e9 I1 d, q1 n+ t
- timeCount = 0;0 Y! o* O7 h& {7 S# w
- errorCount = 0;
! i! L, C' j; r - dataCount = 0;' ~1 o) X) w: o4 i+ D* f% L, _/ A
- code = CodeNone;5 M3 U, Y& n( R# d
- stage = StageNone;3 c. y' \" O3 L
- ; q0 i1 N: u! B4 p( m
- for(txLength = 0; txLength < YMODEM_CODE_CAN_NUMBER; txLength++)1 R+ H0 e/ j1 D
- {
& `$ X' C; U9 `( @1 z4 l - txBuffer[txLength] = CodeCan;; ?7 L) H r" k, Y; Y
- }' |9 w6 O" }' a/ L( _" q
0 Z0 j' u4 Q* n" o8 _. y- write(txBuffer, txLength);
, J/ a7 G2 u1 |: ]. m+ x( O* p, f - }
# F* G. U& I) c% g0 D6 ^ - }
w+ @$ _$ j4 F( z$ _ - else0 ?1 b1 }" t8 U& @* z
- {
$ i6 R; b2 [0 S, \2 p3 Y8 Q4 |) s0 v' e - errorCount++;
9 V2 f4 \( g" `
+ B2 Y" E3 G6 u Y/ Y# y6 n( i5 h- if(errorCount > errorMax)
, U4 Z9 J2 h s - { |: M% V! T& ^! x" W
- timeCount = 0;; t5 F/ Y0 M2 n4 u8 }) D
- errorCount = 0;
" J: Y1 `" X% U - dataCount = 0;. @# n7 ?) E" F7 O7 t+ A
- code = CodeNone;
& L1 I' G0 J6 j& C - stage = StageNone;
# a" G; Q0 r; {6 p. u/ O
. ]0 E$ o/ z) D1 R6 G3 l- for(txLength = 0; txLength < YMODEM_CODE_CAN_NUMBER; txLength++)
; a& l& b: x Y5 X6 I+ l( T6 Z4 C - {
) W( y U) ^8 U" {/ ?. q - txBuffer[txLength] = CodeCan;
8 G1 x0 l; y0 E" A - }
; r9 M9 Y8 m9 Q* _7 [. X2 n4 @ - # C/ u- d2 c1 A4 K( o
- write(txBuffer, txLength);
2 J$ U6 Q0 z) ~# j7 s- C! r - callback(StatusError, NULL, NULL);) @! [/ N) h& A
- }0 m# m3 t2 z e+ |9 Q- r3 T
- else* U1 i7 ~/ {! y" V" t5 T+ z
- {
% j# }3 x0 ~$ w - txBuffer[0] = CodeNak;
0 j5 O8 H( |% Y& K6 x - txLength = 1;1 w; e0 \+ b) h* S6 I) g5 a
- write(txBuffer, txLength);% n! i. s+ B: a4 i
- }5 q- y% `+ u. x5 h
- }
` {, y+ k1 B8 a8 c) d* V! q - % O5 i9 X# `5 y/ H5 S
- break;
6 O" N+ f8 f8 m0 {. K2 L r% T( r - }9 T4 |) F( q1 s2 K9 a
6 y* p& ~" A6 r Q- case CodeEot:; R2 d6 B: n- s, l/ C
- {
, E1 g. e |) u% c - timeCount = 0;# t1 k2 E+ Y. j1 [9 g6 {
- errorCount = 0;' C$ I' q8 R# J2 @0 t4 l7 e
- dataCount = 0;
. p5 w( T) H4 V5 v2 S; o: H1 F - code = CodeNone;
* Z, W$ X1 |% C* ^7 e& S6 M8 Y( O - stage = StageFinishing;
4 D; ]" r; | |4 N* ` - txBuffer[0] = CodeNak;- v4 I- x4 a* K" O0 J0 [. e
- txLength = 1;
2 m' b3 d1 p) S& A. w - write(txBuffer, txLength);
3 s. f' J0 E c2 U4 |- _) i \4 o
5 h8 w& v: P: h" Y, v1 O7 |- break;3 @; N$ c8 o# n& o1 I# E
- }
* Q; C. @; i, S) I' Y4 I4 m
' t! [0 h8 A- ]7 ]- case CodeA1:
+ }- `4 X/ `' |6 C7 ]/ c) {# D - case CodeA2:+ e7 G% a0 s4 j: P! ?& i9 H2 V& y
- case CodeCan:% P8 A9 r( A) t* u2 v# d
- {
% A; \5 \+ s$ v o4 w" V/ H - timeCount = 0;: p: R" u f3 R
- errorCount = 0;
4 S$ }; }% q) z5 l6 Q D - dataCount = 0;# Z, e( V. L- Q9 u' ~8 H
- code = CodeNone;
; s- b6 o; g. e- I3 w/ k9 n - stage = StageNone;
/ z V( _+ ~) F w/ D" y: i1 u - callback(StatusAbort, NULL, NULL);# i4 \ G; v% D: ]4 j
3 M$ l7 ~) H2 y$ W- break;
( J. K4 N5 y; ]6 _% T M - }( H, C. F; {0 A" x! b7 P+ ^
1 e, a/ { I* ^5 s8 w- default:
6 V. U* p. H8 I. H - {9 z" Y$ c& F( s9 Z& ?' [! b$ r5 T
- timeCount++;/ ]4 S6 K! s' ?; U
- - O$ r* }; i, s, A
- if((timeCount / (timeDivide + 1)) > timeMax)
% c! k1 ?3 I) K( {6 [. m - {
3 `& G# [! V8 k3 _, ] - timeCount = 0;" N) w4 S o& ~- W/ h! E
- errorCount = 0;* |! |& x* g1 h0 p+ a( p! E
- dataCount = 0;
2 R' ~" ?5 u. F& g! t. ~ - code = CodeNone;
* Z, D% d% N' m! f/ q3 [ - stage = StageNone;7 l; c \# X, Q) v T- U
- 2 Y0 }3 U) I7 u6 `
- for(txLength = 0; txLength < YMODEM_CODE_CAN_NUMBER; txLength++)
& p9 d' G& {3 L* a- G: C+ J - {% M0 W6 I, n h8 \8 j
- txBuffer[txLength] = CodeCan;7 O* F% v' ~9 ]9 _
- }
& i8 L/ ~. Q0 x! r6 P" K
8 g7 i. A, ~: Q5 D G- write(txBuffer, txLength);
/ P0 |6 N" q9 X7 M& D' Z - callback(StatusError, NULL, NULL);
+ @/ z" Z- W5 n7 _ - }- ~. T- n( F3 k3 A J3 p6 t* W
- else if((timeCount % (timeDivide + 1)) == 0)$ o# M1 d' y- J; @
- { d: Q9 P( f; b' L5 A, o2 u
- txBuffer[0] = CodeNak;4 u. k. e( S( Y- m
- txLength = 1;" A" y" O2 s2 V" m6 J
- write(txBuffer, txLength);
9 M- |- o: n$ L9 X) _/ m' T# _( b - }( g2 N' r0 Q* u6 V
- }4 C2 g/ A9 Z$ I) w! {: c
- }
' b: s% j. H Y C: L, e) D! s - }8 A2 ~0 H9 n; p# J- u$ G
1 @3 b4 z$ b9 Q: y7 w! \7 F- /**
* j- N4 X) |+ G$ f - * @brief Receive finishing stage.
9 W5 J* M5 e$ u( [9 ~& g8 b - * @param None.
4 p9 A- A+ X0 a9 g7 Q - * @return None.
1 t0 p1 U* _1 U9 ^7 W - */. l) I& Y$ e: C; k9 G
- void Ymodem::receiveStageFinishing()
+ l* a! ~5 H# d! t/ P, B - {
, F: S7 _) H9 b2 y& \+ W - switch(receivePacket())7 ?8 Q4 S" Z1 c: d) B
- {
: E6 t( B1 m' a; M& V: ]* G - case CodeEot:- ^$ Q6 t/ [& }6 ~, H
- {; L, E. k4 j$ }4 J) N7 Q {
- timeCount = 0;) V/ @3 S$ [3 T: U3 E7 U
- errorCount = 0;! {4 x3 _- P, b& I
- dataCount = 0;
$ y$ Z) z6 V9 i+ [ - code = CodeNone;: }9 @: Z m# l9 A7 i
- stage = StageFinished;/ Q, c8 {4 I. s
- txBuffer[0] = CodeAck;; M# T6 r ]+ S8 k5 R
- txBuffer[1] = CodeC;. Y8 N8 y5 Q2 Z, [: H% z( `
- txLength = 2;" W' X8 {* i& C
- write(txBuffer, txLength);
) O5 l! G6 B: t( ? - ( l) N# \, ?, ?, V! i) Q0 r1 D# A0 @
- break;# v, ?: W5 W; @2 G6 F- Q, D
- }5 q% }1 s; U- D3 h- j. ~3 S
- 5 g2 z& ?) ?; C" H- {; }( q9 h
- case CodeA1:0 N! D( v* I! a4 x4 K2 i' G/ o
- case CodeA2:
6 p l J3 j/ ~) S y* B4 l3 E: |5 d - case CodeCan:8 z* t, `( e; E! z
- {
% b' w! J) t. f2 b& O - timeCount = 0;
5 L$ k j1 g! `- ? - errorCount = 0;% H c. U7 }3 W( H& X6 J
- dataCount = 0;. }6 \ P9 o) H7 y
- code = CodeNone;6 v" } F2 X# x0 K! ?$ m' J1 j
- stage = StageNone;
& d1 b! }$ R: g n- ]* k - callback(StatusAbort, NULL, NULL);
: Z9 K' S0 m* R/ L - ! a+ X2 v6 X. ?( Q# g3 z
- break;- M* ~$ r: i3 ]. e
- }
1 |# J/ b7 t$ s% y/ ~( v3 o - 0 a" V7 z2 f9 f/ J, S$ k _ {
- default:1 a% A. k1 @9 v5 r& l2 I" P2 Z# M
- {
- y2 \* g. @( ] - timeCount++;; E R# }) X& D- {! M5 m. Q
- 1 o* T$ v g( |6 C
- if((timeCount / (timeDivide + 1)) > timeMax)
/ \ r/ y' V1 @% F - {
) z; l: i) \( b - timeCount = 0;
$ M: D# J6 Q: h - errorCount = 0; o" ~- |% V. s. O4 g0 @3 w
- dataCount = 0;
) }+ y, i6 J0 b- I- s - code = CodeNone;
2 ~1 d3 y0 N% ^5 f, u- E - stage = StageNone;
6 ~8 Z- j* g8 l+ a
6 b) w; T8 L% K) l" B" J- for(txLength = 0; txLength < YMODEM_CODE_CAN_NUMBER; txLength++)
5 e5 ~ z9 }! P# ~ - {
. ?/ ^9 N( N, _8 m# H" Z - txBuffer[txLength] = CodeCan;* i2 C/ v$ w" E
- }
, r5 J1 f8 A! D' t6 V - 3 q1 J1 ], L- `: ?1 Y
- write(txBuffer, txLength);* B$ i* n. j3 F* O* K
- callback(StatusError, NULL, NULL);
# l2 w) o' ?4 I6 Q1 M6 N9 |' K- [ - }
, h3 k$ Q6 [8 W3 D) k - else if((timeCount % (timeDivide + 1)) == 0)2 H; L3 [! K% h! D. c
- {
2 X2 u0 {6 Y' }9 y4 Z2 m - txBuffer[0] = CodeNak;
# f4 G5 f* k' Y8 i: {" u. P - txLength = 1;, x5 Q! K g( ^# Z/ E0 @3 H
- write(txBuffer, txLength);9 t. z# R& `4 p' G5 n6 g4 g: W
- }; C+ @: I; q w8 s) W) d" K. P
- }/ F- x, v. d4 o% Q+ {7 ? b! O
- }
9 F9 f* N% c4 I: ^ - }
, i: u7 G$ d- Y: U$ r - : v- t! b* }: o/ M! N' }
- /**
( h$ n/ ]9 A; o9 r) G# C - * @brief Receive finished stage." s6 |8 A9 I/ ~
- * @param None.
/ P$ o) a& z: o - * @return None.
# s+ D) W1 d0 a! u! j" \1 z - */
8 D' }+ J" F' @1 R1 { - void Ymodem::receiveStageFinished()
5 c$ r& R' f% P' w# B1 P* r - {
% f" w$ k$ Y% m# E' H" ] - switch(receivePacket()): B& s" N0 w. ~
- {
& \- v X% G" |5 T+ r - case CodeSoh:
% l1 n# m, ?, a, V, G; q2 o - {
: M3 Q. V8 F- x9 c, K - uint16_t crc = ((uint16_t)(rxBuffer[YMODEM_PACKET_SIZE + YMODEM_PACKET_OVERHEAD - 2]) << 8) |3 O* T2 K* H. H/ k2 D/ t% B
- ((uint16_t)(rxBuffer[YMODEM_PACKET_SIZE + YMODEM_PACKET_OVERHEAD - 1]) << 0);( I" }9 O. g! R) u8 [2 R" m
- : J; `" T8 c ~9 e n. D
- if((rxBuffer[1] == 0x00) && (rxBuffer[2] == 0xFF) &&
' V1 J `1 ?* t2 _ - (crc == crc16(&(rxBuffer[YMODEM_PACKET_HEADER]), YMODEM_PACKET_SIZE))), R6 ^: J7 ]+ t% @' K4 t4 r( _! I
- {) V" V+ @0 @ b' c; B7 z
- timeCount = 0;0 G4 ~* ?' `/ E1 m8 q
- errorCount = 0;9 X9 I- I% m$ S2 d, {
- dataCount = 0;
: I2 z7 s. l+ K7 K' } - code = CodeNone;6 V- q f& l3 `! b4 z+ M5 ^
- stage = StageNone;
- p1 `& G# {' s" ~ - txBuffer[0] = CodeAck;
; q' T0 b: h5 X8 S - txLength = 1;
) x: x' k0 K3 s# i/ s - write(txBuffer, txLength);. {4 @: }% g9 e6 A
- callback(StatusFinish, NULL, NULL);
/ x; E! y2 z& @9 e( E - }
2 X# Z" B# E& Y - else
( \ A8 J; H6 W1 q( g/ b$ H - {
. p) r- d: `8 W- d - errorCount++;
( F! { U' k+ f+ O) ~' O5 A+ O
2 e8 e- |; u! T2 x% k$ z: b- if(errorCount > errorMax)
+ S' @, { Z8 p7 Y/ H+ q3 C( U0 d - {; V, R7 y P& ?% Z
- timeCount = 0;
* o' q( ]5 b$ @) v - errorCount = 0;
- |+ _0 O1 c& t% D: a5 J k$ q - dataCount = 0;
& H+ }& B5 E4 n1 k# C - code = CodeNone;
6 N2 V- r5 {! Z* N. `: u9 |% p - stage = StageNone;
) X* h4 h6 t- p
# _9 J2 i/ z5 o# G1 `* n8 `* v- for(txLength = 0; txLength < YMODEM_CODE_CAN_NUMBER; txLength++)
( n# _( r: m0 ~) t# M4 c - {' } v- p8 j9 M9 Z7 b1 F! d
- txBuffer[txLength] = CodeCan;9 G8 a1 S0 y8 {9 k$ \, B! ^0 C* Q
- }5 g- E5 e& u1 u$ U- R0 G. q
/ o! ~/ s! P/ r2 q' I+ ~: E- d- write(txBuffer, txLength);6 D: u2 D' ?$ f: b; g8 b& p
- callback(StatusError, NULL, NULL);
1 ?0 \0 K6 W$ S* K - }
6 {4 ^7 U) g9 ]: ^ - else2 Q6 ^3 B, e/ ]4 o* n
- {& w) u$ _. z0 g+ J
- txBuffer[0] = CodeNak;, y' q* Y" S' l! i
- txLength = 1;
5 ~* a3 m3 E7 w; C x4 l) _ - write(txBuffer, txLength);: G* d7 I1 O" ^4 C5 N+ ~. O2 j3 S
- }
/ r7 ~+ _, Y( G& f0 p - }
9 O, l3 R% ?0 y* ~
$ r6 u* t( H/ B+ v- {3 f9 x+ D- break;5 Y4 z! l- _+ b' @8 ^% _
- }1 @$ n" _. U) e& X, o; C
# S% H* x& y0 d4 x! Y, u4 `7 c7 s- case CodeEot:
- R7 z) C: z" l5 M1 O - {
1 I6 m: w9 h) z9 d, H- J9 o/ T - errorCount++;
& W3 U7 {! K" ^5 d
6 j; y" A- p4 ^9 _1 A$ V/ s% m g6 E' y- if(errorCount > errorMax)' W! i$ Q1 p; z
- {6 J) w U; U: `, D- s5 E/ K
- timeCount = 0;- v" K$ T5 K( O4 n/ P
- errorCount = 0;* i3 k$ n! { p% p; n$ ~
- dataCount = 0;
& [8 z+ M ]+ Y% h+ o2 ? - code = CodeNone;
/ _( Z6 b0 g C& ~ - stage = StageNone;7 \- M" u8 f0 l- s
& Q0 t9 y' e* @* h4 {' R2 O- for(txLength = 0; txLength < YMODEM_CODE_CAN_NUMBER; txLength++)
! g; u# q( k _8 K: _% d, h - {
% s& y! X6 A1 x+ l - txBuffer[txLength] = CodeCan;
2 W# k- z ]: C* k- P+ z8 U - }* Q. X. s& c& j: R3 @6 }# ^* X
$ r( {$ E) |' D% \1 V3 c' P- write(txBuffer, txLength);' D5 c# ~5 e0 J% C
- callback(StatusError, NULL, NULL);
" z* U* p8 L* @$ O; w9 K; Z/ U - }
+ y( G8 X. U' a/ H p - else( e; T. G5 c% s: ?) o/ f. t
- {6 |5 ?4 }! c: d
- txBuffer[0] = CodeAck;
0 F! m! `/ u/ B9 b% c - txBuffer[1] = CodeC;
: ~/ B! w5 a6 C+ C/ r$ I - txLength = 2;' K- `' g2 q9 p4 i4 m
- write(txBuffer, txLength);, V+ N" S1 i1 h& L- Z
- }
! m, E+ X8 G3 G3 b8 O+ g - M& o& T d' i t. F% C
- break;& F8 F( u* H, }1 H/ L
- }
7 H6 \' W. p. f: N; k3 x+ N" R
' v4 |1 Z, c* S- case CodeA1:
0 U$ ^, E- b" S: S+ R' s - case CodeA2:
" D- U/ A- @) K, a G - case CodeCan:$ m/ i& Q/ Y) U) O# v. Y% c. R$ q
- {
2 r) B/ }9 c5 j5 M; _: V - timeCount = 0;
7 J0 }0 a$ q8 L0 W0 s+ f: J - errorCount = 0;; x6 z) I6 Q4 j, E `
- dataCount = 0;
! I6 S; w( L; j( G. Y - code = CodeNone;
* _8 s& a! ^" I- X* d - stage = StageNone;! ]* D- V+ k4 s/ ?, H
- callback(StatusAbort, NULL, NULL);# D: e3 F& g$ X- n4 |+ h' B+ d% L8 V3 J
7 G) c1 O% q) `7 ]6 R6 T8 T( Q0 U- break;
, ~" F' I8 A: u - }
' @0 |& I/ ^# `4 b) z - . G- N" Y4 B& [& G) n3 u: x
- default:' r5 i5 a. x, M
- {1 \8 ?( i& x. t
- timeCount++;* x. \+ R: `8 ?1 b8 B* f: _3 s
- ( E: t& W5 k. D5 e. T% s% o
- if((timeCount / (timeDivide + 1)) > timeMax)
+ X/ [) J% u5 y" j8 ] - {
v, b2 J. L+ M8 j - timeCount = 0;' X0 @3 { }/ v/ z
- errorCount = 0;8 n( s& _; i. |4 ~* }5 {; b
- dataCount = 0;
$ F3 e7 h4 h! v. J - code = CodeNone;
! ]6 d8 \, n7 R+ E" B- c - stage = StageNone;8 `3 {/ ^% O$ d0 a' d& C8 p8 i) w
: U* F) T9 q& w% G- for(txLength = 0; txLength < YMODEM_CODE_CAN_NUMBER; txLength++)
3 \2 g9 w9 d; p0 w' I - {
. J) N7 L+ ~/ c0 q. O) z, P - txBuffer[txLength] = CodeCan;) P4 S7 b" g& T
- }7 t7 y' W3 C% _
2 k& H0 o U% @3 R; Q" f- write(txBuffer, txLength);. b& F) o+ q% w8 }1 F% i) v7 v) r/ ~
- callback(StatusError, NULL, NULL);2 h0 V* M8 A0 w1 X2 W+ p
- }' ^" |; M! u. G( d6 ]
- else if((timeCount % (timeDivide + 1)) == 0)' E9 {; v5 z5 j$ [
- {
9 v9 F: o1 ?( t( o( E5 }0 q. @ - txBuffer[0] = CodeNak;
x' E ?, D6 C2 n! Y" L - txLength = 1;
4 k) j, H( h1 c/ J, }2 n - write(txBuffer, txLength);
, T( I& V1 h; p' z - }
9 @; A2 U, @; F1 |2 X4 `; {: H - }- g H. S! D4 `8 i$ u
- }
- X7 t) r' J& Z) ?% P - }/ M7 O* P. Q5 O2 ]/ W) E; V
$ Z9 I, \; @& K1 Q" a3 q) G5 K5 t- /**
$ }6 f% S2 @* w8 h7 [; ] - * @brief Transmit none stage.
$ U8 q' ~" ^$ U3 W d2 O3 }% N - * @param None.1 [ p" T4 O5 U6 v
- * @return None.. C' \ L3 F' b7 t
- */. I1 m9 J/ K" ^4 i! `, x$ b
- void Ymodem::transmitStageNone()
- R6 u& J$ l7 d8 D3 ^4 Y& v - {# [2 T' N& }- n4 J
- timeCount = 0;
: A/ N6 O. }$ E - errorCount = 0;
: ~+ u: t3 M. Q9 r7 I2 } - dataCount = 0;
9 W( O F4 m0 g! y6 K$ D. m0 V - code = CodeNone;% }6 Q. R5 {4 J' a4 v8 G0 o4 H
- stage = StageEstablishing;) G P8 o( d' h. m( w i: J, s
- }
* G! U$ B% l) B( H: f# { W3 v - , F# G+ `, A; M7 a( }
- /**
+ a7 l1 b9 h$ l/ L _/ C - * @brief Transmit establishing stage.
4 ] q; j' Y Q i2 r* j3 m8 M - * @param None.2 o- e9 w/ ^* d" @
- * @return None.. _" p! O. f, S, X' x7 y
- */
" Q* c% a5 I, K) ~ - void Ymodem::transmitStageEstablishing()5 ^" k8 s6 j( g% V: I$ C3 y. Q U
- {
7 U9 d2 j8 N% C0 Q7 ~ - switch(receivePacket())- `$ N& q9 ]/ h& Z% W
- {) {& a; v( q5 C3 t8 t) W( n
- case CodeC:
7 p. K* u0 z& w3 Y8 w( a/ X5 i - {" R' j9 }4 O, A, w
- memset(&(txBuffer[YMODEM_PACKET_HEADER]), NULL, YMODEM_PACKET_SIZE);% {: ^& I+ @8 ]; Q. N
- / K/ r4 n' \: _8 L! r
- if(callback(StatusEstablish, &(txBuffer[YMODEM_PACKET_HEADER]), &(txLength)) == CodeAck)
& u- G# z+ f: R v0 Q4 } - {: Z+ B$ N% K( w' \+ r0 v& U) A
- uint16_t crc = crc16(&(txBuffer[YMODEM_PACKET_HEADER]), txLength);
1 V+ T. P7 e4 S L, e) W
' u9 S. s/ q- R3 e- timeCount = 0;* g' U; y2 U' T% j. l
- errorCount = 0;
% c$ `' [ |! z# @" ~* P/ ^! W - dataCount = 0;5 m" ?% w4 b# p4 Z) z0 e
- code = CodeNone;! s% ^7 v, {4 H* |9 |9 c
- stage = StageEstablished;
9 ]* q6 k% n% n( Q3 a0 }$ H O - txBuffer[0] = CodeSoh;' Z c4 d+ o7 z0 s' @0 S6 w' J2 ]
- txBuffer[1] = 0x00;
& l! P% f& q) m+ S/ @ - txBuffer[2] = 0xFF;
1 a a& K4 f# B) ?- c5 @0 z! P - txBuffer[txLength + YMODEM_PACKET_OVERHEAD - 2] = (uint8_t)(crc >> 8);! [3 o7 d P. T: L- t
- txBuffer[txLength + YMODEM_PACKET_OVERHEAD - 1] = (uint8_t)(crc >> 0);9 P) R9 u' o$ S6 A/ ]( _, E8 l" Q/ i8 c2 q
- txLength = txLength + YMODEM_PACKET_OVERHEAD;* E. N& E' f6 T" \1 Y
- write(txBuffer, txLength);
, e/ C6 ^. m9 D8 ~5 \4 m - }! z4 U2 w; ~. E$ X* [/ v
- else9 Y; K- U" e# O* Q# D6 L# R
- {
; M5 k0 ]4 p( A/ j0 I6 ^9 T - timeCount = 0;
( e5 h( K( b$ \; F5 t - errorCount = 0;" Y7 e4 N0 t) G3 J
- dataCount = 0;3 N- L6 F" d) `# @5 P, P% L5 l
- code = CodeNone;
: _4 A) x, z4 f! [) N8 X2 ? - stage = StageNone;0 b+ l3 e0 H3 [; |* t X; ~! l
- - y. H. M9 x% k* ~, P
- for(txLength = 0; txLength < YMODEM_CODE_CAN_NUMBER; txLength++)4 L" Y# ^' j. Z/ _
- {9 q" z3 i5 u/ L$ {' |+ n4 ]5 w
- txBuffer[txLength] = CodeCan;
0 D' B0 d. o: D* [5 R7 F - }
, c7 \$ c: K% e; p7 [ - & n/ ]/ w+ H8 o5 V! _ B2 K& L
- write(txBuffer, txLength);- Y+ _1 Y t* o( S
- }# s5 i5 Y( C: F8 G+ y4 n
- * B8 l5 ?" G+ T& `. V5 f
- break;
4 v, K7 U, S1 l! w" A - }* T" X0 U, N T L3 ]9 S( X
. e4 [3 [# C( ~) ~6 g+ l& X- case CodeA1:
* t% |9 U+ {. P; k( o - case CodeA2:
8 o, D3 n$ g2 @8 W% T/ O - case CodeCan:0 q1 ]. h5 u* \, e. D& w& I
- {' U1 L7 g+ ]$ }$ ?& R3 E
- timeCount = 0;* J/ B5 [" F7 E' |6 O n, F
- errorCount = 0;! O0 k3 } q: ` W9 c
- dataCount = 0;
; e0 {" N8 ]2 s+ S; ?& d - code = CodeNone;& |1 }" Z" q, W! v0 v+ R0 O
- stage = StageNone;& w" D* [$ Z: p
- callback(StatusAbort, NULL, NULL);* G F7 |' ?; `! n- j) g
3 b2 _. i! o1 f0 b& K+ J- break;
7 }" d3 u- N) N. G5 J - }3 f+ }1 u: W" \7 _8 n# u
9 H8 r5 V8 K }7 x" b5 `. e- default:$ J+ m* c' Q/ I2 t0 Q) Z; N1 _2 e
- {# {3 G ~. z+ d" i4 @5 B4 u
- timeCount++;9 Y& \% ^. B# j
0 N* ]; \! X, W2 y1 m! z- if((timeCount / (timeDivide + 1)) > timeMax)
" A! D4 a% s% ?* l) ^ - {9 T3 d& u+ R4 D# ]0 q4 s: o6 W
- timeCount = 0;
# L: k5 ?2 a4 } - errorCount = 0;! \% @$ k! y5 X& x1 K
- dataCount = 0;$ L, [7 a5 Q9 c$ |
- code = CodeNone;
8 k6 z1 u' V$ ^: X4 J/ ^/ X8 U( c - stage = StageNone;; r3 C; u H# W
- 2 |7 J7 S5 s2 z% N7 v
- for(txLength = 0; txLength < YMODEM_CODE_CAN_NUMBER; txLength++)1 ?8 K% G: w! [- o
- {! e9 L/ j* p* u& f) M ?# {
- txBuffer[txLength] = CodeCan;; ^. t& v7 d. ~7 T5 }- v( h
- }
7 P5 ^. u% h5 q* q5 u - : O6 @3 Y/ N' ^3 `3 q& Q, S# m
- write(txBuffer, txLength);
7 n4 d3 U4 b$ u) l8 u/ }+ j n# g - callback(StatusTimeout, NULL, NULL);8 {0 y/ Q' P8 h+ |# y
- }
6 l, s# J* [& X3 s q( z y% L - }
2 J+ r. R1 J9 ?' x' Q - }
# H* w$ C! C% I' m2 M - }
% R% m6 M' K1 F. v9 J+ N, w* U2 g - : m: {2 V1 C/ \ G8 j
- /**
+ K& ^0 {4 y$ r; Y1 L0 `; ~7 x - * @brief Transmit established stage.
4 n- f7 K% w! @0 O0 h - * @param None.* @- D% R) V# v3 [# v, S
- * @return None.7 j i: Y% {/ i
- */
' }: H+ u& Q8 Y, r - void Ymodem::transmitStageEstablished()
; ~; [$ h* ?& Y! E - {
. R- ^6 n: h+ b- Z4 @6 q, @: d; ? - switch(receivePacket())
0 r- e0 K- {+ d3 ]( _ - {
# `' h0 O4 t! Z N - case CodeNak:
% I w. D- |% C1 ] - {
8 \# |8 J2 Z" W0 k9 o! ?/ x2 E - errorCount++;+ k; ?+ j4 v& g- G
- $ L2 f5 z; F: c5 b5 b- Y/ D1 e
- if(errorCount > errorMax). b( w$ D" \0 E% {0 y
- {' ]( h, Q# n& v9 Z
- timeCount = 0;
# Q5 T3 x1 _5 o - errorCount = 0;
1 s! j1 F0 e. V - dataCount = 0;
/ \! j! t" F" p9 [3 X - code = CodeNone;5 S9 @* D+ h" T9 Z) p$ }
- stage = StageNone;
/ e2 r) r/ g$ E% L }. c: r7 R - $ f Q2 t, X2 E3 J+ x+ Z8 T; H/ t6 z9 y
- for(txLength = 0; txLength < YMODEM_CODE_CAN_NUMBER; txLength++)
5 B/ `8 }5 Y0 R5 O) ] - {0 }9 O% N9 w% ]. X7 t9 V; e [
- txBuffer[txLength] = CodeCan;
2 Q5 a1 C) J0 o1 X# `# |1 E - }
" I! V& U& f5 O) X( _# S# a7 k
# P1 k1 o/ z" i+ T4 t% _& o" V- write(txBuffer, txLength);
$ o+ x K }; G$ M! k# M) l - callback(StatusError, NULL, NULL);+ J3 V1 ?8 `$ D. P) Q9 u
- }
5 G% ^" O+ ~- X( u; q8 K - else
9 K% @2 F, }$ [ W3 C8 Q. z% M- H( b) w - {
& g3 ?, F0 Z. F. \ d( I$ n6 \ - write(txBuffer, txLength);
- n* y" c% X: M, F5 z% A - }
9 [$ K; ]9 F8 w/ V
* K7 b+ t V4 @& C% z' [+ H- break;
0 c; z$ D6 Q( M' U; ^ h - }
, R/ @4 v. R6 x7 \% T+ \ - - B$ |/ b }* }+ z0 a
- case CodeC:
" j8 c4 `0 D, \% K+ |- p( A - {! R2 ]. z' K* L" U/ F" C$ `
- errorCount++;
$ A8 X; c3 [( i! s, a
" Y6 Y1 Z' u9 l5 G2 m- if(errorCount > errorMax)8 {8 E9 e8 {6 y. y4 ^
- {
, z E' x- V9 U - timeCount = 0;& q8 e6 K4 n0 ~1 G2 l# d
- errorCount = 0;
L: W% K; u( Y( b& G6 F3 R - dataCount = 0;) F; B6 f" [9 X$ X
- code = CodeNone;8 r x- Y, |2 G! {) E) N
- stage = StageNone;0 w; T) G8 W) u+ p* E4 g
$ h' t' v' ]! X7 B8 @% r- for(txLength = 0; txLength < YMODEM_CODE_CAN_NUMBER; txLength++)
$ ], b' m1 E* y& D4 T% S/ u: N - {
- c8 u: b0 a+ {: T2 i- [ - txBuffer[txLength] = CodeCan;
' K$ b4 o; Y; g; D& q - }
; E m, W3 V: K8 _6 W$ }
2 S3 u4 I" {, @* ~# g' _9 ~- write(txBuffer, txLength);& u- ?0 S, M; j& p$ F
- callback(StatusError, NULL, NULL);
) A9 P5 `& y F2 w' Y* x - }
; j9 W( b; y0 D& t @3 F% i - else
# w1 O/ y$ _" j2 d# }3 E' ? - {
# c+ v# v- p$ X' o - timeCount = 0;6 V' W: J3 t' n' E
- errorCount = 0;
Y# M5 m N& r1 e+ b$ {/ G - dataCount = dataCount;
: U3 e3 i0 i \ L - code = CodeNone;
5 I' D" E: t1 s+ I$ N - stage = (Stage)(stage + dataCount);
* [% Z& Z: e- P, o: d/ m - write(txBuffer, txLength);
2 N- G* E! R% R$ x - }
" [, p1 s4 {" Z( h; ^
& H3 u! L+ U# C! {0 }- break; j; V7 ]' {; B% t% k$ m
- }- A h. G9 N9 h* n, b( X
- * y- {1 N- L1 h5 `2 q
- case CodeAck:3 x. m) |- \$ q, M
- {
; u% |: w/ n2 x [/ z - memset(&(txBuffer[YMODEM_PACKET_HEADER]), NULL, YMODEM_PACKET_1K_SIZE);! S5 u7 i! w# T1 @ o
: _3 [+ |; Y3 d4 }5 e" O2 H- switch(callback(StatusTransmit, &(txBuffer[YMODEM_PACKET_HEADER]), &(txLength)))
/ C; H3 A1 C" V: Y. J - {, q8 G' k9 g0 C- k4 M4 V! Q
- case CodeAck:
9 h3 Z7 b9 m/ k' K/ _ - {
7 p# e) D R0 s f% V0 T6 e0 M - uint16_t crc = crc16(&(txBuffer[YMODEM_PACKET_HEADER]), txLength);
) r: j2 F% q6 f
4 [" B# y# ]* X" }% A- timeCount = 0;1 B$ B6 b* f# j9 j {" E% O
- errorCount = 0;4 q8 ]5 Q# l% Y _0 f
- dataCount = 1;; A1 O% v9 q- B+ P- a9 x e8 [* z
- code = CodeNone;5 J0 }$ N1 f! i( o, e! \$ B
- stage = StageEstablished;
, f) E0 y9 c3 w, H' l - txBuffer[0] = txLength > YMODEM_PACKET_SIZE ? CodeStx : CodeSoh;
; y* ^5 e- r5 M - txBuffer[1] = 0x01;
+ V& Q$ ?: [5 ?/ H4 p& S - txBuffer[2] = 0xFE;4 |% H; B. u4 x
- txBuffer[txLength + YMODEM_PACKET_OVERHEAD - 2] = (uint8_t)(crc >> 8);( W4 x8 D6 q. |) g1 p4 L
- txBuffer[txLength + YMODEM_PACKET_OVERHEAD - 1] = (uint8_t)(crc >> 0);6 |4 z2 g$ \( m& u# C9 e
- txLength = txLength + YMODEM_PACKET_OVERHEAD;
% n& I0 ^" g6 i) x1 y( p - 4 B( {+ }0 J- z/ ~/ q0 x
- break;
8 w7 s( ?& p! o; d" u* C5 j - }6 p1 M$ S% ]5 s
, X c# T" h1 }0 Y5 R! Y- case CodeEot:; }1 l+ i& X* K/ o) S' u E8 L1 ` e: N
- {
2 a% W- z; }/ a# f" b - timeCount = 0;/ Q; n6 ?. H; I% l
- errorCount = 0;
$ }& R* V6 u& p+ P3 d; { - dataCount = 2;
$ c& H6 b" p& ?8 k/ Z - code = CodeNone;
2 r. {' `# w( ?& Y4 f) e" U" x; } - stage = StageEstablished;- T9 f/ T; W; q8 f8 k9 \ M+ M
- txBuffer[0] = CodeEot;/ {- J, x- h$ n3 m
- txLength = 1;
$ K+ j: w8 z! X - write(txBuffer, txLength);4 a4 T* I% L T$ l, a
- 2 \; j; H0 I. q% ?% s7 y8 |
- break;5 \% S/ i- l: ^& g
- }
% L. I j4 x) D! r! j9 g - 0 f" l" r z' J
- default:
3 t+ |; {% H7 i - {
! `2 |8 Y7 Q0 L5 u' R - timeCount = 0;( y) R. k3 c2 [; T% q6 {- p& ^) e; H
- errorCount = 0;( u9 p9 s& D2 |8 |2 e0 ?: Q4 D
- dataCount = 0;
+ F+ u1 y0 S$ Y$ B2 I - code = CodeNone;
+ Y# D, w: A# S3 v3 ?! a4 c - stage = StageNone;" f" V" P0 P) p1 b% w2 ?) A k
- . ?$ C6 L m6 ]$ |6 G7 E5 ~
- for(txLength = 0; txLength < YMODEM_CODE_CAN_NUMBER; txLength++)
( {/ K) u" a( A% {4 `* E: d4 [2 t - {
' U$ u5 K" \- R5 S& v& d% _0 c' x: A - txBuffer[txLength] = CodeCan;0 A3 R: Z% m/ I# D, V
- }& X" D7 a5 m% }$ h! a
7 i6 A% a# s' Y' A. p- write(txBuffer, txLength);+ T% F; R8 A( N% H F( U. e) d
- }5 S/ B1 V( D- v8 F+ i
- }6 E0 a5 W3 p& a5 Y0 v$ k
9 g3 w8 V2 D2 K! k5 C9 E- break;# I/ Z+ k7 h7 I8 S( _; r
- }' B' r u% J6 g% L( N. n6 {4 |
$ W* _& l" j* }3 x- case CodeA1:
0 k5 p0 _# m) X6 h4 k$ P - case CodeA2:
! c# n& G; w$ V1 x5 p! b# j - case CodeCan:+ G2 I; Z) E4 \/ Q/ S
- {" a) q$ Q; A9 p- u w) N) J
- timeCount = 0;
) L. N: Q: H- ], e4 {. l5 P9 s% _ - errorCount = 0;1 _% |: g) M g* t4 H% g8 e! i7 w
- dataCount = 0;
9 R c2 l& o! t/ g2 r. \& W$ | - code = CodeNone;( ^, Q9 K5 l; k! i3 d& Y
- stage = StageNone;( @4 ^' L4 h% ]0 K3 {
- callback(StatusAbort, NULL, NULL);
$ g: ^2 c w, A! I8 j9 }2 w
; E0 f, _! g; s: g C- break;
$ X* ^9 E5 L" i% F( _ - }
* C& I% u& o! t. v* S
6 g8 K3 p g8 b- default:
+ f2 O9 ` G6 H5 i q+ @; j - {0 N# l" d' ?- r* F
- timeCount++;. L y! o; h$ n. W6 U
1 {. h' \4 L* r, Z) Y- if((timeCount / (timeDivide + 1)) > timeMax)
( d# x; ~& {% T! r/ U+ d - {
1 y% W3 ^1 `, } - timeCount = 0;- N# l7 X' S2 L% m. Z7 H
- errorCount = 0;8 F+ P' x* j* s1 y
- dataCount = 0;
, V/ ~6 G1 I3 O9 U8 V: c - code = CodeNone;" ]- B4 B. U# t# `0 A! p7 |, o
- stage = StageNone;
* k. N% Y% c# m7 P6 m
/ n! r$ e& t% w- W$ P- _- for(txLength = 0; txLength < YMODEM_CODE_CAN_NUMBER; txLength++)
* f2 P; e2 a" c. Y* O - {
1 @4 y2 U9 o9 s3 F5 z/ y - txBuffer[txLength] = CodeCan;
6 i* H. |5 r4 A+ B# A3 P! ~ - }
8 w! f6 W* l9 ]* r0 S* @0 R - 5 c% O6 _# H7 _
- write(txBuffer, txLength);: J* h' I& F. Y2 L* C
- callback(StatusError, NULL, NULL);
; ?0 G8 b' }& G2 m6 ^" E" ?9 { - }/ F9 _: M# d4 n, B) R& l" l) c. t
- else if((timeCount % (timeDivide + 1)) == 0)$ |6 M3 ~! H; o
- {: B: ~8 Z. U, T# L! D: Z, ?* D
- write(txBuffer, txLength);
4 z5 {+ H! S8 X; H" q - }5 I- T/ d1 O1 i1 H; o
- }
1 a! R: d6 l7 {( M/ w/ x* [4 ?) I# O - }! r2 l b7 J* A- r2 L; [9 I0 v
- }
) w+ W$ y4 `$ Y; f7 `; c - : x1 X7 U3 U0 ]+ A/ h# W; \
- /**) o8 V B5 q, j3 K5 v. e( d3 ?
- * @brief Transmit transmitting stage.
2 x [" L! O; c' d - * @param None.
1 l. K2 m; q5 d - * @return None.7 j, _) h0 `) ], }* E$ S- R3 X
- */8 O w$ ~2 }" M; ]: U# O
- void Ymodem::transmitStageTransmitting(). U/ l6 I; F5 z) Z5 N
- {
% Q3 I; ]" u5 ? - switch(receivePacket())& O( i* o N c- X" u
- {
2 p% d, a/ V- H - case CodeNak:! j e+ n* e( A4 h8 _+ V+ [. I
- {% V1 ]# @6 Z. V9 c5 t) i# t* V' m
- errorCount++;
; ~; `$ p. Z4 U) H - ; m' p* D0 s' S1 h7 ~! C" x8 S" g
- if(errorCount > errorMax)
. w/ }# C% _4 ^" C' Y j - {
7 D- }8 I2 }7 Z* r+ i# \0 } - timeCount = 0;% O' ]" u8 w: U |. D
- errorCount = 0;0 [& a* A6 ]& w& ?: R7 P0 @( q
- dataCount = 0;
& E) q5 W' P& I4 F' G1 }) E - code = CodeNone;
4 [4 E8 y6 K0 n& n7 t3 W3 @ - stage = StageNone;/ F' R9 K2 \7 |) ~/ Q! |5 K
/ f4 k' E0 U- J2 @- for(txLength = 0; txLength < YMODEM_CODE_CAN_NUMBER; txLength++)
2 Z" P0 h9 w, O. M7 F0 w( k - {
y- N9 D0 B) y7 ^ - txBuffer[txLength] = CodeCan;
& d3 B$ ?9 \7 V) D0 e - }
& }0 {; [) k2 V* l* ^* E! a- E
$ g$ e+ n" F0 w; z. h- write(txBuffer, txLength);
$ n! e! p7 z8 O J) u R - callback(StatusError, NULL, NULL);7 z6 l3 R& j: a! z G
- }4 m* N- y* l( t$ M
- else: C; I1 X/ x' s- X6 Q; x8 P3 f
- {
% n [' a C4 ^ i" ]: ~ - write(txBuffer, txLength);$ f; E0 m8 s* j N& M
- }
0 z( H- y n7 i/ T; D5 l! N* S# ` - - h' r6 F2 P- c- p
- break;- F2 q/ M8 g8 n0 ^' X
- }$ v& ^: a. Z& F, {+ M" ?' U
& U2 q( ~: R, K) ?5 h/ c6 ^- case CodeAck:
* M- ~0 n5 s& o& x& H9 M - {
- m" b$ }2 s, O {9 R - memset(&(txBuffer[YMODEM_PACKET_HEADER]), NULL, YMODEM_PACKET_1K_SIZE);
9 i, Y" c1 _2 i5 D6 G; y- L
2 W7 `1 n' V& Z- switch(callback(StatusTransmit, &(txBuffer[YMODEM_PACKET_HEADER]), &(txLength)))
# {( Z( o2 s( @ \0 s' w/ _ - {+ \9 B9 O/ q8 n- L- T
- case CodeAck:6 h; U$ l+ H) h0 T8 \/ b3 {( a# {4 V
- {" P. G. {) u. Z3 Q
- uint16_t crc = crc16(&(txBuffer[YMODEM_PACKET_HEADER]), txLength);) O; D) V7 O& C6 Y$ n9 a
1 ` k& \. Z# n% \9 z+ s- timeCount = 0;0 V! ~: @4 y% F% _1 s3 p
- errorCount = 0;
9 R$ v6 w9 G7 u/ |: }" ~ - dataCount = dataCount + 1;
% T: z( f8 R: p; ~ - code = CodeNone;" C5 k, q- ? y5 p
- stage = StageTransmitting; K c: q9 M6 g! V3 f
- txBuffer[0] = txLength > YMODEM_PACKET_SIZE ? CodeStx : CodeSoh;
, M. H+ p4 G3 A9 b2 S - txBuffer[1] = dataCount;" y* B7 ?& i, H. U$ P" [
- txBuffer[2] = 0xFF - dataCount;6 i. q# B( K6 @; j
- txBuffer[txLength + YMODEM_PACKET_OVERHEAD - 2] = (uint8_t)(crc >> 8);" U# Z' L, z- _5 d" @7 {3 e
- txBuffer[txLength + YMODEM_PACKET_OVERHEAD - 1] = (uint8_t)(crc >> 0);& c- r: n. K; k8 n6 `/ D
- txLength = txLength + YMODEM_PACKET_OVERHEAD;! c& s+ j: {5 \0 o7 c Z5 y7 M1 B
- write(txBuffer, txLength);
/ i( O' D& T+ n6 { a
; I9 Q9 s8 w6 S- break;
# N; s" O- W) I5 u - }; k4 ~* s3 v0 U$ C& R F6 B( d
8 A% C+ q0 l& _9 \; W, c" _6 b- case CodeEot:
: l" m$ q1 Q; `- u" [% D' n" r - {" F, q9 I5 _* [& D; x7 h
- timeCount = 0;
/ C/ C8 e5 _ _' g6 P1 t0 [ - errorCount = 0;
) d9 k3 E. m* k, E( g: [/ f) o - dataCount = 0;
. s5 n7 m4 C# w3 ?: Y - code = CodeNone;
; P+ d# ?: o. W - stage = StageFinishing;& ?& f) P$ ^! _7 x6 S3 d" \+ |
- txBuffer[0] = CodeEot;- _1 `- K* |9 P0 D; B' r
- txLength = 1;
1 E6 v6 Q+ ~. z0 H - write(txBuffer, txLength);
: r D7 c/ h( k4 z% w - 4 I7 H, h+ \) ?6 M S! ?
- break;
- h; R0 P6 M5 v8 T% g4 t5 i - }
/ p: g0 m% y$ `: P8 r# C; A% d - 3 @+ o$ m9 ?! s* v2 i) r
- default:
% \2 G( s+ b4 z+ y# V i - {
2 u9 b* l4 U( u; i4 ` - timeCount = 0;
0 ^3 X, n6 l+ P! L P2 i: V - errorCount = 0;: ~ p# E1 K ~. {+ J8 Q% r
- dataCount = 0;9 v. r, k/ x* d* n: C
- code = CodeNone;+ v. H2 ~' U: H) G1 x! |$ m
- stage = StageNone;
2 e; d5 D% v+ g - ! Q2 _6 F0 N* T$ H
- for(txLength = 0; txLength < YMODEM_CODE_CAN_NUMBER; txLength++)- F) L ^- W3 ?9 L9 K4 k
- {
! ]! w+ ~. D; | F5 r2 H. W - txBuffer[txLength] = CodeCan;
4 r" E g$ k3 Q& m& ^4 I) n9 m - }$ b6 Q3 u* u! s* M! H E" L
$ v* t8 [3 z; T5 w2 ~. z( u- write(txBuffer, txLength);9 Q9 H9 d6 z3 m; B% i
- }7 a) k: f& M% p4 y4 X
- }
5 K/ a) \ C2 a/ G" Z
6 g+ B+ v( C% n0 y, c* ?- break;
1 [" M5 S* {1 Z3 _2 f- k5 _ - }5 V4 h" F) V0 |5 E6 s3 Z$ x
- & p/ G5 e) q3 ~; `/ P
- case CodeA1:. o# A5 O+ Z) [, h
- case CodeA2:& ?9 K5 I' U! J. ?6 ]; g$ i
- case CodeCan:8 [6 P/ @0 L( V- s7 V: `
- { s9 C8 L1 k J8 o" ~; q* R0 G
- timeCount = 0;$ y% l( }9 X5 _( D8 ^1 _
- errorCount = 0;
% K5 @ ^, _/ G+ d3 |" v j - dataCount = 0;
1 h1 y' s& w3 w - code = CodeNone;
0 C( c1 \5 L X) ?+ f) N" K - stage = StageNone;
! g% l$ B/ V* ^6 ^2 l) G - callback(StatusAbort, NULL, NULL);! n/ G. Q- U. } l$ j4 F/ M* [
- 1 A% j5 q0 G6 B; l
- break;
4 Y/ V- ], [+ M - }
8 a5 b0 G) U& G. q- a$ W
6 Y( ]- h' \" t- default:" V B, d* O5 D1 u4 E- M
- {
, F: P: c3 C$ X A$ _, U - timeCount++;
. u# D" Q) g) A% s - 7 K$ o/ o5 b+ C" ?
- if((timeCount / (timeDivide + 1)) > timeMax)! {2 c" m" p0 d* E; w9 O7 N2 U
- {
! o# ^" U: u- _5 b - timeCount = 0;, M+ l- Q2 D: c- _7 J5 r, G: M
- errorCount = 0;
4 w5 c1 z3 I+ o - dataCount = 0;
/ k/ x& ?/ p/ K - code = CodeNone;8 F8 y% E/ B3 g/ k! {+ m B r6 f
- stage = StageNone;# S( B+ t' Z! S" a, O, S
. }7 x" m! ~$ o* ?2 g9 m( q% S: U d- for(txLength = 0; txLength < YMODEM_CODE_CAN_NUMBER; txLength++)( c7 L7 s$ Q0 t3 k
- {
; t9 q2 e/ L0 H0 g( O - txBuffer[txLength] = CodeCan;: n4 C/ y1 o1 C# k3 w/ L1 X
- }/ _1 E( C$ ?6 E+ A" \' p; Z1 ?
S' X) u; d) d+ e4 p+ x- write(txBuffer, txLength);3 P1 V. c; M) X% E7 y6 j1 |4 M! E
- callback(StatusError, NULL, NULL);2 |/ d& `$ D3 f
- }
( Z Q% c9 g# B8 \# A. h) ~$ A0 H' O - else if((timeCount % (timeDivide + 1)) == 0)
7 \( |4 _: U! B2 y$ w - {
; i4 n/ a u4 ?, B* _8 E - write(txBuffer, txLength);
: A2 _+ m: ?: i( H7 r - } v& o2 M! b+ Y' t; T0 O
- }6 ]- E% s! K9 {+ M& ^; j% f: ]
- }
% R6 t7 x3 Z. v - }: K0 R0 C: T9 L( t/ N, A
- ( u/ d0 D9 o: ?
- /**
: S) M- ^, e: M! R: O: { - * @brief Transmit finishing stage.
5 ?7 x' G8 m$ W+ m1 r: v - * @param None.$ W. M5 a/ ]3 t w0 f# T
- * @return None.$ S! e. \9 z8 w+ p5 Z- G" \
- */
/ v4 ~0 ^- |$ \# ] - void Ymodem::transmitStageFinishing()( p' B& ~; w8 [( ~9 W. V
- {
0 x' p7 d. ?5 }% Y* d7 w2 \8 Q# e - switch(receivePacket())
, |3 ? t a! U" V - {
. [3 z# }% t6 D5 m' U+ D |$ m - case CodeNak:
' m! \0 N+ _7 K% E* k - {
: D" s2 c- z" z6 h. e1 V - timeCount = 0;
2 Y _8 y) V( y* P) J - errorCount = 0;; v% G; Z8 s- M! y8 b+ M/ X
- dataCount = 0;
/ D, V5 O* I6 V: @5 R) V2 A& k5 C* k - code = CodeNone;
4 ^) F6 E& d) D) `7 k6 ^2 M - stage = StageFinishing;
) Y4 f2 ^) k: q( I9 O - txBuffer[0] = CodeEot;
# m. F5 y9 e+ h. R% F - txLength = 1;
U" ?- E7 N1 T7 V6 i - write(txBuffer, txLength);
2 k, x6 }6 @4 j' g2 ^ - ) s7 l, c( W1 I; k% @* S2 L
- break;6 \; }5 h8 P* ?" O9 ^; v
- }
: u; a5 |( F5 f - 5 m# x& B$ Y# M3 F4 ^
- case CodeC:) k R$ E4 g1 ^: W
- {- Y' U$ L& D8 ^! ~' Y5 b6 Q7 m
- memset(&(txBuffer[YMODEM_PACKET_HEADER]), NULL, YMODEM_PACKET_SIZE);: F7 J/ o# N0 c. x" {
- uint16_t crc = crc16(&(txBuffer[YMODEM_PACKET_HEADER]), YMODEM_PACKET_SIZE);
$ m: ?# Q/ \8 c: F& \$ t
0 l) q& K! C: V) k4 y$ e7 p- timeCount = 0;
% m* g- z( F9 z: F+ A - errorCount = 0;3 f3 L+ D6 z8 ~( J
- dataCount = 0;' S/ o w! B$ C& [/ v
- code = CodeNone;
/ C1 l- j+ e# t. y+ j7 L - stage = StageFinished;% r' M: l% B+ ]: I/ M
- txBuffer[0] = CodeSoh;
& Y, x4 ]$ e b: G- j - txBuffer[1] = 0x00;8 g0 X* K* v6 z; v7 _4 v8 }* d
- txBuffer[2] = 0xFF;+ b5 W) f, j. b. q! ]- g
- txBuffer[YMODEM_PACKET_SIZE + YMODEM_PACKET_OVERHEAD - 2] = (uint8_t)(crc >> 8);/ r. s" F' ?9 c5 M( x9 _6 @
- txBuffer[YMODEM_PACKET_SIZE + YMODEM_PACKET_OVERHEAD - 1] = (uint8_t)(crc >> 0);
4 ]: m$ H( T: V. u& A& q. s a - txLength = YMODEM_PACKET_SIZE + YMODEM_PACKET_OVERHEAD;
: G- _9 @3 b3 X- M - write(txBuffer, txLength);; g5 ?' l9 r1 _$ Y' ^1 H [
4 a9 ^( T& z! x+ ^7 c) J$ h- break;5 x" ^1 s, L. A' h
- }
4 H/ D; b1 l" L/ U - : t# z% x$ C, e. z; O: c6 \
- case CodeA1:! ^9 k) s* J/ @- l+ n1 s
- case CodeA2:
; B7 q. ?6 o' O) z0 {- l - case CodeCan:9 ^, U! A& O( V
- {& @1 U" U) \* X( a7 Y) I: g
- timeCount = 0;. b5 {) n+ y d- \
- errorCount = 0;
, F k6 s% k' i) d1 \ - dataCount = 0;" \! @ d: G9 ?
- code = CodeNone;3 [. R2 L' H/ @$ J
- stage = StageNone;
' h0 N* X# v! W. r) L - callback(StatusAbort, NULL, NULL);) j, R1 @4 x. K6 F2 m
- ) g; F( C% g+ v5 S
- break;
( A- T7 n! S4 x" i - }1 N- |, u# p/ k
- 8 ~0 J( S! X4 a, \/ m5 m
- default:/ f6 X( I6 N) N* Z0 a0 ]
- {
/ g9 [4 r" H% { x2 @, M% x- G$ r - timeCount++;
' Q8 R3 s! e/ c5 I
, r2 S( g0 T% |- if((timeCount / (timeDivide + 1)) > timeMax)
$ P) Q6 d& M+ g7 ` - {) ?. j$ q: ?3 T- X; \- G1 m
- timeCount = 0;
. X; K/ w7 b, W# b1 J0 C% w8 J - errorCount = 0;- K+ G4 s! o2 B6 L- x
- dataCount = 0;! I' R2 H7 G8 k$ f. x
- code = CodeNone; u; Z* b& [& n% |$ }
- stage = StageNone;" T1 L2 W' ~( v& ]% O
- 5 ?" V! g+ f- ~5 E1 f s9 E
- for(txLength = 0; txLength < YMODEM_CODE_CAN_NUMBER; txLength++)
& ^/ A; W$ k) o! ? - {
& f' A7 p5 O, {- J4 z- B - txBuffer[txLength] = CodeCan;
% u' A' u3 K7 M9 Z. b - }
- G( r% ^% R) |4 a - * B& [( |/ G/ N" \
- write(txBuffer, txLength);
3 l- R$ S' y A2 e# F. V: H - callback(StatusError, NULL, NULL);
; R8 o. k7 C' e! t - }, q% K0 g7 D! k% _
- else if((timeCount % (timeDivide + 1)) == 0)& b: l* n; G4 t- I, j
- {
6 v# W, h% Z9 C* D# N! C - write(txBuffer, txLength);
8 _) y1 M3 g% Z0 A - }
# N# |& J% a3 h% M0 I- o - }
! `9 [/ g' o3 X+ h! s - }/ l2 G1 y5 C8 |# }
- }4 I6 I) v$ q$ n- u1 Z- n0 g
4 O& w% i& W: j) ^ F- /**
0 i/ H% r; G# y! B - * @brief Transmit finished stage.6 h$ K, c3 @' f( B7 X! A" t
- * @param None.
+ `3 V5 F2 W1 x% |; i+ ?# c - * @return None.: T4 [9 G T" U; L: E) L7 N" ^+ A7 z! F
- */
( a5 K- a& A+ q - void Ymodem::transmitStageFinished()0 y7 G3 p) {0 N; P0 ^2 x
- {) h7 P: s% q. l: x7 f" T
- switch(receivePacket())
* G% S: G) Q( n" n - {2 M, M. c9 R" V0 A7 D
- case CodeC:, ]- s$ p5 ]( K+ W5 a
- case CodeNak:
5 w( M" E# M- v! }# Y% P - {
7 k, g2 A6 L: L* e - errorCount++;7 a. u/ k5 t, c
5 E* |- ~; |$ W! I C# V- if(errorCount > errorMax)+ {: ^0 Z- ^ Q, b. i& f4 l
- {
2 \0 t! p3 s W - timeCount = 0;
! U& |. m7 I7 v - errorCount = 0;
: @, q4 ? M2 H j - dataCount = 0;
1 |* O9 N& e3 \3 G" M, s* { - code = CodeNone;
9 C; i: I8 @& u% S6 u - stage = StageNone;
2 d# l% {; s; n Y6 ]3 ] - 0 |% L5 l2 r8 N/ m2 t
- for(txLength = 0; txLength < YMODEM_CODE_CAN_NUMBER; txLength++)
. [# s6 b# j8 Q& \ - {* E/ D: C3 l; e+ b
- txBuffer[txLength] = CodeCan;; i" j. w7 n5 r
- }
. O6 {( m+ ]4 }2 ~
; H9 A4 Y8 N0 E- _- write(txBuffer, txLength);5 Z$ I: N4 u9 o
- callback(StatusError, NULL, NULL);! f' ~+ d) M0 D# k: W
- }3 e1 I2 N- K; J. e3 ]9 i) `
- else+ o, i" y0 v9 q" X1 m, @5 F
- {
) K* o8 ~. b& c$ I" L% T - write(txBuffer, txLength);
C- k( c+ A3 |' ~6 g - }: T$ M8 t& i+ v, N
- % k/ L% T8 v- r! Z, m7 M9 g$ F0 p/ [
- break;
* }8 y" z# l) o7 g% F7 ]( L6 P - }6 ]% p2 c6 G0 C5 o4 p. M" s4 T
- a' [* s" e' Z5 P0 q. n& ]7 \- case CodeAck:
# ]5 @ P9 Z2 A8 L! y$ t; p - {
5 ]% ?: I+ z& X! J! F6 {: o - timeCount = 0;6 c. c# ]/ \3 ?7 R+ l1 d
- errorCount = 0;- q$ |2 N' y: s* Y& K u
- dataCount = 0;
1 j$ d. Z; Y1 u - code = CodeNone;
5 D, r5 q+ _) k5 X - stage = StageNone;
. s, o) s% b. k( v% A3 s - callback(StatusFinish, NULL, NULL);7 D6 k) {- x6 k* o0 v3 M+ t% I
5 [/ l8 @' M& ]" @2 u& j- break;
9 H+ Z4 q- T) F5 W3 z/ Q - }" ]' W4 k5 e) r0 `
9 s; m) x% V4 C8 T% H- case CodeA1:. ?2 C- _& @- R/ C) M
- case CodeA2: R* F1 Y6 c- c
- case CodeCan:3 O( V. w$ P- F8 O5 H& @- I* |3 ?
- {$ J3 O0 Q/ t' ^. J6 Q) e3 d5 Y
- timeCount = 0;
# w6 l+ V% X+ Y0 l' [. q+ ^8 y6 w - errorCount = 0;$ z' z3 L$ c8 _
- dataCount = 0;
' g3 P3 N G% m- X9 ?7 O9 m - code = CodeNone;
; N! g; o% t3 y& }7 a) k* d6 N - stage = StageNone;
8 C% F- P1 ^% M: k* t - callback(StatusAbort, NULL, NULL);, [# P, _( S' U& N! G
, ?& v$ o1 T1 ], \- break;
4 V" A3 E9 F( S, U1 \" [) p - }- z. P: h8 c. `3 t; y. L9 q
- / f8 ]+ x5 l9 y7 Q3 Z
- default:# c$ X7 R; ^7 o2 |+ I
- {
d7 l$ u# v1 L' b - timeCount++;
$ h& f4 [# Q# ^# _; B8 F$ N - 1 O: B4 @& \0 Y5 o2 C* c- v) Z
- if((timeCount / (timeDivide + 1)) > timeMax), H+ h% x9 w+ P! u1 m
- {
0 D, n, Z4 g9 ?; i- N2 \ - timeCount = 0;4 o1 _5 O+ a) }0 p2 \
- errorCount = 0;8 y' W+ q; J) b
- dataCount = 0;& Q& V% l f6 a9 x" X9 {* `
- code = CodeNone;
/ f# h0 x1 d1 j% Y" J4 I - stage = StageNone;+ s! a4 d3 {' g1 }. Q& D
- * @; m* H! ]1 d/ A
- for(txLength = 0; txLength < YMODEM_CODE_CAN_NUMBER; txLength++)8 z# l& a7 R _3 E- z
- {6 u- c: b" T# Z/ v
- txBuffer[txLength] = CodeCan;/ @- l. y. p; r' n4 n6 d k
- }
: G+ e- s+ t/ Z6 I. k - 7 a" t0 g0 n1 l, [* v
- write(txBuffer, txLength);( o- M3 ]+ P! ~: t% H
- callback(StatusError, NULL, NULL);6 S# G# r( [- r6 Y* ]' W6 E
- }
! b1 _7 m- q: [; R& l( x& T - else if((timeCount % (timeDivide + 1)) == 0)
# h9 Z$ m' d0 ~4 J/ e+ M+ o - {
' J. D% d8 f+ G- O - write(txBuffer, txLength);/ Q ?7 V& I/ b; D- [2 i: s8 n
- }1 X! l, q: I0 C- j
- }
- |; @: H8 z( H! u7 z2 Q, b - }: |) i3 ^9 e% f6 `) _
- }
/ `0 x9 A6 y1 t' ?; ?1 J - + {( Z% }4 M+ c" l
- /**
% A& ]7 D: d/ |' t - * @brief Calculate CRC16 checksum.7 G1 H0 q5 B# V1 v- P) D" R* u
- * @param [in] buff: The data to be calculated.+ `" f# n5 p+ v0 p+ ?& r1 g
- * @param [in] len: The length of the data to be calculated.( u1 c0 }( R4 c/ Q' O7 L4 r
- * @return Calculated CRC16 checksum., T9 M! f v- i/ S3 t k4 H
- */
6 ?) ^. Z7 |# O. V: U: w7 P. s9 D - uint16_t Ymodem::crc16(uint8_t *buff, uint32_t len): D, D7 N+ a# ^( `
- {- ?+ y$ _8 ]) r( X6 G% Y
- uint16_t crc = 0;
/ p8 a! K+ L3 A K - 1 E- \" W/ Z+ Q- F+ @1 s" H
- while(len--)
* ]6 r4 W8 |2 K3 o - {
: T! \3 q5 w" V- f% W: b+ U - crc ^= (uint16_t)(*(buff++)) << 8;
+ l' i* s C1 I5 y
. Q; F5 h }4 r J5 |: g4 [- for(int i = 0; i < 8; i++)) A4 U- l3 u7 P/ y0 m: y' \* X. u
- {
+ H X+ k6 F+ h5 @" ~2 I - if(crc & 0x8000)
. `- ^& O* {2 F. w) s. @4 X+ O - {- M$ s. S A+ b+ b
- crc = (crc << 1) ^ 0x1021;
% ?( |& [5 G5 K p - }) ~, M( c' ~2 {& R
- else
f) Y" x5 u2 I - {% t% l4 h- D6 [% ]( A" f1 Z
- crc = crc << 1;4 X7 k2 p$ t ?8 n& s1 C
- }# b9 Y+ l6 l U
- }
2 X, R0 Q( ]2 q8 V2 ]3 J3 e0 Z - }- v+ ?8 f0 A4 G7 C! o& L8 g; W" H2 {
- C" F, [+ k' B' ~% T; u
- return crc;6 |0 A3 H/ s+ {% v" p+ C C- i
- }
X! t) s, K1 r+ [# z
复制代码
; X: [5 a' B8 @; t, A. E* Z
B- U: S- Q s; u3 \
5 Q$ o! c p V# `* v3 v$ |$ n4 `4 n- R( ^
1 j, @: R& N2 V" f
|
YmodemFileReceive.cpp文件* g1 ~% n' n1 _" O% q6 u
. h0 l w) k9 j. x, V* k+ z
; m8 N# }! x9 ?# m
YmodemFileTransmit.cpp文件% {# T. B9 _& N$ T9 J) S
Y a) [: ]3 c* w4 A m* v
1 |& X4 b9 {! k& h: s: n1 p
7 X5 o, u t* s2 K
widget.h文件
widget.cpp文件
X, {% l6 A/ f; E3 Y+ L
SerialPortYmodem.pro文件
SerialPortYmodem.ico文件% @1 e- H- Y$ A ^+ @% [) R
$ [$ P* e) O3 y( l; h5 U
3,运行效果# e2 C" |/ e0 Q. ?( T5 s
0 V! `1 T# X* z7 ]$ r. c# B
可以移植到单片机上,文件的接收和发送都支持。