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