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