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