问题现象

本人在使用 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位数据
  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个字节

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

  1. uIP TCP/IP协议栈在51系列单片机上的应用

    uIP 协议栈是一种免费的可实现的极小的TCP/IP协议栈,可以使用于由8位或16位微处理器构建的嵌入式系统.本文分析了uIP协议栈的结构和应用接口,并讨论了如何将其应用到51系列单片机上. 关键字: ...

  2. 51单片机除c语言 中断嵌套,关于51系列单片机中断嵌套 - 关于单片机中断嵌套总结...

    关于51系列单片机中断嵌套 说最基本的,老的51单片机(80C51系列)有5个中断源,2个优先级,可以实现二级中断服务嵌套.现在很多扩展的51单片机已经有4个优先级(或更多)和更多的中断源了. 在说到 ...

  3. 51系列单片机采用脉冲宽度调制(PWM)

    介绍一个51系列单片机采用脉冲宽度调制(PWM)方式控制LED灯亮度的一个程序,大家都知道,51单片机本身是没有pwm接口的,这个程序是 通过软件模拟pwm.在一定的频率的方波中,调整高电平和低电平的 ...

  4. C51/C52单片机printf打印出来的值是原来值的256倍

    开发环境(蓝色粗体字为特别注意内容) 1,开发板:89C52RC. 2,开发环境:Keil uv5 在51单片机的KEIL程序中,使用printf("Voltage0:%d\r\n" ...

  5. 51系列单片机指令快速记忆法

    随着微电子技术和超大规模集成电路技术的发展,单片微型计算机以其体积小.性价比 高.功能强.可靠性高等独有的特点,在各个领域(如工业控制.家电产品.汽车电子.通信.智能仪器仪表)得到了广泛的应用.学习. ...

  6. php语+言教程,写给thinkphp开发者的laravel系列教程(九)打印数据-Fun言

    php这种脚本语言调试起来是很方便的: 大多时候看报错打印一下数据就知道问题所在了: php 内置了常用打印函数 print 和 var_dump : 但是打印出来的样式实在让人目瞪狗呆: think ...

  7. 利用51系列单片机定时器功能实现测量脉冲宽度

    STC12C系列增强型单片机片上扩展了基本51单片机的功能,如提供了PCA/PWM接口,定时器能工作在1T模式下(基本51单片机的时钟是Fosc的12分频,1T模式下1分频). PCA可以用于脉宽测量 ...

  8. C++ nlohmann/json 的主要用法(cout、printf打印,异常try...catch处理)

    文章目录 前言 准备工作 引用头文件: 主要用法: 一.声明与构造 1 纯粹声明 2 内容构造 二.解析与序列化 字符串 解析 序列化 文件:// 比如有文件 c:\rankings.json,其内容 ...

  9. 创意小发明:使用51系列单片机的DIY点焊机控制项目(程序+原理图)

    各位早上好,最近一段时间全市不好的消息,南方的洪水已经超过了98年是史上最厉害的洪水,但愿灾难赶紧过去 最近做了一个用单片机的点焊机控制装置,使用的是89C51单片机.LCD5110显示屏和微型继电器 ...

  10. 新唐M480系列单片机写入dataflash数据

    因为项目第一次接触新唐的单片机,其大部分功能和开发环境和STM32是相似或者一样的,所以很多操作可以借鉴STM32的开发方式.也有很多操作细节不太一样,这篇博客主要是记录我在开发过程中所遇到的问题. ...

最新文章

  1. 艰难的原创——谈互联网创业
  2. 修改java启动参数_如何修改jvm启动参数
  3. MYSQ 查看 2 进制日志
  4. Orchard Core 1.0.0 正式发布!
  5. php类常量的特点,php类常量是什么?类常量用法详解
  6. PTA-7-1 输出大写英文字母 (15分)(C语言)
  7. SqlServer性能检测之Sql语句排查
  8. 计算机上的证书安装不了,数字证书认不到怎么办?
  9. MPlyaer播放高清视频的说明(CoreAVC、提高速度和清晰度等问题)
  10. 四维图新地图坐标_四维图新:自动驾驶的“高精度地图世界观”
  11. 1147 Heaps (30分)
  12. 手持小电风扇原理图挂脖小风扇电路图
  13. 求最小公倍数的几种方法
  14. 魔兽争霸3 ce基址 偏移
  15. 【JavaScript联系练习】实现一个打点计时器
  16. NTFS,FAT32和exFAT文件系统的区别
  17. Tensorflow详解 命令行参数flags
  18. 程序员写好简历的五大技巧
  19. Cicero:一个单细胞染色质可及性实验可视化R包
  20. HDFS成员的工作机制

热门文章

  1. 微信小程序 + Bmob后端云
  2. 学习笔记——STM32摄像头OV7725(二)
  3. Remix Icon
  4. qlv文件怎么转成mp4格式?qlv转mp4格式步骤详解
  5. CentOS-7磁盘扩容之殇
  6. 索迪斯携手喜茶致敬白衣天使、慰问抗疫英雄
  7. 利用canvas画一个钟表
  8. STM32CubeMX | 36 - 使用CAN总线进行双板通信(TJA1050)
  9. 【CRM】CRM开发中常用表
  10. 云服务器连接不上怎么办