⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 srecview.c

📁 嵌入式开发中常用到 Motorola 公司的 S-Record 格式文件
💻 C
字号:
/*
	Motorola 公司之 S-Record 文件查看程序。

	  File: srec.c
	  Date: March 30, 2005.

	Copyright (c) 2005, ChipLink Software Labs. All Rights Reserved.
*/
#include <stdio.h>
#include <stdlib.h>


/* ASCII to digit */
#define	a2d(x)		((((x)>='0') && ((x)<='9'))?((x)-'0'):((x)-'A'+10))


int	main( int argc, char ** argv )
{
	FILE	*	fp;
	char		buf[80+1], * p;
	unsigned char	val, len, sum, cnt=0, i;

	unsigned long	addr;


	if( argc !=2 )
	{
		printf("Usage: srec s-recorder_file_name\n");
		return	-1;
	}


	fp = fopen( argv[1], "rt" );
	if( !fp )
	{
		printf("Cannot open file: %s\n", argv[1] );
		return	-2;
	}


	/*
	组成一个S-记录的5个字段如下:
	+------------+------------+---------+--------------+----------+
	|  记录类型  |  记录长度  |  地址   |   代码/数据  |  校验和  |
	+------------+------------+---------+--------------+----------+
	*/

	do {
		if( fgets( buf, 80, fp )==NULL ) break;

		/* S-记录文件每行必以字母 'S' 开头 */
		if( buf[0]!='S' ) continue;

		
		/* S-记录文件只有 S0, S1, S2, S3, S5, S7, S8, S9 共八种记录类型 */
		if( buf[1]!='0' && buf[1]!='1' && buf[1]!='2' && buf[1]!='3' &&
		    buf[1]!='5' && buf[1]!='7' && buf[1]!='8' && buf[1]!='9' ) continue;


		sum = 0;
		len = (a2d(buf[2])<< 4) | a2d(buf[3]);

		/* CheckSum 长度为 2 字节,为记录长度、地址、代码/数据字段数值之和的反码 */
		sum += len;

		sum += ((a2d(buf[4])<<4) | a2d(buf[5]));
		sum += ((a2d(buf[6])<<4) | a2d(buf[7]));

		switch( buf[1] )
		{
		case	'0':		/* S0 是记录头, 应还原成字符显示 */
			len -= 2;
			addr = (a2d(buf[4])<<12) | (a2d(buf[5])<<8) | (a2d(buf[6])<<4) | a2d(buf[7]) ;
			p = buf+8;
			break;
		case	'1':
		case	'9':
			len -= 2;
			addr = (a2d(buf[4])<<12) | (a2d(buf[5])<<8) | (a2d(buf[6])<<4) | a2d(buf[7]) ;
			p = buf+8;
			cnt++;
			break;
		case	'2':
		case	'8':
			sum += ((a2d(buf[8])<<4) | a2d(buf[9]));
			len -= 3;
			addr = (a2d(buf[4])<<20) | (a2d(buf[5])<<16) | (a2d(buf[6])<<12) | (a2d(buf[7])<<8) | (a2d(buf[8])<<4) | a2d(buf[9]) ;
			p = buf+10;
			cnt++;
			break;
		case	'3':
		case	'7':
			sum += ((a2d(buf[8])<<4) | a2d(buf[9]));
			sum += ((a2d(buf[10])<<4) | a2d(buf[11]));
			len -= 4;
			addr = (a2d(buf[4])<<28) | (a2d(buf[5])<<24) | (a2d(buf[6])<<20) | (a2d(buf[7])<<16) | (a2d(buf[8])<<12) | (a2d(buf[9])<<8) | (a2d(buf[10])<<4) | a2d(buf[11]) ;
			p = buf+12;
			cnt++;
			break;
		case	'5':
			len -= 2;
			addr = (a2d(buf[4])<<12) | (a2d(buf[5])<<8) | (a2d(buf[6])<<4) | a2d(buf[7]) ;
			p = buf+8;
			break;
		}


		if( buf[1] == '0' )
		{
			printf("S-Record Information: " );

			for( i=0; i<(len-1); i++ )
			{
				val = ((a2d( *p )<<4) | a2d( *(p+1) ) );
				sum += val;
				printf("%c", val );
				p+=2;
			}

		}
		else if( buf[1] =='5' )
		{
			if( cnt != addr )
			{
				printf("S-record type 5: record count not match!\t");
			}
		}
		else 
		{
			printf("%08lx\t", addr );

			for( i=0; i<(len-1); i++)
			{
				val = ((a2d( *p )<<4) | a2d( *(p+1) ) );
				sum += val;

				printf("%02X ", val );
				
				p+=2;
			}
		}

		printf("\n");

		/* 验证校验和 */
		val = ((a2d( *p )<<4) | a2d( *(p+1) ) );
		if( val != (unsigned char)(~sum) )
		{
			printf("CheckSum error!\n");
		}

	} while( !feof(fp) );


	fclose(fp);

	return	0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -