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