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