打印
[技术问答]

求新唐M4 Xmodem例程

[复制链接]
3708|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qwe12377yu|  楼主 | 2017-5-18 16:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
哪个大神有新唐的M0或者M4的Xmodem协议例程,当然最好有完整的串口升级例程,那就棒棒哒了
沙发
zhuomuniao110| | 2017-5-18 16:52 | 只看该作者
XModem协议介绍:
XModem是一种在串口通信中广泛使用的异步文件传输协议,分为XModem和1k-XModem协议两种,前者使用128字节的数据块,后者使用1024字节即1k字节的数据块。




一、XModem校验和协议


1. XModem信息包格式
XModem协议最早由Ward Christensen在20世纪70年代提出并实现的,传输数据单位为信息包,信息包格式如下:
---------------------------------------------------------------------------
|     Byte1     |    Byte2    |     Byte3      |Byte4~Byte131|  Byte132   |
|-------------------------------------------------------------------------|
|Start Of Header|Packet Number|~(Packet Number)| Packet Data |  Check Sum |
---------------------------------------------------------------------------


2. 校验和的计算
所有的数据字节都将参与和运算,由于校验和只占一个字节,如果累加的和超过255将从零开始继续累加。


3. 字段定义
<SOH> 01H
<EOT> 04H
<ACK> 06H
<NAK> 15H
<CAN> 18H


4. 校验和方式的XModem传输流程
传输流程如图所示:
------------------------------------------------------------------------------
|               SENDER                |          |          RECIEVER         |
|                                     |  <---    |  NAK                      |
|                                     |          |  Time out after 3 second  |
|                                     |  <---    |  NAK                      |
| SOH|0x01|0xFE|Data[0~127]|CheckSum| |  --->    |                           |
|                                     |  <---    |  ACK                      |
| SOH|0x02|0xFD|Data[0~127]|CheckSum| |  --->    |                           |
|                                     |  <---    |  NAK                      |
| SOH|0x02|0xFD|Data[0~127]|CheckSum| |  --->    |                           |
|                                     |  <---    |  ACK                      |
| SOH|0x03|0xFC|Data[0~127]|CheckSum| |  --->    |                           |
|                                     |  <---    |  ACK                      |
| .                                   |          |  .                        |
| .                                   |          |  .                        |
| .                                   |          |  .                        |
|                                     |  <---    |  ACK                      |
| EOT                                 |  --->    |                           |
|                                     |  <---    |  ACK                      |
------------------------------------------------------------------------------
对于发送方仅仅支持校验和的传输方式,接收方应首先发送NAK信号来发起传输,如果发送方没有数据发送过来,需要超时等待3秒之后再发起NAK信号来进行数据传输。对于数据传输正确,接收方需要发送ACK信号来进行确认,如果数据传输有误,则发送NAK信号,发送方在接收到NAK信号之后需要重新发起该次数据传输,如果数据已近传输完成,发送方需要发送EOT信号,来结束数据传输。


5. 如何取消数据传输
当接收方发送CAN表示无条件结束本次传输过程,发送方收到CAN后,无需发送EOT来确认,直接停止数据的发送。




二、XModem-CRC16协议


1. XModem-CRC16信息包格式
XModem协议在90年代做过一次修改,将132字节处的校验和改成双字节的CRC16校验,CRC16校验的信息包格式如下:
------------------------------------------------------------------------------
|     Byte1     |    Byte2    |     Byte3      |Byte4~Byte131|Byte132~Byte133|
|----------------------------------------------------------------------------|
|Start Of Header|Packet Number|~(Packet Number)| Packet Data |   16Bit CRC   |
------------------------------------------------------------------------------

使用特权

