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