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