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