S19文件每行数据组成
说明 | 类型 | 长度 N | 地址 | 数据 | 校验 |
---|---|---|---|---|---|
字符串个数 | 2 | 2 | 4/6/8 | N*2-(4/6/8)-2 | 2 |
类型
pS19FileFormat->DataType
用于描述记录类型: S0,S1,S2,S3,S5,S7,S8,S9
长度
用于记录地址+数据+校验所占字节数0x00~0xFF
地址
pS19FileFormat->AbsAddr
地址长度和作用由类型决定:
S0 :地址占2个字符串,用0x0000占位,此行表示程序的开始,不需烧入memory
S1 :地址占4个字符串,标记后面数据所在起始地址。
S2 :地址占6个字符串,标记后面数据所在起始地址。
S3 :地址占8个字符串,标记后面数据所在起始地址。
S5 :地址占2个字符串,包含了先前传输的S1、S2、S3记录的计数。没有数据。
S7 :地址占8个字符串,标记程序开始执行地址,文件结束。没有数据。不需烧入memory。
S8 :地址占6个字符串,标记程序开始执行地址,文件结束。没有数据。不需烧入memory。
S9 :地址占2个字符串,标记程序开始执行地址,文件结束。没有数据。不需烧入memory。
校验
以S9030000FC为例
Sum=0x03+0x00+0x00=0x03
CheckSum=0xFF-Sum=0xFC
//S9030000FC
char Str[]="S9030000FC";
char tempStr[1024];
strcpy(tempStr, &(strchr(Str, 'S'))[2]);
//tempStr除去\n的大小
DataLen = strcspn(tempStr, "\n");//原有代码Str是从文本里读出的所以会有“\n”
if (DataLen > 512)//S19文件一行去除类型的字符串个数最多FF*2+2=512
{
LOGERROR("S19Format Error %d Line Data too long", pS19FileFormat->CurrentLine);
return 0;
}
HexStrToByte(tempStr, tempByte, DataLen);
//tempByte已经删除了类型
//S19文件每行的CheckSum
pS19FileFormat->CheckSum = tempByte[tempByte[0]];
//计算数据实际CheckSum
for (i = 0; i < tempByte[0]; i++)
{
tempCheckSum += tempByte[i];
}
tempCheckSum = 0xFF - tempCheckSum;
if (tempCheckSum != pS19FileFormat->CheckSum)
{
//Error;
}