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