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