📄 xmodem.c
字号:
#include <absacc.h>
#include "xmodem.h"
#include "reg9e5.h"
#include "PubFunc.h"
#include "timer0.h"
#include "serial.h"
#include "25lc320.h"
/******************************************************************************
51系列中,对于int型的双字节数,在内存中的存放顺序为前高后低
如int 0x1234,在内存中实际的存放位置为0x12,0x34
******************************************************************************/
WORD calCRC(BYTE idata *ptr, BYTE data count)
{
WORD_UN data crc;
BYTE data i;
crc.bytArray[0] = 0;
crc.bytArray[1] = 0;
//while (count-- > 0) {
while(count>0){
count--;
crc.bytArray[0] ^= *ptr;
crc.bytArray[1] ^= 0;
ptr++;
for (i = 0; i < 8; ++i) {
if (crc.bytArray[0] & 0x80) {
//crc.wValue = crc.wValue << 1 ^ 0x1021;
crc.wValue = crc.wValue << 1;
crc.bytArray[0] ^= 0x10;
crc.bytArray[1] ^= 0x21;
} else {
crc.wValue = crc.wValue << 1;
}
}
}
return crc.wValue;
}
void SaveCode(void)
{
WORD data addr;
addr = (((WORD)XmodemRecvBuf[2])<<7)+896;//写到1024(128*x+896)位置处 //*128 - 96; //0
_25LC320_WriteByteInPage(addr, XmodemRecvBuf+4); //2
// _25LC320_WriteByteInPage(addr+32, XmodemRecvBuf+36); //34
_25LC320_WriteByteInPage(addr+64, XmodemRecvBuf+68); //66
// _25LC320_WriteByteInPage(addr+96, XmodemRecvBuf+100); //98
}
bit XmodemCheck(void)
{
WORD_UN data rtn;
if (XmodemRecvBuf[2] + XmodemRecvBuf[3] - 0xFF== 0) { //0 1
rtn.wValue = calCRC(XmodemRecvBuf + 4, 128); //2
return ( rtn.bytArray[0] == XmodemRecvBuf[132] && rtn.bytArray[1] == XmodemRecvBuf[133]); //130 131
}
return 0;
}
void xmodem(void)
{
BYTE data i;
CUSTOM_TIMER tmrWaiting;
for (i = 0; i < 20; i++) {
SetCustomTimer(&tmrWaiting, SECONDS(1));
SBUF = XMODEM_C;
serial_recv_num=1;
while (!IsTimeOut(&tmrWaiting)) {
if(XmodemRecvBuf[1]==XMODEM_SOH){
if(serial_recv_num>=134){ //0:u 1:soh 2-133 total 132 134end
if (XmodemCheck()) {
if(XmodemRecvBuf[2]>32) //24
;
// SIOSendData("\r\nFile>3K:", sizeof("\r\nFile>3K:"));
else { SaveCode(); }
SBUF = XMODEM_ACK;
}
else{
SBUF = XMODEM_NAK;
}
SetCustomTimer(&tmrWaiting, SECONDS(1));
serial_recv_num=1;
}
}
else if(XmodemRecvBuf[1]==XMODEM_EOT){
SBUF = XMODEM_ACK;
return;
}
// else
// serial_recv_num=1;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -