问题现象
本人在使用 STC8A8K64D4 的单片机做一个项目,使用 printf 函数打印一个带参数的调试信息时出现异常(已经正确重定向了 printf 函数),具体表现定义了8位的变量使用%X格式打印出的值却变成了16位,且赋值为0后任然打印出16位的随即数值;然后定义了一个16位的变量,使用 %d 格式化打印,也不能正确打印变量的值,而且打印其他异常的值,使用串口发送单字节的函数,分别发送高八位和低八位,又能正确将变量的值打印出来;且将数据格式化成字符串 使用 %s 就能正常打印数据
问题的解决
通过查阅资料,51 单片机 通过 printf 打印格式化数据的时候,不能使用 %d 之类的占位符,转而使用以下占位符:
待打印数据的大小 | 格式化的符号 | 备注 |
---|
占位符 8位 | bd/bu | bd:有符号8位数据 bu:无符号8位数据 | 占位符 16位 | hd/hu | hd:有符号16位数据 hu:无符号16位数据 | 占位符 32位 | ld/lu | ld:有符号32位数据 lu:无符号32位数据 |
- 首先需要确定 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
- 51 单片机使用 printf 时,格式化数据是,使用上述表格中的格式化符号,具体测试如下:
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个字节
|