评论回复
板凳
zhuomuniao110| | 2017-5-18 16:53 | 只看该作者
Xmodem协议是一种使用拨号调制解调器的个人计算机通信中广泛使用的异步文件运输协议。这种协议以128字节块的形式传输数据,并且每个块都使用一个校验和过程来进行错误检测。如果接收方关于一个块的校验和与它在发送方的校验和相同时,接收方就向发送方发送一个认可字节。然而,这种对每个块都进行认可的策略将导致低性能,特别是具有很长传播延迟的卫星连接的情况时,问题更加严重。
    使用循环冗余校验的与Xmodem相应的一种协议称为Xmodem-CRC。还有一种是Xmodem-1K,它以1024字节一块来传输数据。Zmodem是最有效的一个Xmodem版本,它不需要对每个块都进行认可。事实上,它只是简单地要求对损坏的块进行重发。Zmodem对按块收费的分组交换网络是非常有用的。不需要认可回送分组在很大程度上减少了通信量。
    Ymodem也是一种Xmodem的实现。它包括Xmodem-1K的所有特征,另外在一次单一会话期间为发送一组文件,增加了批处理文件传输模式。

    Xmodem协议相关控制字符:
    SOH             0x01
    STX             0x02
    EOT             0x04
    ACK             0x06
    NAK             0x15
    CAN             0x18
    CTRLZ           0x1A
    标准Xmodem协议帧格式(每个数据包含有128字节数据)
______________________________________________________________
|     |            |                   |          |            |
| SOH | 信息包序号 |  信息包序号的补码 | 数据区段 |  校验和    |
|_____|____________|___________________|__________|____________|
    1k-Xmodem帧格式(每个数据包含有1024字节数据)
______________________________________________________________
|     |            |                   |          |            |
| STX | 信息包序号 |  信息包序号的补码 | 数据区段 |  校验和    |
|_____|____________|___________________|__________|____________|

说明:
  SOH: 帧的开头字节,代表信息包中的第一个字节;
  信息包序号: 对 256 取模所得到当前包号,第一个信息包的序号为 1 ,而信息包序号范围 0~255;
  信息包序号的补码: 当前信息包号的补码;
  数据区段: 数据区段的长度固定为 128 字节;
    校验和: 1字节的算术校验和,只对数据区段计算后对 256 取模而得。

数据包说明
    对于标准Xmodem协议来说,如果传送的文件不是128的整数倍,那么最后一个数据包的有效内容肯定小于帧长,不足的部分需要用CTRL-Z(0x1A)来填充。如果传送的是bootloader工程生成的.bin文件,mcu收到后遇到0x1A字符会怎么处理?其实如果传送的是文本文件,那么接收方对于接收的内容是很容易识别的,因为CTRL-Z不是前128个ascii码,不是通用可见字符,如果是二进制文件,mcu其实也不会把它当作代码来执行。哪怕是excel文件等,由于其内部会有些结构表示各个字段长度等,所以不会读取多余的填充字符。对于1k-Xmodem,同上理。
启动传输
    传输由接收方启动,方法是向发送方发送"C"或者NAK(这里提到的NAK是用来启动传输的,它也可用来对数据产生重传的机制)。接收方发送NAK信号表示接收方打算用累加和校验;发送字符"C"则表示接收方想打算使用CRC校验。
传输过程
    当接收方发送的第一个"C"或者NAK到达发送方,发送方认为可以发送第一个数据包,传输已经启动。发送方接着应该将数据以每次128字节的数据加上包头,包号,包号补码,末尾加上校验和,打包成帧格式传送。
    发送方发了第一包后就等待接收方的确认字节ACK,收到接收方传来的ACK确认,就认为数据包被接收方正确接收,并且接收方要求发送方继续发送下一个包;如果发送方收到接收方传来的NAK(这里,NAK用来告诉发送方重传,不是用来启动传输)字节,则表示接收方请求重发刚才的数据包;如果发送方收到接收方传来的CAN字节,则表示接收方请求无条件停止传输。
结束传输
    如果发送方正常传输完全部数据,需要结束传输,正常结束需要发送方发送EOT 字节通知接收方。接收方回以ACK进行确认。当然接收方也可强制停止传输,当接收方发送CAN 字节给发送方,表示接收方想无条件停止传输,发送方收到CAN后,不需要再发送 EOT确认。
