/*****
******************************************************************************
*
*公司名称 : 天津众智创新科技有限公司
*
*版权 (c) : TianJin Free Soar Innovations Technology Co., Ltd, All rights reserved.
*
*模块名 : xmodem 协议文件。
*
*版本 : 0.1.0
*
*作者 : LanLimin 2017-11-17
*
*相关文件 :
*
*文件名 : xmodem.c
*
*文件描述 : 文件定义了xmodem协议文件。
*
*-----------------------------------------------------------------------------
*备注 :
*-----------------------------------------------------------------------------
*
*修改信息 :
*修改日期 版本 修改人 修改内容
*
*
*******************************************************************************
*****/
/*
********************************************************************************
* 包含文件
********************************************************************************
*/
#include "bsp.h"
#include "Check.h"
#include "str_lib.h"
#include "xmodem.h"
/*
********************************************************************************
* 变量定义
********************************************************************************
*/
typedef struct XMODEM_INFO_STRU
{
UINT16 ucBuffPosRead;
UINT16 ucBuffPosWrite;
UINT8 ucXmodemBuff[XMODEM_BUFF_SIZE_MAX];
} XMODEM_INFO;
XMODEM_INFO xModemInfo;
/*
********************************************************************************
* 内部函数声明
********************************************************************************
*/
static UINT16 uiXModem_RecvPacketCheck(BOOL bIsCRCMode, const UINT8 *pucFrameBuff, UINT16 uiPacketLen);
static UINT16 uiXModem_ReadDataPacket(UINT8 *pucBuff, UINT16 uiPacketLen);
static UINT16 uiXModem_ReadChar (UINT8 *pucData, UINT16 uiTimeOut);
static void vXModem_FlushInput (void);
static ERROR_TYPE eXModem_RecvivePolled(BOOL bIsCRCMode, UINT8 *pucRecvBuff, UINT16 uiRecvBytesLen);
static ERROR_TYPE eXModem_TransmitEndPolled(void);
static ERROR_TYPE eXModem_TransmitPolled(UINT8 ucPacketNum, BOOL bIsCRCMode, UINT8 *pucSendBuff, UINT16 uiSendBytesLen);
extern void vXModem_Delay50Us(void);
extern UINT16 uiXModem_RecvCallBack(UINT8 *pucBuff, UINT16 uiPacketLen);
extern ERROR_TYPE eXModem_HWInit(UINT32 ulBaudRate);
extern void vXModem_UartPutChar(UINT8 ucByte);
extern UINT8 ucXModem_UartGetChar(void);
extern void vXModem_UartRecvEnable(void);
/*==============================================================================
函数名 : eXModem_Init()
功能 : 初始化协议栈
参数 : ulBaudRate:串口通信波特率
返回值 : 返回异常状态
作者 : LanLimin
日期 : 2017-11-17
备注 :
==============================================================================*/
ERROR_TYPE eXModem_Init(UINT32 ulBaudRate)
{
ERROR_TYPE eErrCode;
do
{
xModemInfo.ucBuffPosRead = 0;
xModemInfo.ucBuffPosWrite = 0;
eErrCode = eXModem_HWInit(ulBaudRate);
} while (0);
return (eErrCode);
}
/*==============================================================================
函数名 : eXModem_TransmitPolled()
功能 : 发送处理程序
参数 : bIsCRCMode :校验方式
pucSendBuff :发送缓冲地址
uiSendBytesLen :发送数据长度
返回值 : 返回异常状态
作者 : LanLimin
日期 : 2017-11-20
备注 :
==============================================================================*/
static ERROR_TYPE eXModem_RecvivePolled(BOOL bIsCRCMode, UINT8 *pucRecvBuff, UINT16 uiRecvBytesLen)
{
ERROR_TYPE eErrCode;
UINT16 luiRecvByteSize;
do
{
eErrCode = XMODEM_ERR_NOERR;
if ((NULL == pucRecvBuff) || (0 == uiRecvBytesLen))
{
eErrCode = XMODEM_ERR_INVAL_ARGU;
break;
}
luiRecvByteSize = uiRecvBytesLen + ((DEFINE_YES == bIsCRCMode)?1:0) + 3;
if (DEFINE_OK != uiXModem_ReadDataPacket(pucRecvBuff, luiRecvByteSize))
{
eErrCode = XMODEM_ERR_IO;
break;
}
if ((pucRecvBuff[0]!= ((UINT8)~pucRecvBuff[1]))
||(DEFINE_OK != uiXModem_RecvPacketCheck(bIsCRCMode, &pucRecvBuff[2], uiRecvBytesLen)))
{
eErrCode = XMODEM_ERR_TRANSMIT_ERROR;
break;
}
} while (0);
return (eErrCode);
}
/*==============================================================================
函数名 : eXModem_ReceiveProcess()
功能 : 接收处理程序
参数 : void
返回值 : 返回异常状态
作者 : LanLimin
日期 : 2017-11-20
备注 :
==============================================================================*/
ERROR_TYPE eXModem_ReceiveProcess(void)
{
ERROR_TYPE eErrCode;
UINT16 luiBuffSize;
UINT16 luiDoneState;
UINT16 luiPacketNum;
UINT16 luiCRCMode;
UINT16 luiRetransNum;
UINT16 luiRetryCtr;
UINT8 lucSendCmdChar;
UINT8 lucRecvChar;
UINT8 ucRecvBuff[XMODEM_BUFF_SIZE_MAX];
lucSendCmdChar = XMODEM_CRC_CHR;
luiPacketNum = 1;
luiRetransNum = XMODEM_RETRY_MAX;
luiCRCMode = DEFINE_NO;
for (;;)
{
luiDoneState = DEFINE_NO;
eErrCode = XMODEM_ERR_CONNECT_TIMEOUT;
for (luiRetryCtr = 0; luiRetryCtr < XMODEM_RETRY_MAX; luiRetryCtr++)
{
if (lucSendCmdChar)
{
vXModem_UartPutChar(lucSendCmdChar);
}
if (DEFINE_OK != uiXModem_ReadChar(&lucRecvChar, XMODEM_DLY_1S))
{
continue;
}
if (CAN == lucRecvChar)
{
if (DEFINE_OK != uiXModem_ReadChar(&lucRecvChar, XMODEM_DLY_1S))
{
continue;
}
if (CAN == lucRecvChar)
{
vXModem_FlushInput();
vXModem_UartPutChar(ACK);
eErrCode = XMODEM_ERR_CANCEL;
luiDoneState = DEFINE_YES;
break;
}
}
if (EOT == lucRecvChar)
{
vXModem_FlushInput();
vXModem_UartPutChar(ACK);
eErrCode = XMODEM_ERR_NOERR;
luiDoneState = DEFINE_YES;
break;
}
if (SOH == lucRecvChar)
{
luiBuffSize = XMODEM_DATA_SIZE_SOH;
}
else if (STX == lucRecvChar)
{
luiBuffSize = XMODEM_DATA_SIZE_STX;
}
else
{
continue;
}
if (XMODEM_CRC_CHR == lucSendCmdChar)
{
luiCRCMode = DEFINE_YES;
}
lucSendCmdChar = 0;
ucRecvBuff[0] = lucRecvChar;
eErrCode = eXModem_RecvivePolled(luiCRCMode, &ucRecvBuff[1], luiBuffSize);
if ((XMODEM_ERR_NOERR != eErrCode) || ((luiPacketNum != ucRecvBuff[1]) && ((luiPacketNum - 1) != ucRecvBuff[1])))
{
vXModem_FlushInput();
vXModem_UartPutChar(NAK);
break;
}
if (luiPacketNum == ucRecvBuff[1])
{
if (DEFINE_OK == uiXModem_RecvCallBack(&ucRecvBuff[3], luiBuffSize))
{
;
}
luiPacketNum++;
luiPacketNum &= 0x00FF;
luiRetransNum = XMODEM_RETRY_MAX + 1;
}
if (0 == --luiRetransNum)
{
eErrCode = XMODEM_ERR_CONNECT_TIMEOUT;
xModem 单片机代码
需积分: 0 197 浏览量
2023-10-04
10:27:41
上传
评论
收藏 6KB RAR 举报
lanlimin411
- 粉丝: 0
- 资源: 2
最新资源
- python开心麻花影视作品分析程序+源码.zip
- pythonExcel数据分析师程序+源码.zip
- PlatformUI.jar 支持RCP控件环境插件
- VB+ACCESS大型机房学生上机管理系统(源代码+系统).zip
- 基于BP神经网络的回归分析,基于优化动量因子的BP神经网络,基于优化学习率的BP神经网络,基于优化隐藏层神经元的bp神经网络
- python读取excel数据Python-file-reading-master.zip
- STC15单片机串口2使用程序例子
- 读取日志的excel生成周报 用python3开发weekplan-master.zip
- python 读取excel数据导入dbimport-data-master.zip
- K折交叉验证BP神经网络,多输入多输出BP神经网络(代码完整,数据齐全)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