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