[技术问答] 求新唐M4 Xmodem例程

[复制链接]
 楼主| 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了,相关的代码都有,你可以找个靠谱的修改一下,移植。
 楼主| qwe12377yu 发表于 2017-5-18 17:12 | 显示全部楼层
zhuomuniao110 发表于 2017-5-18 16:55
没有找到直接能用的,网上51了,430了,相关的代码都有,你可以找个靠谱的修改一下,移植。 ...

写的太复杂了,都是其他线的,希望能有个新唐的参照啊
 楼主| qwe12377yu 发表于 2017-5-18 17:13 | 显示全部楼层
zhuomuniao110 发表于 2017-5-18 16:55
没有找到直接能用的,网上51了,430了,相关的代码都有,你可以找个靠谱的修改一下,移植。 ...

这些资料都看过了,谢谢,现在就希望能有个新唐的Dome学习哈
dongnanxibei 发表于 2017-5-18 17:39 | 显示全部楼层
dongnanxibei 发表于 2017-5-18 17:39 | 显示全部楼层
下载站的这个,楼主看看能用不
 楼主| qwe12377yu 发表于 2017-5-18 17:45 | 显示全部楼层
dongnanxibei 发表于 2017-5-18 17:39
下载站的这个,楼主看看能用不

谢谢层主,这个我之前已经下载了,就是个坑,里面就一个协议的说明
dongnanxibei 发表于 2017-5-18 17:54 | 显示全部楼层
qwe12377yu 发表于 2017-5-18 17:45
谢谢层主,这个我之前已经下载了,就是个坑,里面就一个协议的说明

你想要他里面那个单片机的例程是吗?
 楼主| qwe12377yu 发表于 2017-5-18 17:57 | 显示全部楼层
dongnanxibei 发表于 2017-5-18 17:54
你想要他里面那个单片机的例程是吗?

是的咧
 楼主| qwe12377yu 发表于 2017-5-18 18:00 | 显示全部楼层
dongnanxibei 发表于 2017-5-18 17:54
你想要他里面那个单片机的例程是吗?

其实我想要的很简单,就是通过Xmodem协议接收一个文件
 楼主| qwe12377yu 发表于 2017-5-18 18:01 | 显示全部楼层
dongnanxibei 发表于 2017-5-18 17:54
你想要他里面那个单片机的例程是吗?

其实我想要的很简单,就是通过Xmodem协议接收一个文件
dongnanxibei 发表于 2017-5-18 19:17 | 显示全部楼层
用UART做文件传输,采用Xmodem 协议.rar (822.67 KB, 下载次数: 55)



