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