特殊处理
    虽然数据包是以 SOH 来标志一个信息包的起始的,但在 SOH 位置上如果出现EOT则表示数据传输结束,再也没有数据传过来。接收方首先应确认数据包序号的完整性,通过对数据包序号取补,然后和数据包序号的补码异或,结果为0表示正确,结果不为0则发送NAK请求重传。
    接收方确认数据包序号正确后,然后检查是否期望的序号。如果不是期望得到的数据包序号,说明发生严重错误,应该发送一个 CAN 来中止传输。如果接收到的数据包的包序号和前一包相同,那么m收方会忽略这个重复包,向发送方发出 ACK ,准备接收下一个包。
    接收方确认了信息包序号的完整性和是正确期望的后,只对 128 字节的数据区段进行算术和校验,结果与帧中最后一个字节(算术校验和)比较,相同发送 ACK,不同发送 NAK。

使用特权

评论回复
地板
zhuomuniao110| | 2017-5-18 16:55 | 只看该作者
没有找到直接能用的,网上51了,430了,相关的代码都有,你可以找个靠谱的修改一下,移植。

使用特权

评论回复
5
qwe12377yu|  楼主 | 2017-5-18 17:12 | 只看该作者
zhuomuniao110 发表于 2017-5-18 16:55
没有找到直接能用的,网上51了,430了,相关的代码都有,你可以找个靠谱的修改一下,移植。 ...

写的太复杂了,都是其他线的,希望能有个新唐的参照啊

使用特权

评论回复
6
qwe12377yu|  楼主 | 2017-5-18 17:13 | 只看该作者
zhuomuniao110 发表于 2017-5-18 16:55
没有找到直接能用的,网上51了,430了,相关的代码都有,你可以找个靠谱的修改一下,移植。 ...

这些资料都看过了,谢谢,现在就希望能有个新唐的Dome学习哈

使用特权

评论回复
7
dongnanxibei| | 2017-5-18 17:39 | 只看该作者
8
dongnanxibei| | 2017-5-18 17:39 | 只看该作者
下载站的这个,楼主看看能用不

使用特权

评论回复
9
qwe12377yu|  楼主 | 2017-5-18 17:45 | 只看该作者
dongnanxibei 发表于 2017-5-18 17:39
下载站的这个,楼主看看能用不

谢谢层主,这个我之前已经下载了,就是个坑,里面就一个协议的说明

使用特权

评论回复
10
dongnanxibei| | 2017-5-18 17:54 | 只看该作者
qwe12377yu 发表于 2017-5-18 17:45
谢谢层主,这个我之前已经下载了,就是个坑,里面就一个协议的说明

你想要他里面那个单片机的例程是吗?

使用特权

评论回复
11
qwe12377yu|  楼主 | 2017-5-18 17:57 | 只看该作者
dongnanxibei 发表于 2017-5-18 17:54
你想要他里面那个单片机的例程是吗?

是的咧

使用特权

评论回复
12
qwe12377yu|  楼主 | 2017-5-18 18:00 | 只看该作者
dongnanxibei 发表于 2017-5-18 17:54
你想要他里面那个单片机的例程是吗?

其实我想要的很简单,就是通过Xmodem协议接收一个文件

使用特权

评论回复
13
qwe12377yu|  楼主 | 2017-5-18 18:01 | 只看该作者
dongnanxibei 发表于 2017-5-18 17:54
你想要他里面那个单片机的例程是吗?

其实我想要的很简单,就是通过Xmodem协议接收一个文件

使用特权

评论回复
14
dongnanxibei| | 2017-5-18 19:17 | 只看该作者
用UART做文件传输,采用Xmodem 协议.rar (822.67 KB)



使用特权

评论回复
15
dongnanxibei| | 2017-5-18 19:17 | 只看该作者