dongnanxibei 发表于 2017-5-18 19:17 | 显示全部楼层

  1. /* ========================================================================= */
  2. /* The information contained herein is the exclusive property of             */
  3. /* Sunplus Technology Co. And shall not be distributed, reproduced,          */
  4. /* or disclosed in whole in part without prior written permission.           */
  5. /*             (C) COPYRIGHT 2004 SUNPLUS TECHNOLOGY CO.                     */
  6. /*                    ALL RIGHTS RESERVED                                    */
  7. /* The entire notice above must be reproduced on all authorized copies.      */
  8. /* ========================================================================= */
  9. /*                                                                                                                                                          */
  10. /* ========================================================================= */
  11. /* Project Name  : AN_SPMC75_0109                                                                             */
  12. /* File Name     : Xmodem.c                                                                                                          */
  13. /* Description   : XmodemЭ�����������                                                                         */
  14. /*                                                                                                      */
  15. /* Processor     : SPMC75F2413A                                                                                             */
  16. /* Tools             : u'nSP IDE tools v1.18.1A or later version                                 */
  17. /* ========================================================================= */
  18. /* Revision                                                                                                                                         */
  19. /* ========================================================================= */
  20. /* Version       :  1.00                                                                                                            */
  21. /* Date                         :        2005.9.2                                                                                                 */
  22. /* Modified by   :        ����������ļ�ͷ�����µ�ͷ�ļ�                                                         */
  23. /* Description         :                                                                                                                     */
  24. /* ========================================================================= */

  25. #include        "AN_SPMC75_0109.H"
  26. /* ----------------------------------------------------------------------------------------
  27. Xmodem transmit in 16-Bit CRC mode ,receiving buffer define:
  28.    +--------------------------------------------------------------------------------------+
  29.    |           Byte0          |                 Byte1    |           Byte2            |  Byte 3--130  |  Byte 131--132  |
  30.    +--------------------------------------------------------------------------------------+
  31.    | Start of header | Packet Number | ~(Packet Number) |  Packet Data  | CRC Hi | CRC Lo |
  32.    +--------------------------------------------------------------------------------------+ */
  33. /* ----------------------------------------------------------------------------------------
  34. Xmodem transmit in Check Sum mode ,receiving buffer define:
  35.    +-------------------------------------------------------------------------------------------+
  36.    |           Byte0          |                 Byte1    |           Byte2            |  Byte 3--130  |  Byte 131 | Byte 132 |
  37.    +-------------------------------------------------------------------------------------------+
  38.    | Start of header | Packet Number | ~(Packet Number) |  Packet Data  | CheckSum  |         NOP    |
  39.    +-------------------------------------------------------------------------------------------+ */
  40. UInt8         rxdbuf[133] = {0};
  41. // --------------------------------------------------------------- //
  42. TYPESTATUS                xmodemstatus;
  43. static UInt8        *rxdptr = rxdbuf;
  44. static UInt16         XmodemTimeOut;
  45. //===========================================================================
  46. extern UInt16 Calc_CRC16(UInt8 *cptr, Int16 count);
  47. extern UInt16 Calc_Cksum(UInt8 *cptr, Int16 count);
  48. /*
  49. //=============================================================
  50. // ----Function: Calc_CRC16A();
  51. // ------Syntax: UInt16 Calc_CRC16A(UInt8 *cptr, Int16 count)
  52. // -Description: CRC 16 calculate
  53. // -------Notes:
  54. // --parameters: cptr: data Cursor                count: data length
  55. // -----returns: CRC16
  56. //=============================================================
  57. static UInt16 Calc_CRC16A(UInt8 *cptr, Int16 count)
  58. {
  59.         UInt16 crc = 0,i;

  60.         while(--count >= 0)
  61.         {
  62.                 crc = crc ^ (UInt16)(*cptr++) << 8;
  63.                 for(i=0;i<8;i++)
  64.                 {
  65.                         if(crc & 0x8000)        crc = crc << 1 ^ 0x1021;
  66.                         else        crc = crc << 1;
  67.                 }
  68.         }
  69.         return(crc);
  70. }*/
  71. /*
  72. //=============================================================
  73. // ----Function: Calc_Cksum();
  74. // ------Syntax: UInt16 Calc_Cksum(UInt8 *cptr, Int16 count);
  75. // -Description: Check sum calculate
  76. // -------Notes:
  77. // --parameters: cptr: data Cursor                count: data length
  78. // -----returns: Checksum
  79. //=============================================================
  80. static UInt16 Calc_Cksum(UInt8 *cptr, Int16 count)
  81. {
  82.         UInt16 sum = 0,i;
  83.         for(i=0;i<count;i++,cptr++)        sum += *cptr;
  84.         return(sum&0xff);
  85. }*/
  86. //=============================================================
  87. // ----Function: Spmc75_XmodemPurge();
  88. // ------Syntax: void Spmc75_XmodemPurge(void);
  89. // -Description: Purge
  90. // -------Notes: Wait 1 second
  91. // --parameters: none
  92. // -----returns: none
  93. //=============================================================
  94. static void Spmc75_XmodemPurge(void)
  95. {
  96.         UInt8 flush;
  97.         xmodemstatus.B._timeout = FALSE;
  98.         XmodemTimeOut = TIMEOUT_1S;                // 1 second timeout
  99.         P_CMT_Start->B.ST0 = 1;
  100.         P_UART_Ctrl->W         = CW_UART_RXEN|CW_UART_TXEN;
  101.         while(!xmodemstatus.B._timeout) // read uart until done
  102.         {       
  103.                 flush = P_UART_Data->W;
  104.         }
  105.         P_UART_Ctrl->W = CW_UART_RXIE|CW_UART_RXEN|CW_UART_TXEN;
  106.         P_CMT_Start->B.ST0 = 0;                        // disable timer/counter
  107. }

  108. //=============================================================
  109. // ----Function: Spmc75_XmodemRecvwait();
  110. // ------Syntax: void Spmc75_XmodemRecvwait(void);
  111. // -Description: Recv wait buffer full or time out
  112. // -------Notes:
  113. // --parameters: none
  114. // -----returns: none
  115. //=============================================================
  116. static void Spmc75_XmodemRecvwait(void)
  117. {
  118.         xmodemstatus.B._timeout = FALSE;         // set in timer counter 0 overflow interrupt routine
  119.         XmodemTimeOut = TIMEOUT_1S;                        // 1 second timeout
  120.         P_CMT_Start->B.ST0 = 1;
  121.         while(!xmodemstatus.B._bufmark && !xmodemstatus.B._timeout);
  122.                                                                                 // turn off timer - no more time outs needed
  123.         P_CMT_Start->B.ST0 = 0;                         // disable timer/counter 1 clock
  124. }

  125. //=============================================================
  126. // ----Function: Spmc75_XmodemRespond();
  127. // ------Syntax: void Spmc75_XmodemRespond(UInt8 packet)
  128. // -Description: Respond
  129. // -------Notes:
  130. // --parameters: packet: packet status
  131. // -----returns: none
  132. //=============================================================
  133. static void Spmc75_XmodemRespond(UInt8 packet)
  134. {
  135.         // clear buffer flag here ... when acking or nacking sender may respond
  136.         // very quickly.
  137.         xmodemstatus.B._bufmark = EMPTY;
  138.         xmodemstatus.B._recverr = FALSE;                 // framing and over run detection
  139.         if((packet == GOOD) || (packet == DUP) || (packet == END))
  140.         {
  141.                 while(P_UART_Status->B.BY);                 // wait till transmit register is empty
  142.                 P_UART_Data->W = ACK;                                 // now for the next packet
  143.         }
  144.         else
  145.         {
  146.                 while(P_UART_Status->B.BY);                        // wait till transmit register is empty
  147.                 Spmc75_XmodemPurge();                                 // let transmitter empty its buffer
  148.                 P_UART_Data->W = NAK;                                 // tell sender error
  149.         }
  150. }

  151. //=============================================================
  152. // ----Function: Spmc75_XmodemSendc();
  153. // ------Syntax: void Spmc75_XmodemSendc(void);
  154. // -Description: Send 'C'/NAK for request host transmitter
  155. // -------Notes: 'C'->(wait 3s)->NAK->(wait 3s)->'C'->.....
  156. // --parameters: none
  157. // -----returns: none
  158. //=============================================================
  159. static void Spmc75_XmodemSendc(void)
  160. {
  161.         XmodemTimeOut = TIMEOUT_3S;                        // 3 second timeout
  162.         xmodemstatus.B._bufmark = EMPTY;
  163.         xmodemstatus.B._recverr = FALSE;        // checked in Spmc75_ValidatePacket for framing or overruns
  164.                                                                                 // send character 'C'/NAK until we get a packet from the sender
  165.         while(!xmodemstatus.B._bufmark)
  166.         {
  167.                 xmodemstatus.B._timeout = FALSE;
  168.                 xmodemstatus.B._recvmod = 1;        // tell sender CRC mode
  169.                 while(P_UART_Status->B.BY);         // wait till Data register is empty
  170.                 P_UART_Data->W = CRCCHR;                 // signal transmitter that I'm ready in CRC mode ... 128 byte packets
  171.                 P_CMT_Start->B.ST0 = 1;                 // Allow CMT0 timer start timing
  172.                                                                                 // wait for timeout or recv buffer to fill
  173.                 while(!xmodemstatus.B._timeout && !xmodemstatus.B._bufmark);
  174.                 P_CMT_Start->B.ST0 = 0;                 // disable timer/counter 1 clock
  175.                
  176.                 if(xmodemstatus.B._timeout)         // start wait loop again
  177.                 {
  178.                         xmodemstatus.B._timeout = FALSE;
  179.                         xmodemstatus.B._recvmod = 0;// tell sender Checksum mode
  180.                         while(P_UART_Status->B.BY); // wait till Data register is empty
  181.                         P_UART_Data->W = NAK;                // signal transmitter that I'm ready in Checksum mode ... 128 byte packets
  182.                         P_CMT_Start->B.ST0 = 1;                // Allow CMT0 timer start timing
  183.                         while(!xmodemstatus.B._timeout && !xmodemstatus.B._bufmark);
  184.                         P_CMT_Start->B.ST0 = 0;                // disable timer/counter clock
  185.                 }
  186.         }
  187. }

  188. //=============================================================
  189. // ----Function: Spmc75_ValidatePacket();
  190. // ------Syntax: UInt8 Spmc75_ValidatePacket(UInt8 *bufptr);
  191. // -Description: Validate Packet status.
  192. // -------Notes: Validate Packet is OK will apply 'break' Interrupt
  193. // --parameters: bufptr: should Validate Packet data Cursor
  194. // -----returns: result
  195. //=============================================================
  196. static UInt8 Spmc75_ValidatePacket(UInt8 *bufptr)
  197. {
  198.         UInt8 packet = BAD;
  199.        
  200.         if(!xmodemstatus.B._timeout)
  201.         {
  202.                 if(!xmodemstatus.B._recverr)
  203.                 {
  204.                         if(bufptr[0] == SOH)
  205.                         {                                                                                                 // valid start
  206.                                 if(bufptr[1] == xmodemstatus.B._number+1)
  207.                                 {                                                                                         // sequential block number ?
  208.                                         if((bufptr[1] + bufptr[2]) == 0xff)
  209.                                         {                                                                                 // block number and block number checksum are ok
  210.                                                                                                                         // compute CRC and validate it
  211.                                                 if(xmodemstatus.B._recvmod)
  212.                                                 {
  213.                                                         if(Calc_CRC16(&bufptr[3],128) == ((bufptr[131]<<8) | bufptr[132]))
  214.                                                         {
  215.                                                                 xmodemstatus.B._number = bufptr[1];        // good packet ... ok to increment
  216.                                                                 if(xmodemstatus.B._number == 0xFF)        xmodemstatus.B._number = 0;
  217.                                                                 packet = GOOD;
  218.                                                                 BREAK();               
  219.                                                         }
  220.                                                 }
  221.                                                 else if(Calc_Cksum(&bufptr[3],128) == bufptr[131])
  222.                                                 {
  223.                                                         xmodemstatus.B._number = bufptr[1];        // good packet ... ok to increment
  224.                                                         if(xmodemstatus.B._number == 0xFF)        xmodemstatus.B._number = 0;
  225.                                                         packet = GOOD;
  226.                                                         BREAK();       
  227.                                                 }
  228.                                                
  229.                                         }                                                                                 // block number checksum
  230.                                 }                                                                                         // bad block number or same block number
  231.                                 else if(bufptr[1] == xmodemstatus.B._number)
  232.                                 {                                                                                         // same block number ... ack got glitched
  233.                                         packet = DUP;                                                         // packet is previous packet don't inc packet number
  234.                                 }
  235.                         }                                                                                                // check for the end       
  236.                         else if(bufptr[0] == EOT)
  237.                         {
  238.                                 packet = END;
  239.                                 xmodemstatus.B._recvrdy = 1;
  240.                         }
  241.                 }
  242.                 else        packet = ERR;
  243.         }
  244.         else        packet = OUT;
  245.         return(packet);
  246. }

  247. //=============================================================
  248. // ----Function: Xmodem_Rxd_ISR();
  249. // ------Syntax: void Xmodem_Rxd_ISR(void);
  250. // -Description: Xmodem receive interrupt service.
  251. // -------Notes: Used in UART Rxd ISR.
  252. // --parameters: none
  253. // -----returns: none
  254. //=============================================================
  255. void Xmodem_Rxd_ISR(void)
  256. {
  257.         UInt8 *localptr = rxdptr;
  258.        
  259.         *localptr++ = P_UART_Data->W;                         // get char
  260.         // Framing or over run error check for errors
  261.         if(P_UART_RXStatus->W & (CW_UART_Clear_FE|CW_UART_Clear_PE|CW_UART_Clear_OE))
  262.         {
  263.                 xmodemstatus.B._recverr = TRUE;
  264.                  P_UART_RXStatus->W = CW_UART_Clear_FE|CW_UART_Clear_PE|CW_UART_Clear_OE;
  265.         }                                                                                // read status register after reading data register
  266.                                                                        
  267.         switch(rxdbuf[0])                                                 // determine if buffer full
  268.         {
  269.                 case(SOH):
  270.                         if(xmodemstatus.B._recvmod)                // receive CRC16 mode
  271.                         {
  272.                                 if(localptr > &rxdbuf[132])
  273.                                 {
  274.                                         xmodemstatus.B._bufmark = FULL;
  275.                                         localptr = &rxdbuf[0];
  276.                                 }
  277.                         }
  278.                         else                                                        // receive Checksum mode
  279.                         {
  280.                                 if(localptr > &rxdbuf[131])
  281.                                 {
  282.                                         xmodemstatus.B._bufmark = FULL;
  283.                                         localptr = &rxdbuf[0];
  284.                                 }
  285.                         }
  286.                         break;
  287.                
  288.                 default:
  289.                         xmodemstatus.B._bufmark = FULL; // first char unknown
  290.                         localptr = &rxdbuf[0];
  291.                         break;
  292.         }
  293.         rxdptr = localptr;                                                 // restore global pointer
  294. }

  295. //=============================================================
  296. // ----Function: Spmc75_XmodemReceive();
  297. // ------Syntax: void Spmc75_XmodemReceive(void);
  298. // -Description: Receive data from PC in Xmodem Protocol
  299. // -------Notes: First send 'C'/NAK, then receive data and responsion
  300. // --parameters: none
  301. // -----returns: none
  302. //=============================================================
  303. void Spmc75_XmodemReceive(void)
  304. {
  305.         UInt8 packet;                                                                 // status flag
  306.        
  307.         rxdptr = rxdbuf;                                                         // point to recv buffer
  308.         Spmc75_XmodemSendc();                                                 // send a 'c' until the buffer gets full
  309.         packet = Spmc75_ValidatePacket(rxdbuf);         // validate packet 1
  310.         rxdptr = rxdbuf;                                                         // re-initialize buffer pointer before acknowledging
  311.         Spmc75_XmodemRespond(packet);                                 // ack or nak

  312.         while(packet != GOOD)                                                 // if we nak'ed above wait for packet 1 again
  313.         {
  314.                 Spmc75_XmodemRecvwait();
  315.                 packet = Spmc75_ValidatePacket(rxdbuf); // validate packet 1
  316.                 rxdptr = rxdbuf;                                                 // re-initialize buffer pointer before acknowledging
  317.                 Spmc75_XmodemRespond(packet);                         // ack or nak
  318.         }
  319.        
  320.         while(packet != END)                                                 // get remainder of file
  321.         {
  322.                 Spmc75_XmodemRecvwait();                                 // wait for error or buffer full
  323.                 packet = Spmc75_ValidatePacket(rxdbuf); // validate the packet
  324.                 rxdptr = rxdbuf;                                                 // re-initialize buffer pointer before acknowledging
  325.                 Spmc75_XmodemRespond(packet);                         // ack or nak
  326.         }// end of file transmission
  327. }

  328. //=============================================================
  329. // ----Function: Spmc75_XmodemInitial();
  330. // ------Syntax: void Spmc75_XmodemInitial(void);
  331. // -Description: Initialization
  332. // -------Notes: Initial UART and CMT0, CMT0->8Hz
  333. // --parameters: none
  334. // -----returns: none
  335. //=============================================================
  336. void Spmc75_XmodemInitial(void)
  337. {
  338.         Spmc75_UART_Init();
  339.         Spmc75_CMT0_Init();
  340.         xmodemstatus.W = 0;
  341. }

  342. //=============================================================
  343. // ----Function: Spmc75_TimeOut_ISR();
  344. // ------Syntax: void Spmc75_TimeOut_ISR(void);
  345. // -Description: Time out service.
  346. // -------Notes: Used in CMT0 ISR.
  347. // --parameters: none.
  348. // -----returns: none.
  349. //=============================================================
  350. void Spmc75_TimeOut_ISR(void)
  351. {
  352.         static UInt16 clock = 0;
  353.        
  354.         if(++clock > XmodemTimeOut)
  355.         {
  356.                 clock = 0;
  357.                 xmodemstatus.B._timeout = TRUE;
  358.         }
  359. }
  360. //=============================================================
  361. // *END*
  362. //=============================================================
dongnanxibei 发表于 2017-5-18 19:18 | 显示全部楼层
代码在压缩包,全部的,你可以修改成新唐的。
dongnanxibei 发表于 2017-5-18 19:19 | 显示全部楼层
如果你不会修改,可以花钱找我修改啊。哈哈,我帮你找到源码已经花费了不少时间了。
heisexingqisi 发表于 2017-5-18 20:07 | 显示全部楼层
这种貌似比较古老了吧
 楼主| qwe12377yu 发表于 2017-5-19 08:59 | 显示全部楼层
dongnanxibei 发表于 2017-5-18 19:19
如果你不会修改,可以花钱找我修改啊。哈哈,我帮你找到源码已经花费了不少时间了。 ...

感谢花钱的话,我在考虑考虑
晨海 发表于 2020-5-26 15:52 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

109

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部

13

主题

109

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部