📄 commprotocol.h
字号:
// CommProtocol.h: interface for the CCommProtocol class.
//
//////////////////////////////////////////////////////////////////////
#ifndef __SLC_COMM_PROTOCOL_H__
#define __SLC_COMM_PROTOCOL_H__
#define MAX_FRAME_LENGTH 1450 // 最大帧长度
#define MAX_DATA_LENGTH 1426 // MAX_FRAME_LENGTH - 24最大数据长度,帧长度减掉帧格式和包头字段长度
#define MAX_RESEND_NUM 10 // 最大重发次数
#define FIELD_FILE_NAME_LENGTH 14
#define MIN_FRAME_LENGTH 24
#include "bastype.h"
class CCommProtocol
{
public:
enum PackType
{
CPT_DATA = 0x40,
CPT_CMD = 0x80
};
enum CommEndType
{
CET_NOT, // 没有结束
CET_NORMAL, // 正常结束
CET_RESEND_INVALID, // 重发无效错误
CET_NO_DATA // 无通讯数据错误
};
enum COMM_INDEXT_YPE
{
CIT_FILE, CIT_VERSION
};
#pragma pack(1)
typedef struct version_comm_info
{
UINT16 soft_no; // 软件代号,用于实现同一系列软件的通讯
UINT8 ver_info[4];
UINT16 flash_no; // FLASH的容量标志
UINT16 module_no;
} VersionCommInfo;
typedef struct renew_comm_info // 更新命令
{
UINT8 cResultFlag; // 升级更新是否成功
} RenewCommInfo;
typedef struct file_comm_info
{
UINT16 file_type; // 文件类型
UINT16 file_no; // 文件是这个文件传输中的第几个文件
UINT32 lFileLength; // 文件长度
UINT8 file_name[FIELD_FILE_NAME_LENGTH]; // 文件名称
UINT8* pcFileInfo; // 文件内容,这个缓冲是由上层给出
} FileCommInfo;
struct comm_info
{
UINT16 nCommType;
union {
FileCommInfo fileData;
VersionCommInfo verData;
RenewCommInfo renewData;
UINT8 acReserved[20];
} commData;
};
typedef struct comm_info COMMINFO;
enum CommType // CST 表示发送方通讯类型,CRT表示接收方通讯类型
{
CT_NULL,
CST_START, CRT_START,
CST_VERSION, CRT_VERSION,
CST_FILE, CRT_FILE,
CST_BREAK, CRT_BREAK,
CST_RENEW, CRT_RENEW
};
protected:
enum CommandType {
CMD_START = 0x30, // 初始化(S) 初始化,主要用于传输连接时,请求传输
CMD_BREAK = 0x31, // 中断(B) 中断通讯,表示所有文件都已经传输完毕,请求中断通讯
CMD_YES = 0x32, // 确认(Y) 确认,主要用于传输连接时,应答可以传输
CMD_RESEND = 0x33, // 重发(R) 重发,帧发生错误时要求重发数据
CMD_FILESTART = 0x34, // 文件开始(fS) 文件传输开始,附带文件信息,表示接下来要发送一个文件
CMD_FILEEND = 0x35, // 文件结束(fE) 文件结束请求
CMD_VERSION = 0x36, // 请求版本号(rV) 给出自己版本号,请求对方版本号
CMD_RENEW = 0x37 // 更新FLASH结果(W) 给出升级文件被更新结果
};
enum CommStatus // 版本通讯过程常量
{
CS_NULL,
// 发送方
// 开始(初始化)通讯
// CSS_START_SEND_CMD, // 发送开始命令
CSS_START_WAIT_YES, // 等待开始确认
// 版本通讯
// CSS_VERSION_SEND_RV, // 发送版本请求
CSS_VERSION_WAIT_AV, // 等待版本应答
// CSS_VERSION_SEND_YES, // 发送接收确认
CSS_VERSION_WAIT_YES, // 等待结束确认
// 文件通讯
// CSS_FILE_SEND_SCMD, // 发送开始命令
CSS_FILE_WAIT_SYES, // 等待开始确认
// CSS_FILE_SEND_DATA, // 发送数据块
CSS_FILE_WAIT_DYES, // 等待数据确认
// CSS_FILE_SEND_ECMD, // 发送结束命令
CSS_FILE_WAIT_EYES, // 等待结束确认
// 中断通讯
// CSS_BREAK_SEND_BCMD, // 发送中断命令
CSS_BREAK_WAIT_YES, // 等待结束确认
// 更新(写升级文件)通讯
// CSS_WRITE_SEND_CMD, // 发送更新结束命令
CSS_RENEW_WAIT_YES, // 等待结束确认
// 接收方
// 开始(初始化)通讯
CSR_START_WAIT_CMD, // 等待开始命令
// CSR_START_SEND_YES, // 发送确认命令
// 版本通讯
CSR_VERSION_WAIT_RV, // 等待版本请求
// CSR_VERSION_SEND_AV, // 发送版本应答
CSR_VERSION_WAIT_YES, // 等待接收确认
// CSR_VERSION_SEND_YES, // 发送结束确认
// 文件通讯
CSR_FILE_WAIT_SCMD, // 等待开始命令
// CSR_FILE_SEND_SYES, // 发送开始确认
CSR_FILE_WAIT_DATA, // 等待数据块
// CSR_FILE_SEND_DYES, // 发送数据确认
CSR_FILE_WAIT_ECMD, // 等待结束命令
// CSR_FILE_SEND_EYES, // 发送结束确认
// 中断通讯
CSR_BREAK_WAIT_BCMD, // 等待中断命令
// CSR_BREAK_SEND_YES // 发送结束确认
// 更新(写升级文件)通讯
CSR_RENEW_WAIT_CMD // 等待更新结束命令
// CSR_WRITE_SEND_CMD, // 发送更新结束确认命令
};
protected:
// ------------------------- 1、命令包数据定义 ------------------------------- //
typedef struct cmd_filestart_data // 文件开始命令
{
UINT16 file_type; // 文件类型
UINT16 file_no; // 文件是这个文件传输中的第几个文件
UINT16 data_pack_num; // 文件包含的数据包数量
UINT8 file_name[FIELD_FILE_NAME_LENGTH]; // 文件名称
} FSData;
typedef struct cmd_version_data // 应答版本命令
{
UINT16 soft_no; // 软件代号,用于实现同一系列软件的通讯
UINT8 ver_info[4];
UINT16 flash_no; // FLASH的容量标志
UINT16 module_no; // module no
} VRData;
typedef struct cmd_resend_data // 重发命令
{
UINT16 nCommType; // 请求重发方的通讯类型
// UINT16 cPackType; // 请求重发方等待的包类型
UINT16 nPackNo; // 命令包,命令类型;数据包,文件的第几个包
} RSData;
typedef struct cmd_renew_data // 更新命令
{
UINT8 cResultFlag; // 升级更新是否成功
} RNData;
typedef union cmd_data // 命令数据联合
{
UINT8 normal[20]; // 普通命令包,无效,可以忽略
FSData fs; // 文件开始命令包数据
VRData ver; // 应答版本命令包数据
RSData rs; // 请求重发命令
RNData rn; // 更新命令
} CmdData;
// ------------------------- 2、命令包结构定义 ------------------------------- //
typedef struct cmd_pack
{
UINT8 type; // 命令类型
UINT8 reserved[10]; // 保留
UINT8 length; // 命令数据长度
union // 命令数据联合
{
UINT8 normal[20]; // 普通命令包,无效,可以忽略
FSData fs; // 文件开始命令包数据
VRData ver; // 应答版本命令包数据
RSData rs; // 请求重发命令
RNData rn; // 更新命令
} info; // 命令数据
} CmdPack;
// ------------------------- 3、数据包结构定义 ------------------------------- //
typedef struct data_pack
{
UINT16 no; // 数据包序号
UINT32 reserved; // 保留
UINT32 length; // 数据包长度
UINT16 len_check; // 长度校验
UINT8* info; // 数据内容
} DataPack;
// ------------------------- 4、桢结构定义 ------------------------------- //
typedef struct comm_frame
{
UINT8 start_flag; // 开始标志,等于0Xx7e
UINT32 len; // 桢长度
UINT16 len_check; // 长度校验
UINT8 type; // 包类型
union// 包数据联合
{
CmdPack cmdPack;
DataPack dataPack;
} pack; // 包内容
UINT32 check; // 校验和
} CommFrame;
#pragma pack(0)
public:
CCommProtocol(BOOL cpu_is_same = 1, UINT32 frame_size = MAX_FRAME_LENGTH);
~CCommProtocol();
protected:
// 如果bIsDynamicSendFile = 1, 发送文件时,不再根据传入的文件指针来发送文件数据
// 而根据指针函数GetFilePackInfo(UINT16 nPackNo),取得文件数据来发送
// 在大文件时,使用这种方式可以减少文件缓冲所占的内存
BOOL m_bIsDynamicSendFile;
// UINT32 (*m_funcDynamicGetFilePackInfo)(UINT8* pFileName, UINT16 nCurFilePackNo, UINT8* pCurFileInfo, UINT32 lLength);
UINT32 (*m_funcDynamicGetFilePackInfo)(UINT16 nCurFilePackNo, UINT8* pCurFileInfo, UINT32 lLength);
BOOL m_bCpuIsSame; // 是否需要处理(CPU对整数高低位的倒位)
COMMINFO m_stCommInfo; // 通讯信息
UINT32 m_lFileHandlePos; // 已通讯的文件块的位置
UINT16 m_nFilePackCount; // 文件包的数量
UINT16 m_nCommEndFlag; // 通讯结束标志,见enum CommEndFlag
UINT16 m_nResendNum; // 一个通讯包的重发次数
UINT16 m_nStatusFlag; // 通讯状态标志,见enmu CommStatus
// 有关帧的变量
BOOL m_bCheckoutIsRight; // 校验是否正确
BOOL m_bHaveSendFrame; // 是否有发送帧
BOOL m_bHaveReceiveInfo; // 是否有上层需要的接收信息
UINT32 m_lReceivePos; // 接收位置
UINT32 m_lSendSize; // 发送帧使用大小
UINT32 m_lReceiveSize;
UINT8 m_acReceiveFrameInfo[MAX_FRAME_LENGTH]; // 接收桢缓冲
UINT8 m_acSendFrameInfo[MAX_FRAME_LENGTH]; // 发送桢缓冲
UINT8 m_acTempDataBuf[MAX_DATA_LENGTH+1];
UINT32 m_nFrameMaxSize;
public:
UINT16 m_nCurPackNo; // 当前包的序号
UINT32 m_nFrameDataMaxSize;
protected:
void RenewCommSend();
void RenewCommReceive();
void BreakCommSend();
void BreakCommReceive();
void StartCommSend();
void StartCommReceive();
void FileCommSend();
void FileCommReceive();
void VersionCommSend();
void VersionCommReceive();
BOOL CheckupFrame();
UINT32 GetFrameLength();
BOOL CheckupData(UINT8* pcData, UINT32 lDataLen, UINT32 lCheckCode, UINT16 nValueByteNum);
UINT32 GetDataCheckout(UINT8 *pcData, UINT32 lDataLen, UINT16 nValueByteNum);
void FormatFrame(UINT16 nType, void* pFrameInfo);
void UnformatFrame();
void ResendFrame(BOOL nResendFlag);
public:
void ConverseInt( UINT32* pSourceInt, UINT16 nByteCount);
BOOL StartupComm(COMMINFO stCommInfo);
UINT32 GetEndCommFlag();
INT32 TransferAndAnalyse(UINT32 length, UINT8 *rec_info, BOOL bAllDo = 1);
UINT32 GetCommRecLength( void );
UINT32 GetCommSendLength();
void GetSendData(UINT8* pcSendInfo);
void GetRecCommInfo(COMMINFO* pstCommInfo);
void ResendOnOvertime();
UINT32 GetResendNum();
// 清除通讯标志,包括清除:1、接收和发送内容 2、通讯标志 3、通讯状态
void ClearCommStatus(void);
void SetCpuIsSame(BOOL bFlag);
BOOL SetFrameSize(UINT32 nFrameSize);
UINT32 GetFrameDataMaxSize();
// BOOL SetDynamicSendFileMode(BOOL bIsDynamicSendFile, UINT32 (*func)(UINT8* pFileName, UINT16 nCurFilePackNo, UINT8* pCurFileInfo, UINT32 lLength) = NULL);
BOOL SetDynamicSendFileMode(BOOL bIsDynamicSendFile, UINT32 (*func)(UINT16 nCurFilePackNo, UINT8* pCurFileInfo, UINT32 lLength) = NULL);
};
#endif // !defined(AFX_COMMPROTOCOL_H__5DD269FC_CE24_4876_9791_54CCAC384BAE__INCLUDED_)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -