|
楼主 |
发表于 2008-3-7 06:20:55
|
显示全部楼层
>> 精简指令集的mkII协议
//JTAGICE mkII 的数据帧格式描述
# define AT_MF_MESSAGE_START 0x1B
# define AT_MF_SEQUENCE_NUMBER_TYPE UINT16
# define AT_MF_MESSAGE_SIZE_TYPE UINT32
# define AT_MF_TOKEN 0x0E
# define AT_MF_USE_CRC_CHECK
//STK500 的数据帧格式描述
# define AT_MF_MESSAGE_START 0x1B
# define AT_MF_SEQUENCE_NUMBER_TYPE UINT8
# define AT_MF_MESSAGE_SIZE_TYPE UINT16
# define AT_MF_TOKEN 0x0E
# define AT_MF_USE_XOR_CHECK
//(ATMEL公司下载协议数据帧的描述结构体)ATMEL Message Format Struct Description
typdef struct ATMEL_Message_Format
{
BYTE chMSGStart; //AT_MF_MESSAGE_START
AT_MF_SEQUENCE_NUMBER_TYPE SequenceNumber;
AT_MF_MESSAGE_SIZE_TYPE MessageSize;
BYTE chToken; //AT_MF_TOKEN
BYTE * pchMessageBody;
#if defined(AT_MF_USE_CRC_CHECK)
UINT16 wCRC;
#elif defined(AT_MF_USE_XOR_CHECK)
BYTE chXOR;
#else
#error Please select a Checking method: AT_MF_USE_CRC_CHECK or AT_MF_USE_XOR_CHECK.
#endif
}AT_MF;
# define SEND_MSG(__SEQ,__SIZE,__BUFF) \
{\
AT_MF_Send_MSG(MSG_MODEL_RESET,(__SEQ),(__SIZE),(__BUFF));\
while(AT_MF_Send_MSG(MSG_MODEL_SOLID,(__SEQ),(__SIZE),(__BUFF)));\
};
# define SEND_RSP_SYMPLE_MSG(__MSG) \
{\
UINT8 chTempData = (__MSG);\
SEND_MSG\
(\
SEQNumber,\
(AT_MF_MESSAGE_SIZE_TYPE)0x01,\
(void *)&chTempData\
)\
}
# define SEND_RSP_OK SEND_RSP_SYMPLE_MSG(RSP_OK)
# define SEND_RSP_FAILED SEND_RSP_SYMPLE_MSG(RSP_FAILED)
# define SEND_RSP_ILLEGAL_PARAMETER SEND_RSP_SYMPLE_MSG(RSP_ILLEGAL_PARAMETER)
# define SEND_RSP_ILLEGAL_VALUE SEND_RSP_SYMPLE_MSG(RSP_ILLEGAL_VALUE)
# define SEND_RSP_ILLEGAL_EMULATOR_MODE SEND_RSP_SYMPLE_MSG(RSP_ILLEGAL_EMULATOR_MODE)
/********************
* 用户变量类型定义 *
********************/
typedef struct MCUVersion MCU_VER;
typedef struct ProductDescription PRODUCT_DESCRIPTION;
typedef BOOL (* PARAMETER_PROC_FUNC)(AT_MF_SEQUENCE_NUMBER_TYPE SEQNumber,
UINT8 chAccessMode,void *pData);
typedef struct ParameterProccessItem PARAMETER_PROC_ITEM;
/********************
* 模块结构体定义区 *
********************/
struct MCUVersion
{
BYTE BootLoaderVersion;
BYTE FirmwareVersionMinor;
BYTE FirmwareVersionMajor;
BYTE HardwareVersion;
};
struct ParameterProccessItem
{
UINT8 chParameterID;
unsigned R:1;
unsigned W:1;
unsigned ByteCount:3;
unsigned :3;
PARAMETER_PROC_FUNC fnParameterPROC;
};
struct ProductDescription
{
BYTE chString[sizeof(DEVICE_ID_STR)];
};
1
数据包解析状态机(暂未加入超时处理)
/********************
* 用户变量类型定义 *
********************/
typedef struct AT_MF_MSGItem AT_MF_MSG_ITEM;
typedef BOOL (* AT_FM_MSG_PROC_FUNC)(AT_MF_MESSAGE_SIZE_TYPE MessageSize,
BYTE chData);
/********************
* 模块结构体定义区 *
********************/
typedef struct AT_MF_MSGItem
{
BYTE chMessageID;
AT_FM_MSG_PROC_FUNC fnMSGHandler;
};
/********************
* 模块变量声明区 *
********************/
#ifndef AT_MF_INSERT_MSG_MAP_ITEM
# define AT_MF_INSERT_MSG_MAP_ITEM {NULL,NULL}
# warning There is nothing in Message Map!
#endif
static AT_MF_MSG_ITEM s_AT_MF_MSGMap[] =
{
AT_MF_INSERT_MSG_MAP_ITEM
};
数据包解析函数
# define PAMA_ACTION_FLAG SET_BIT8_FORMAT(s_chActionFlag)
# define PAMA_STOP_ALL_ACTIONS s_chActionFlag = NULL;
# define PAMA_START PAMA_ACTION_FLAG.BIT0
# define PAMA_GET_SEQUENCE_NUMBER PAMA_ACTION_FLAG.BIT1
# define PAMA_GET_MESSAGE_SIZE PAMA_ACTION_FLAG.BIT2
# define PAMA_GET_TOKEN PAMA_ACTION_FLAG.BIT3
# define PAMA_GET_MESSAGE_ID PAMA_ACTION_FLAG.BIT4
# define PAMA_CALL_MSG_ROUTINE PAMA_ACTION_FLAG.BIT5
/***********************************************************
* 函数说明:ATMEL下载协议数据包解析函数 *
* 输入: 无 *
* 输出: TRUE *
* 调用函数:无 *
***********************************************************/
BOOL PROC_AT_Message_Access(void)
{
static UINT8 s_chActionFlag = NULL;
BYTE chData = 0;
#if defined(AT_MF_USE_CRC_CHECK)
static UINT16 s_wCRC = CRC_INIT;
#elif defined(AT_MF_USE_XOR_CHECK)
static UINT8 s_chXOR = 0;
#endif
static UINT8 s_chSequenceNUMCounter = 0;
static UINT8 s_chMessageSizeCounter = 0;
static AT_MF_SEQUENCE_NUMBER_TYPE s_CurrentSEQNumber = 0;
static AT_MF_MESSAGE_SIZE_TYPE s_MessageSize = 0;
static AT_FM_MSG_PROC_FUNC s_fnMessagePROC = NULL;
if (!SERIAL_IN(chData))
{
//缓冲区为空
return TRUE;
}
if (s_chActionFlag == NULL)
{
PAMA_START = TRUE;
}
if (PAMA_START)
{
//等待数据帧头部
if (chData == AT_MF_MESSAGE_START)
{
s_chSequenceNUMCounter = 0;
s_CurrentSEQNumber = 0;
#if defined(AT_MF_USE_CRC_CHECK)
s_wCRC = CRC_INIT;
CRC(s_wCRC,chData);
#elif defined(AT_MF_USE_XOR_CHECK)
s_chXOR = 0;
s_chXOR ^= chData;
#endif
PAMA_GET_SEQUENCE_NUMBER = TRUE;
PAMA_START = FALSE;
return TRUE;
}
}
if (PAMA_GET_SEQUENCE_NUMBER)
{
s_CurrentSEQNumber |= (AT_MF_SEQUENCE_NUMBER_TYPE)chData
<< (8 * s_chSequenceNUMCounter);
#if defined(AT_MF_USE_CRC_CHECK)
CRC(s_wCRC,chData);
#elif defined(AT_MF_USE_XOR_CHECK)
s_chXOR ^= chData;
#endif
s_chSequenceNUMCounter++;
if (
s_chSequenceNUMCounter
== sizeof(AT_MF_SEQUENCE_NUMBER_TYPE)
)
{
//获得了整个Sequence Number
s_chMessageSizeCounter = 0;
s_MessageSize = 0;
PAMA_GET_MESSAGE_SIZE = TRUE;
PAMA_GET_SEQUENCE_NUMBER = FALSE;
return TRUE;
}
}
if (PAMA_GET_MESSAGE_SIZE)
{
s_MessageSize |= (AT_MF_MESSAGE_SIZE_TYPE)chData
<< (8 * s_chMessageSizeCounter);
#if defined(AT_MF_USE_CRC_CHECK)
CRC(s_wCRC,chData);
#elif defined(AT_MF_USE_XOR_CHECK)
s_chXOR ^= chData;
#endif
s_chMessageSizeCounter++;
if (
s_chMessageSizeCounter
== sizeof(AT_MF_MESSAGE_SIZE_TYPE)
)
{
//获得了整个Message Size
PAMA_GET_TOKEN = TRUE;
PAMA_GET_MESSAGE_SIZE = FALSE;
return TRUE;
}
}
if (PAMA_GET_TOKEN)
{
if (chData == AT_MF_TOKEN)
{
//数据包正确
#if defined(AT_MF_USE_CRC_CHECK)
CRC(s_wCRC,chData);
#elif defined(AT_MF_USE_XOR_CHECK)
s_chXOR ^= chData;
#endif
PAMA_GET_MESSAGE_ID = TRUE;
PAMA_GET_TOKEN = FALSE;
}
else
{
//数据包不正确
//有待添加代码
PAMA_STOP_ALL_ACTIONS
}
return TRUE;
}
if (PAMA_GET_MESSAGE_ID)
{
UINT8 n = 0;
s_fnMessagePROC = NULL;
//搜索消息地图
for (n = 0;n < UBOUND(s_AT_MF_MSGMap);n++)
{
if (s_AT_MF_MSGMap[n].chMessageID == chData)
{
s_fnMessagePROC = s_AT_MF_MSGMap[n].fnMSGHandler;
break;
}
}
if (s_fnMessagePROC == NULL)
{
s_fnMessagePROC = AT_MF_DEFAULT_MESSAGE_ROUTINE;
}
PAMA_GET_MESSAGE_ID = FALSE;
PAMA_CALL_MSG_ROUTINE = TRUE;
}
if (PAMA_CALL_MSG_ROUTINE)
{
if (!s_fnMessagePROC(s_CurrentSEQNumber,s_MessageSize,chData,
#if defined(AT_MF_USE_CRC_CHECK)
s_wCRC
#elif defined(AT_MF_USE_XOR_CHECK)
s_chXOR
#endif
))
{
//完成了子状态机的调用
PAMA_STOP_ALL_ACTIONS
return TRUE;
}
}
return TRUE;
}
数据包发送函数(ver2.41)
# define AMSM_ACTION_FLAG SET_BIT8_FORMAT(s_chActionFlag)
# define AMSM_STOP_ALL_ACTIONS s_chActionFlag = NULL;
# define AMSM_START AMSM_ACTION_FLAG.BIT0
# define AMSM_SEND_HEAD AMSM_ACTION_FLAG.BIT1
# define AMSM_SEND_SEQUENCE_NUM AMSM_ACTION_FLAG.BIT2
# define AMSM_SEND_MESSAGE_SIZE AMSM_ACTION_FLAG.BIT3
# define AMSM_SEND_TOKEN AMSM_ACTION_FLAG.BIT4
# define AMSM_SEND_DATA AMSM_ACTION_FLAG.BIT5
# define AMSM_SEND_CHECK AMSM_ACTION_FLAG.BIT6
# define AMSM_IDEL AMSM_ACTION_FLAG.BIT7
/***********************************************************
* 函数说明: 数据包发送函数 *
* 输入: 数据包序列号,要发送数据的大小,数据缓冲区 *
* 工作模式 *
* 输出: 状态机是否继续运行 *
* 调用函数: 无 *
* -------------------------------------------------------- *
* [ 说 明 ] 该函数仅适用于大数据包的发送。 *
***********************************************************/
BOOL AT_MF_Send_MSG(UINT8 chModel,AT_MF_SEQUENCE_NUMBER_TYPE SEQNumber,
AT_MF_MESSAGE_SIZE_TYPE MSGSize,
void *pMSGBody)
{
static UINT8 s_chActionFlag = NULL;
static UINT8 n = 0;
static BYTE *p = NULL;
static AT_MF_MESSAGE_SIZE_TYPE s_MessageSize = 0;
#if defined(AT_MF_USE_CRC_CHECK)
static UINT16 wCRC = 0;
#elif defined(AT_MF_USE_XOR_CHECK)
static UINT8 chXOR = 0;
#endif
if (chModel == 0xFF)
{
AMSM_STOP_ALL_ACTIONS
return FALSE;
}
if (s_chActionFlag == NULL)
{
AMSM_START = TRUE;
}
if (AMSM_START)
{
s_MessageSize = MSGSize;
if ((pMSGBody == NULL) || (MSGSize == 0))
{
//强壮性检测,不需要发送任何东西
AMSM_STOP_ALL_ACTIONS
return FALSE;
}
#if defined(AT_MF_USE_CRC_CHECK)
wCRC = 0;
#elif defined(AT_MF_USE_XOR_CHECK)
chXOR = 0;
#endif
AMSM_START = FALSE;
AMSM_SEND_HEAD = TRUE;
}
if (AMSM_SEND_HEAD)
{
if (SERIAL_OUT(AT_MF_MESSAGE_START))
{
//发送成功
n = 0;
AMSM_SEND_SEQUENCE_NUM = TRUE;
AMSM_SEND_HEAD = FALSE;
}
else
{
REFRESH_SERIAL_BUFFER
}
}
if (AMSM_SEND_SEQUENCE_NUM)
{
p = (BYTE *)&SEQNumber;
while(TRUE)
{
if (SERIAL_OUT(p[n]))
{
//发送成功
n++;
if (n == sizeof(AT_MF_SEQUENCE_NUMBER_TYPE))
{
//发送数据完成
n = 0;
AMSM_SEND_MESSAGE_SIZE = TRUE;
AMSM_SEND_SEQUENCE_NUM = FALSE;
break;
}
}
else
{
REFRESH_SERIAL_BUFFER
break;
}
}
}
if (AMSM_SEND_MESSAGE_SIZE)
{
p = (BYTE *)&MSGSize;
while(TRUE)
{
if (SERIAL_OUT(p[n]))
{
//发送成功
n++;
if (n == sizeof(AT_MF_MESSAGE_SIZE_TYPE))
{
//发送数据完成
AMSM_SEND_TOKEN = TRUE;
AMSM_SEND_MESSAGE_SIZE = FALSE;
break;
}
}
else
{
REFRESH_SERIAL_BUFFER
break;
}
}
}
if (AMSM_SEND_TOKEN)
{
if (SERIAL_OUT(AT_MF_TOKEN))
{
//发送成功
n = 0;
AMSM_SEND_DATA = TRUE;
AMSM_SEND_TOKEN = FALSE;
}
}
if (AMSM_SEND_DATA)
{
p = (BYTE *)pMSGBody;
while(TRUE)
{
UINT8 chTempData = 0;
if (chModel)
{
//单字节模式
chTempData = *p;
}
else
{
chTempData = p[n];
}
if (SERIAL_OUT(chTempData))
{
//发送成功
#if defined(AT_MF_USE_CRC_CHECK)
CRC(wCRC,chTempData) //计算CRC16
#elif defined(AT_MF_USE_XOR_CHECK)
chXOR ^= chTempData; //计算XOR
#endif
n++;
if (n == s_MessageSize)
{
//发送完成
n = 0;
AMSM_SEND_CHECK = TRUE;
AMSM_SEND_DATA = FALSE;
break;
}
else
{
if (chModel)
{
//单字节工作模式
return FALSE;
}
}
}
else
{
REFRESH_SERIAL_BUFFER
break;
}
}
}
if (AMSM_SEND_CHECK)
{
#if defined(AT_MF_USE_CRC_CHECK)
p = (BYTE *)&wCRC;
#elif defined(AT_MF_USE_XOR_CHECK)
p = (BYTE *)&chXOR;
#endif
while(TRUE)
{
if (SERIAL_OUT(p[n]))
{
//发送成功
n++;
#if defined(AT_MF_USE_CRC_CHECK)
if (n == 2)
#elif defined(AT_MF_USE_XOR_CHECK)
if (n == 1)
#endif
{
//整个数据包发送完成
if (chModel)
{
//单字节工作模式
AMSM_SEND_CHECK = FALSE;
AMSM_IDEL = TRUE;
return FALSE;
}
else
{
AMSM_STOP_ALL_ACTIONS;
return FALSE;
}
}
}
else
{
REFRESH_SERIAL_BUFFER
break;
}
}
}
if (AMSM_IDEL)
{
return FALSE;
}
return TRUE;
}
mkII参数设定消息地图解析函数
/***********************************************************
* 函数说明: mkII参数设定消息处理函数 *
* 输入: 消息的尺寸 收到的数据 *
* 输出: 状态机是否继续运行 *
* 调用函数: 无 *
***********************************************************/
BOOL mkII_Write_Emulator_Parameter(AT_MF_SEQUENCE_NUMBER_TYPE SEQNumber,
AT_MF_MESSAGE_SIZE_TYPE MessageSize,BYTE chData,
UINT16 wCRC)
{
static AT_MF_MESSAGE_SIZE_TYPE s_Counter = 0;
static UINT16 s_wCRC = CRC_INIT;
static BYTE s_ParameterBuffer[4] = {0};
static UINT8 s_chParameterID = 0;
static BYTE s_chCRCReceive[2] = {0};
if (MessageSize == 0)
{
s_Counter = 0;
return FALSE;
}
s_Counter++;
if (s_Counter == 1)
{
s_wCRC = wCRC;
CRC(s_wCRC,chData);
TYPE_CONVERSION(s_ParameterBuffer,UINT32) = 0;
s_chParameterID = 0;
}
else if (s_Counter == 2)
{
CRC(s_wCRC,chData);
s_chParameterID = chData;
}
else if (s_Counter <=MessageSize)
{
CRC(s_wCRC,chData);
s_ParameterBuffer[s_Counter - 3] = chData;
}
else if (s_Counter == MessageSize + 1)
{
s_chCRCReceive[0] = chData;
}
else if (s_Counter == MessageSize + 2)
{
s_Counter = 0;
s_chCRCReceive[1] = chData;
if (TYPE_CONVERSION(s_chCRCReceive,UINT16) == s_wCRC)
{
//接收到了正确的数据包
UINT8 n = 0;
BOOL bFindParameter = FALSE;
for (n = 0;n < UBOUND(s_ParameterMSGMap);n++)
{
if (s_ParameterMSGMap[n].chParameterID == s_chParameterID)
{
bFindParameter = TRUE;
if (!s_ParameterMSGMap[n].W)
{
//错误的参数模式
SEND_RSP_ILLEGAL_EMULATOR_MODE
return FALSE;
}
if (!s_ParameterMSGMap[n].fnParameterPROC
(
SEQNumber,
PARAMTER_WRITE,
s_ParameterBuffer
)
)
{
//错误的参数模式
SEND_RSP_ILLEGAL_EMULATOR_MODE
}
return FALSE;
}
}
if (!bFindParameter)
{
//无效的参数
SEND_RSP_ILLEGAL_PARAMETER
}
}
return FALSE;
}
return TRUE;
}
让Studio认出我们的mkII
一些在mkII_Config.h中的关键宏
# define AT_MF_MESSAGE_START 0x1B
# define AT_MF_SEQUENCE_NUMBER_TYPE UINT16
# define AT_MF_MESSAGE_SIZE_TYPE UINT32
# define AT_MF_TOKEN 0x0E
# define AT_MF_USE_CRC_CHECK
# define MKII_MASTER_VERSION 0xFF,0x21,0x04,0x00
# define MKII_SLAVE_VERSION 0xFF,0x21,0x04,0x01
# define MKII_SERIAL_NUMBER 0x00,0xB0,0x00,0x00,0x41,0xB9
# define DEVICE_ID_STR "Snail JTAGICE mkII for Mega Made by Gorgon Meducer"
# define AT_MF_INSERT_MSG_MAP_ITEM \
{CMND_GET_SIGN_ON,mkII_Get_Sign_On},\
{CMND_SIGN_OFF,mkII_Sign_OFF},\
{CMND_SET_PARAMETER,mkII_Write_Emulator_Parameter}
/*
//STK500 的数据帧格式描述
# define AT_MF_MESSAGE_START 0x1B
# define AT_MF_SEQUENCE_NUMBER_TYPE UINT8
# define AT_MF_MESSAGE_SIZE_TYPE UINT16
# define AT_MF_TOKEN 0x0E
# define AT_MF_USE_XOR_CHECK
*/
# define AT_MF_DEFAULT_MESSAGE_ROUTINE mkII_Failed
# define REFRESH_SERIAL_BUFFER PROC_Serial_Transmitter();
# include "RD_UseATMELMessageFrame.h"
# include "mkII_MSGMap.h"
# include "mkII_Access.h"
/***********************************************************
* 函数说明: mkII停止DEBUG操作消息处理函数 *
* 输入: 消息的尺寸 收到的数据 *
* 输出: 状态机是否继续运行 *
* 调用函数: 无 *
***********************************************************/
BOOL mkII_Sign_OFF(AT_MF_SEQUENCE_NUMBER_TYPE SEQNumber,
AT_MF_MESSAGE_SIZE_TYPE MessageSize,BYTE chData,
UINT16 wCRC)
{
static AT_MF_MESSAGE_SIZE_TYPE s_Counter = 0;
if (MessageSize == 0)
{
s_Counter = 0;
return FALSE;
}
s_Counter++;
if (
s_Counter == MessageSize + 2
)
{
chData = s_Counter;
s_Counter = 0;
g_chBaudRate = 0x04;
//SEND_RSP_OK;
{
BYTE chBuffer
[
3 +
sizeof(AT_MF_SEQUENCE_NUMBER_TYPE) +
sizeof(AT_MF_MESSAGE_SIZE_TYPE) +
+ 2
] = {0};
chBuffer[0] = AT_MF_MESSAGE_START;
TYPE_CONVERSION
(
&chBuffer[1],
AT_MF_SEQUENCE_NUMBER_TYPE
) = (AT_MF_SEQUENCE_NUMBER_TYPE)SEQNumber;
TYPE_CONVERSION
(
&chBuffer[1 + sizeof(AT_MF_SEQUENCE_NUMBER_TYPE)],
AT_MF_MESSAGE_SIZE_TYPE
) = (AT_MF_MESSAGE_SIZE_TYPE)0x01;
chBuffer
[
1 +
sizeof(AT_MF_SEQUENCE_NUMBER_TYPE) +
sizeof(AT_MF_MESSAGE_SIZE_TYPE)
] = AT_MF_TOKEN;
chBuffer
[
1 +
sizeof(AT_MF_SEQUENCE_NUMBER_TYPE) +
sizeof(AT_MF_MESSAGE_SIZE_TYPE) +
1
] = RSP_OK;
//计算交验
{
UINT16 wCRC = CRC_INIT;
UINT8 n = 0;
for (n = 0;n < sizeof(chBuffer) - 2;n++)
{
CRC(wCRC,chBuffer[n]);
}
TYPE_CONVERSION
(
&chBuffer
[
1 +
sizeof(AT_MF_SEQUENCE_NUMBER_TYPE) +
sizeof(AT_MF_MESSAGE_SIZE_TYPE) +
2
],
UINT16
) = wCRC;
}
//这是一个使用查询模式发送数据包的函数
Put_Char(chBuffer,sizeof(chBuffer));
}
//修改通讯波特率
Set_USART_Baud_Rate(g_chBaudRate);
return FALSE;
}
return TRUE;
}
/***********************************************************
* 函数说明: mkII下载器存在状态查询消息处理函数 *
* 输入: 消息的尺寸 收到的数据 *
* 输出: 状态机是否继续运行 *
* 调用函数: 无 *
***********************************************************/
BOOL mkII_Get_Sign_On(AT_MF_SEQUENCE_NUMBER_TYPE SEQNumber,
AT_MF_MESSAGE_SIZE_TYPE MessageSize,BYTE chData,
UINT16 wCRC)
{
static AT_MF_MESSAGE_SIZE_TYPE s_Counter = 0;
static UINT16 s_wCRC = CRC_INIT;
static BYTE s_chCRCReceive[2] = {0};
if (MessageSize == 0)
{
s_Counter = 0;
s_wCRC = wCRC;
return FALSE;
}
s_Counter++;
if (s_Counter == 1)
{
s_wCRC = wCRC;
CRC(s_wCRC,chData);
}
else if (s_Counter == 2)
{
s_chCRCReceive[0] = chData;
}
else if (s_Counter == 3)
{
s_chCRCReceive[1] = chData;
if (TYPE_CONVERSION(s_chCRCReceive,UINT16) == s_wCRC)
{
//接收到了正确的信息
BYTE Buffer[8 + sizeof(MCU_VER) * 2 + sizeof(DEVICE_ID_STR)];
//发送指令
Buffer[0] = RSP_SIGN_ON;
//发送通讯协议版本
Buffer[1] = 0x01;
//发送主从CPU版本号
TYPE_CONVERSION(&Buffer[2],MCU_VER) = Master;
TYPE_CONVERSION(&Buffer[6],MCU_VER) = Slave;
//发送序列号
{
UINT8 n = 0;
for (n = 0;n < UBOUND(SerialNumber);n++)
{
Buffer[2+sizeof(MCU_VER) * 2 + n] = SerialNumber[n];
}
}
//发送字符串
TYPE_CONVERSION
(
&Buffer[2+sizeof(MCU_VER) * 2]+ UBOUND(SerialNumber),
PRODUCT_DESCRIPTION
) = PDescription;
SEND_MSG(SEQNumber,sizeof(Buffer),Buffer);
}
else
{
//数据包交验错误,更新统计表
//直接丢包即可
}
}
//接收可能的其他信息,提高兼容性
if (
s_Counter == MessageSize + 2
)
{
s_Counter = 0;
return FALSE;
}
return TRUE;
}
/***********************************************************
* 函数说明: 无效的指令 *
* 输入: 消息的尺寸 收到的数据 *
* 输出: 状态机是否继续运行 *
* 调用函数: 无 *
***********************************************************/
BOOL mkII_Failed(AT_MF_SEQUENCE_NUMBER_TYPE SEQNumber,
AT_MF_MESSAGE_SIZE_TYPE MessageSize,BYTE chData,
UINT16 wCRC)
{
static AT_MF_MESSAGE_SIZE_TYPE s_Counter = 0;
if (MessageSize == 0)
{
s_Counter = 0;
return FALSE;
}
s_Counter++;
if (
s_Counter == MessageSize + 2
)
{
SEND_RSP_FAILED
chData = s_Counter;
s_Counter = 0;
return FALSE;
}
return TRUE;
} |
|