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