/* ========================================================================= */
/* The information contained herein is the exclusive property of             */
/* Sunplus Technology Co. And shall not be distributed, reproduced,          */
/* or disclosed in whole in part without prior written permission.           */
/*             (C) COPYRIGHT 2004 SUNPLUS TECHNOLOGY CO.                     */
/*                    ALL RIGHTS RESERVED                                    */
/* The entire notice above must be reproduced on all authorized copies.      */
/* ========================================================================= */
/*                                                                                                                                                          */
/* ========================================================================= */
/* Project Name  : AN_SPMC75_0109                                                                             */
/* File Name     : Xmodem.c                                                                                                          */
/* Description   : XmodemЭ�����������                                                                         */
/*                                                                                                      */
/* Processor     : SPMC75F2413A                                                                                             */
/* Tools             : u'nSP IDE tools v1.18.1A or later version                                 */
/* ========================================================================= */
/* Revision                                                                                                                                         */
/* ========================================================================= */
/* Version       :  1.00                                                                                                            */
/* Date                         :        2005.9.2                                                                                                 */
/* Modified by   :        ����������ļ�ͷ�����µ�ͷ�ļ�                                                         */
/* Description         :                                                                                                                     */
/* ========================================================================= */

#include        "AN_SPMC75_0109.H"
/* ----------------------------------------------------------------------------------------
Xmodem transmit in 16-Bit CRC mode ,receiving buffer define:
   +--------------------------------------------------------------------------------------+
   |           Byte0          |                 Byte1    |           Byte2            |  Byte 3--130  |  Byte 131--132  |
   +--------------------------------------------------------------------------------------+
   | Start of header | Packet Number | ~(Packet Number) |  Packet Data  | CRC Hi | CRC Lo |
   +--------------------------------------------------------------------------------------+ */
/* ----------------------------------------------------------------------------------------
Xmodem transmit in Check Sum mode ,receiving buffer define:
   +-------------------------------------------------------------------------------------------+
   |           Byte0          |                 Byte1    |           Byte2            |  Byte 3--130  |  Byte 131 | Byte 132 |
   +-------------------------------------------------------------------------------------------+
   | Start of header | Packet Number | ~(Packet Number) |  Packet Data  | CheckSum  |         NOP    |
   +-------------------------------------------------------------------------------------------+ */
UInt8         rxdbuf[133] = {0};
// --------------------------------------------------------------- //
TYPESTATUS                xmodemstatus;
static UInt8        *rxdptr = rxdbuf;
static UInt16         XmodemTimeOut;
//===========================================================================
extern UInt16 Calc_CRC16(UInt8 *cptr, Int16 count);
extern UInt16 Calc_Cksum(UInt8 *cptr, Int16 count);
/*
//=============================================================
// ----Function: Calc_CRC16A();
// ------Syntax: UInt16 Calc_CRC16A(UInt8 *cptr, Int16 count)
// -Description: CRC 16 calculate
// -------Notes:
// --parameters: cptr: data Cursor                count: data length
// -----returns: CRC16
//=============================================================
static UInt16 Calc_CRC16A(UInt8 *cptr, Int16 count)
{
        UInt16 crc = 0,i;

        while(--count >= 0)
        {
                crc = crc ^ (UInt16)(*cptr++) << 8;
                for(i=0;i<8;i++)
                {
                        if(crc & 0x8000)        crc = crc << 1 ^ 0x1021;
                        else        crc = crc << 1;
                }
        }
        return(crc);
}*/
/*
//=============================================================
// ----Function: Calc_Cksum();
// ------Syntax: UInt16 Calc_Cksum(UInt8 *cptr, Int16 count);
// -Description: Check sum calculate
// -------Notes:
// --parameters: cptr: data Cursor                count: data length
// -----returns: Checksum
//=============================================================
static UInt16 Calc_Cksum(UInt8 *cptr, Int16 count)
{
        UInt16 sum = 0,i;
        for(i=0;i<count;i++,cptr++)        sum += *cptr;
        return(sum&0xff);
}*/
//=============================================================
// ----Function: Spmc75_XmodemPurge();
// ------Syntax: void Spmc75_XmodemPurge(void);
// -Description: Purge
// -------Notes: Wait 1 second
// --parameters: none
// -----returns: none
//=============================================================
static void Spmc75_XmodemPurge(void)
{
        UInt8 flush;
        xmodemstatus.B._timeout = FALSE;
        XmodemTimeOut = TIMEOUT_1S;                // 1 second timeout
        P_CMT_Start->B.ST0 = 1;
        P_UART_Ctrl->W         = CW_UART_RXEN|CW_UART_TXEN;
        while(!xmodemstatus.B._timeout) // read uart until done
        {       
                flush = P_UART_Data->W;
        }
        P_UART_Ctrl->W = CW_UART_RXIE|CW_UART_RXEN|CW_UART_TXEN;
        P_CMT_Start->B.ST0 = 0;                        // disable timer/counter
}

