当前位置: 首页 > 工具软件 > D4X > 使用案例 >

STC8A8K64D4(51系列单片机)printf打印数据异常的问题

龚凯泽
2023-12-01

问题现象

本人在使用 STC8A8K64D4 的单片机做一个项目,使用 printf 函数打印一个带参数的调试信息时出现异常(已经正确重定向了 printf 函数),具体表现定义了8位的变量使用%X格式打印出的值却变成了16位,且赋值为0后任然打印出16位的随即数值;然后定义了一个16位的变量,使用 %d 格式化打印,也不能正确打印变量的值,而且打印其他异常的值,使用串口发送单字节的函数,分别发送高八位和低八位,又能正确将变量的值打印出来;且将数据格式化成字符串 使用 %s 就能正常打印数据

问题的解决

通过查阅资料,51 单片机 通过 printf 打印格式化数据的时候,不能使用 %d 之类的占位符,转而使用以下占位符:

待打印数据的大小格式化的符号备注
占位符 8位bd/bubd:有符号8位数据 bu:无符号8位数据
占位符 16位hd/huhd:有符号16位数据 hu:无符号16位数据
占位符 32位ld/luld:有符号32位数据 lu:无符号32位数据
  1. 首先需要确定 printf 已经正确重定向到指定的串口上
/********************* Printf 重定向函数 ************************/
#if(PRINTF_SEL == 1)

char putchar(char c)
{
	TX1_write2buff(c);
	return c;
}

#elif(PRINTF_SEL == 2)

char putchar(char c)
{
	TX2_write2buff(c);
	return c;
}

#elif(PRINTF_SEL == 3)

char putchar(char c)
{
	TX3_write2buff(c);
	return c;
}

#elif(PRINTF_SEL == 4)

char putchar(char c)
{
	TX4_write2buff(c);
	return c;
}

#endif
  1. 51 单片机使用 printf 时,格式化数据是,使用上述表格中的格式化符号,具体测试如下:
/* 将函数放到 mian 函数里执行一遍 查看打印的值 */
void test51printf(void)
{
	 unsigned char a = 128;
	 char 	b = -15 ;
	 unsigned short c = 256;
	 short d = -25;
	 unsigned int 	e = 65535;
	 int f = -32765;

	printf("a=%bu b=%bd c=%hu d=%hd e=%hu f=%hd \r\n",a,b,c,d,e,f);
	printf("\r\n size(a)=%bu,size(c)=%bu,size(e)=%bu \r\n"  ,sizeof(a),sizeof(c),sizeof(e));
}

打印的结果如下:

a=128 b=-15 c=256 d=-25 e=65535 f=-32765 

size(a)=1,size(c)=2,size(e)=2

数据能够正常打印,问题解决!

PS:51单片机中 int = short int = 2个字节

 类似资料: