【STC8A8K64D4系列单片机】__prinf()串口打印u8等类型异常

目录

一、问题描述:

二、现状分析:

三、找出原因:

表三-1 常用变量类型输出格式含义

表三-2 其他变量类型输出格式含义

四、解决方案:

(* ̄︶ ̄)创作不易!期待你们的 点赞、收藏和评论喔。


一、问题描述:

        最近公司有个《很小很小很小的项目》让我尝试着去接手,该项目是用STC单片机开发一个无线采集终端。该项目有个重要的内容是“串口输出日志打印功能”,当然,这是个很不值得一提的功能开发,但是却不像传统STM32中 printf 函数的输出格式。

  1. 我在工程中定义了8位的变量使用%X格式打印出的值却变成了16位,且赋值为0后却打印出16位的“随机数值”;
  2. 然后定义了一个16位的变量,使用 %d 格式化打印,也不能正确打印变量的值。
  3. 打印其他异常的值,使用串口发送单字节的函数,分别发送高八位和低八位,又能正确将变量的值打印出来

二、现状分析:

小立确定 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

三、找出原因:

        通过查阅资料,小立发现51单片机系列通过 printf()函数 打印格式化数据的时候,使用 %d 、%X之类的格式符是无效的,所以才会产生随机数的情况!在STC单片机中,变量类型输出格式含义如下二表:

表三-1 常用变量类型输出格式含义

格式含义类型
%bd一个字节、有符号char
%bu一个字节、无符号unsigned char
%hd两个字节、有符号short
%hu两个字节、无符号unsigned short
%ld四个字节、有符号int
%lu四个字节、无符号unsigned int

表三-2 其他变量类型输出格式含义

Type ArgumentType InputFormat
dintSigned decimal number.
uunsigned intUnsigned decimal number.
ounsigned intUnsigned octal number.
xunsigned intUnsigned hexadecimal number using “0123456789abcedf”.
Xunsigned intUnsigned hexadecimal number using “0123456789ABCDEF”.
ffloat

Floating-point number formatted as<[>-<]>dddd.dddd.

%.1f(输出保留1位小数)

efloatFloating-point number formatted as<[>-<]>d.dddde<[>-<]>dd.
EfloatFloating-point number formatted as<[>-<]>d.ddddE<[>-<]>dd.
gfloatFloating-point number using either the e or f format, whichever is more compact for the specified value and precision.
GfloatFloating-point number using either the E or f format, whichever is more compact for the specified value and precision.
ccharA single character.
s*A string of characters terminated by a null character (‘\0’).
p*A generic pointer formatted as t:aaaa where t is the memory type and aaaa is the hexadecimal address.

       !!!特别注意: 51单片机中 int 为2个字节

四、测试与解决问题:

        通过上述资料,我尝试着输出六种常用的数据类型:

unsigned char q = 127;
char 	w = -66 ;
unsigned short e = 255;
short r = -222;
unsigned int 	t = 65534;
int y = -12345;

printf("q=%bu w=%bd e=%hu r=%hd t=%hu y=%hd \r\n",q,w,e,r,t,y);

调试助手正确输出打印结果:

q=128  w=-15  e=256  r=-25  t=65535  y=-32765


(* ̄︶ ̄)创作不易!期待你们的 点赞收藏评论喔。

要在Keil中下载STC8A8K64D4系列单片机,可以按照以下步骤进行操作: 1. 首先,确保已经安装了Keil软件,并且软件的版本支持该系列单片机。 2. 在STC官方网站上下载STC8A8K64D4的芯片资料和软件开发包。这些文件通常是一个压缩文件,里面包含了所需的驱动程序和库文件。 3. 解压下载的压缩文件,在文件夹中找到一个名称为"Keil"或者"MDK"的文件夹,这个文件夹包含了Keil所需的相关文件。 4. 打开Keil软件,在菜单栏中选择"Project" -> "Open Project",然后从文件对话框中选择刚刚解压的文件夹中的".uvproj"文件。 5. 在Keil的工程管理器中,可以看到项目的源文件和其他相关文件。如果项目中有需要的库文件,可以将它们添加到工程中。 6. 在Keil的工具栏中,选择目标芯片型号和其他相关选项。在这个步骤中,需要选择STC8A8K64D4作为目标芯片。 7. 配置编译和下载选项,例如编译选项、下载方式和目标地址等。 8. 点击Keil的工具栏中的"Build"或者"Rebuild"按钮,进行编译。 9. 在编译成功后,点击Keil的工具栏中的"Download"按钮,开始下载程序到STC8A8K64D4芯片中。 10. 下载完成后,可以使用Keil提供的调试器和其他工具进行单片机的调试和测试。 以上是一个简单的STC8A8K64D4系列单片机在Keil中下载的步骤,具体步骤可能因Keil软件版本和操作系统的不同而略有差异。如果遇到问题,可以参考Keil的官方文档或者与STC官方的技术支持团队联系以获得更详细的帮助。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rleco.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值