//=============================================================
// ----Function: Spmc75_XmodemRecvwait();
// ------Syntax: void Spmc75_XmodemRecvwait(void);
// -Description: Recv wait buffer full or time out
// -------Notes:
// --parameters: none
// -----returns: none
//=============================================================
static void Spmc75_XmodemRecvwait(void)
{
        xmodemstatus.B._timeout = FALSE;         // set in timer counter 0 overflow interrupt routine
        XmodemTimeOut = TIMEOUT_1S;                        // 1 second timeout
        P_CMT_Start->B.ST0 = 1;
        while(!xmodemstatus.B._bufmark && !xmodemstatus.B._timeout);
                                                                                // turn off timer - no more time outs needed
        P_CMT_Start->B.ST0 = 0;                         // disable timer/counter 1 clock
}

//=============================================================
// ----Function: Spmc75_XmodemRespond();
// ------Syntax: void Spmc75_XmodemRespond(UInt8 packet)
// -Description: Respond
// -------Notes:
// --parameters: packet: packet status
// -----returns: none
//=============================================================
static void Spmc75_XmodemRespond(UInt8 packet)
{
        // clear buffer flag here ... when acking or nacking sender may respond
        // very quickly.
        xmodemstatus.B._bufmark = EMPTY;
        xmodemstatus.B._recverr = FALSE;                 // framing and over run detection
        if((packet == GOOD) || (packet == DUP) || (packet == END))
        {
                while(P_UART_Status->B.BY);                 // wait till transmit register is empty
                P_UART_Data->W = ACK;                                 // now for the next packet
        }
        else
        {
                while(P_UART_Status->B.BY);                        // wait till transmit register is empty
                Spmc75_XmodemPurge();                                 // let transmitter empty its buffer
                P_UART_Data->W = NAK;                                 // tell sender error
        }
}

//=============================================================
// ----Function: Spmc75_XmodemSendc();
// ------Syntax: void Spmc75_XmodemSendc(void);
// -Description: Send 'C'/NAK for request host transmitter
// -------Notes: 'C'->(wait 3s)->NAK->(wait 3s)->'C'->.....
// --parameters: none
// -----returns: none
//=============================================================
static void Spmc75_XmodemSendc(void)
{
        XmodemTimeOut = TIMEOUT_3S;                        // 3 second timeout
        xmodemstatus.B._bufmark = EMPTY;
        xmodemstatus.B._recverr = FALSE;        // checked in Spmc75_ValidatePacket for framing or overruns
                                                                                // send character 'C'/NAK until we get a packet from the sender
        while(!xmodemstatus.B._bufmark)
        {
                xmodemstatus.B._timeout = FALSE;
                xmodemstatus.B._recvmod = 1;        // tell sender CRC mode
                while(P_UART_Status->B.BY);         // wait till Data register is empty
                P_UART_Data->W = CRCCHR;                 // signal transmitter that I'm ready in CRC mode ... 128 byte packets
                P_CMT_Start->B.ST0 = 1;                 // Allow CMT0 timer start timing
                                                                                // wait for timeout or recv buffer to fill
                while(!xmodemstatus.B._timeout && !xmodemstatus.B._bufmark);
                P_CMT_Start->B.ST0 = 0;                 // disable timer/counter 1 clock
               
                if(xmodemstatus.B._timeout)         // start wait loop again
                {
                        xmodemstatus.B._timeout = FALSE;
                        xmodemstatus.B._recvmod = 0;// tell sender Checksum mode
                        while(P_UART_Status->B.BY); // wait till Data register is empty
                        P_UART_Data->W = NAK;                // signal transmitter that I'm ready in Checksum mode ... 128 byte packets
                        P_CMT_Start->B.ST0 = 1;                // Allow CMT0 timer start timing
                        while(!xmodemstatus.B._timeout && !xmodemstatus.B._bufmark);
                        P_CMT_Start->B.ST0 = 0;                // disable timer/counter clock
                }
        }
}

//=============================================================
// ----Function: Spmc75_ValidatePacket();
// ------Syntax: UInt8 Spmc75_ValidatePacket(UInt8 *bufptr);
// -Description: Validate Packet status.
// -------Notes: Validate Packet is OK will apply 'break' Interrupt
// --parameters: bufptr: should Validate Packet data Cursor
// -----returns: result
//=============================================================
static UInt8 Spmc75_ValidatePacket(UInt8 *bufptr)
{
        UInt8 packet = BAD;
       
        if(!xmodemstatus.B._timeout)
        {
                if(!xmodemstatus.B._recverr)
                {
                        if(bufptr[0] == SOH)
                        {                                                                                                 // valid start
                                if(bufptr[1] == xmodemstatus.B._number+1)
                                {                                                                                         // sequential block number ?
                                        if((bufptr[1] + bufptr[2]) == 0xff)
                                        {                                                                                 // block number and block number checksum are ok
                                                                                                                        // compute CRC and validate it
                                                if(xmodemstatus.B._recvmod)
                                                {
                                                        if(Calc_CRC16(&bufptr[3],128) == ((bufptr[131]<<8) | bufptr[132]))
                                                        {
                                                                xmodemstatus.B._number = bufptr[1];        // good packet ... ok to increment
                                                                if(xmodemstatus.B._number == 0xFF)        xmodemstatus.B._number = 0;
                                                                packet = GOOD;
                                                                BREAK();               
                                                        }
                                                }
                                                else if(Calc_Cksum(&bufptr[3],128) == bufptr[131])
                                                {
                                                        xmodemstatus.B._number = bufptr[1];        // good packet ... ok to increment
                                                        if(xmodemstatus.B._number == 0xFF)        xmodemstatus.B._number = 0;
                                                        packet = GOOD;
                                                        BREAK();       
                                                }
                                               
                                        }                                                                                 // block number checksum
                                }                                                                                         // bad block number or same block number
                                else if(bufptr[1] == xmodemstatus.B._number)
                                {                                                                                         // same block number ... ack got glitched
                                        packet = DUP;                                                         // packet is previous packet don't inc packet number
                                }
                        }                                                                                                // check for the end       
                        else if(bufptr[0] == EOT)
                        {
                                packet = END;
                                xmodemstatus.B._recvrdy = 1;
                        }
                }
                else        packet = ERR;
        }
        else        packet = OUT;
        return(packet);
}

//=============================================================
// ----Function: Xmodem_Rxd_ISR();
// ------Syntax: void Xmodem_Rxd_ISR(void);
// -Description: Xmodem receive interrupt service.
// -------Notes: Used in UART Rxd ISR.
// --parameters: none
// -----returns: none
//=============================================================
void Xmodem_Rxd_ISR(void)
{
        UInt8 *localptr = rxdptr;
       
        *localptr++ = P_UART_Data->W;                         // get char
        // Framing or over run error check for errors
        if(P_UART_RXStatus->W & (CW_UART_Clear_FE|CW_UART_Clear_PE|CW_UART_Clear_OE))
        {
                xmodemstatus.B._recverr = TRUE;
                 P_UART_RXStatus->W = CW_UART_Clear_FE|CW_UART_Clear_PE|CW_UART_Clear_OE;
        }                                                                                // read status register after reading data register
                                                                       
        switch(rxdbuf[0])                                                 // determine if buffer full
        {
                case(SOH):
                        if(xmodemstatus.B._recvmod)                // receive CRC16 mode
                        {
                                if(localptr > &rxdbuf[132])
                                {
                                        xmodemstatus.B._bufmark = FULL;
                                        localptr = &rxdbuf[0];
                                }
                        }
                        else                                                        // receive Checksum mode
                        {
                                if(localptr > &rxdbuf[131])
                                {
                                        xmodemstatus.B._bufmark = FULL;
                                        localptr = &rxdbuf[0];
                                }
                        }
                        break;
               
                default:
                        xmodemstatus.B._bufmark = FULL; // first char unknown
                        localptr = &rxdbuf[0];
                        break;
        }
        rxdptr = localptr;                                                 // restore global pointer
}

//=============================================================
// ----Function: Spmc75_XmodemReceive();
// ------Syntax: void Spmc75_XmodemReceive(void);
// -Description: Receive data from PC in Xmodem Protocol
// -------Notes: First send 'C'/NAK, then receive data and responsion
// --parameters: none
// -----returns: none
//=============================================================
void Spmc75_XmodemReceive(void)
{
        UInt8 packet;                                                                 // status flag
       
        rxdptr = rxdbuf;                                                         // point to recv buffer
        Spmc75_XmodemSendc();                                                 // send a 'c' until the buffer gets full
        packet = Spmc75_ValidatePacket(rxdbuf);         // validate packet 1
        rxdptr = rxdbuf;                                                         // re-initialize buffer pointer before acknowledging
        Spmc75_XmodemRespond(packet);                                 // ack or nak

        while(packet != GOOD)                                                 // if we nak'ed above wait for packet 1 again
        {
                Spmc75_XmodemRecvwait();
                packet = Spmc75_ValidatePacket(rxdbuf); // validate packet 1
                rxdptr = rxdbuf;                                                 // re-initialize buffer pointer before acknowledging
                Spmc75_XmodemRespond(packet);                         // ack or nak
        }
       
        while(packet != END)                                                 // get remainder of file
        {
                Spmc75_XmodemRecvwait();                                 // wait for error or buffer full
                packet = Spmc75_ValidatePacket(rxdbuf); // validate the packet
                rxdptr = rxdbuf;                                                 // re-initialize buffer pointer before acknowledging
                Spmc75_XmodemRespond(packet);                         // ack or nak
        }// end of file transmission
}

//=============================================================
// ----Function: Spmc75_XmodemInitial();
// ------Syntax: void Spmc75_XmodemInitial(void);
// -Description: Initialization
// -------Notes: Initial UART and CMT0, CMT0->8Hz
// --parameters: none
// -----returns: none
//=============================================================
void Spmc75_XmodemInitial(void)
{
        Spmc75_UART_Init();
        Spmc75_CMT0_Init();
        xmodemstatus.W = 0;
}

//=============================================================
// ----Function: Spmc75_TimeOut_ISR();
// ------Syntax: void Spmc75_TimeOut_ISR(void);
// -Description: Time out service.
// -------Notes: Used in CMT0 ISR.
// --parameters: none.
// -----returns: none.
//=============================================================
void Spmc75_TimeOut_ISR(void)
{
        static UInt16 clock = 0;
       
        if(++clock > XmodemTimeOut)
        {
                clock = 0;
                xmodemstatus.B._timeout = TRUE;
        }
}
//=============================================================
// *END*
//=============================================================

使用特权

评论回复
16
dongnanxibei| | 2017-5-18 19:18 | 只看该作者
代码在压缩包,全部的,你可以修改成新唐的。

使用特权

评论回复
17
dongnanxibei| | 2017-5-18 19:19 | 只看该作者
如果你不会修改,可以花钱找我修改啊。哈哈,我帮你找到源码已经花费了不少时间了。

使用特权

评论回复
18
heisexingqisi| | 2017-5-18 20:07 | 只看该作者
这种貌似比较古老了吧

使用特权

评论回复
19
qwe12377yu|  楼主 | 2017-5-19 08:59 | 只看该作者
dongnanxibei 发表于 2017-5-18 19:19
如果你不会修改,可以花钱找我修改啊。哈哈,我帮你找到源码已经花费了不少时间了。 ...

感谢花钱的话,我在考虑考虑

使用特权

评论回复
20
晨海| | 2020-5-26 15:52 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

109

帖子

2

粉丝