STC8A8K64D4(51系列单片机)printf打印数据异常的问题
问题现象
本人在使用 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 已经正确重定向到指定的串口上
/********************* 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 时,格式化数据是,使用上述表格中的格式化符号,具体测试如下:
/* 将函数放到 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打印数据异常的问题相关推荐
- uIP TCP/IP协议栈在51系列单片机上的应用
uIP 协议栈是一种免费的可实现的极小的TCP/IP协议栈,可以使用于由8位或16位微处理器构建的嵌入式系统.本文分析了uIP协议栈的结构和应用接口,并讨论了如何将其应用到51系列单片机上. 关键字: ...
- 51单片机除c语言 中断嵌套,关于51系列单片机中断嵌套 - 关于单片机中断嵌套总结...
关于51系列单片机中断嵌套 说最基本的,老的51单片机(80C51系列)有5个中断源,2个优先级,可以实现二级中断服务嵌套.现在很多扩展的51单片机已经有4个优先级(或更多)和更多的中断源了. 在说到 ...
- 51系列单片机采用脉冲宽度调制(PWM)
介绍一个51系列单片机采用脉冲宽度调制(PWM)方式控制LED灯亮度的一个程序,大家都知道,51单片机本身是没有pwm接口的,这个程序是 通过软件模拟pwm.在一定的频率的方波中,调整高电平和低电平的 ...
- C51/C52单片机printf打印出来的值是原来值的256倍
开发环境(蓝色粗体字为特别注意内容) 1,开发板:89C52RC. 2,开发环境:Keil uv5 在51单片机的KEIL程序中,使用printf("Voltage0:%d\r\n" ...
- 51系列单片机指令快速记忆法
随着微电子技术和超大规模集成电路技术的发展,单片微型计算机以其体积小.性价比 高.功能强.可靠性高等独有的特点,在各个领域(如工业控制.家电产品.汽车电子.通信.智能仪器仪表)得到了广泛的应用.学习. ...
- php语+言教程,写给thinkphp开发者的laravel系列教程(九)打印数据-Fun言
php这种脚本语言调试起来是很方便的: 大多时候看报错打印一下数据就知道问题所在了: php 内置了常用打印函数 print 和 var_dump : 但是打印出来的样式实在让人目瞪狗呆: think ...
- 利用51系列单片机定时器功能实现测量脉冲宽度
STC12C系列增强型单片机片上扩展了基本51单片机的功能,如提供了PCA/PWM接口,定时器能工作在1T模式下(基本51单片机的时钟是Fosc的12分频,1T模式下1分频). PCA可以用于脉宽测量 ...
- C++ nlohmann/json 的主要用法(cout、printf打印,异常try...catch处理)
文章目录 前言 准备工作 引用头文件: 主要用法: 一.声明与构造 1 纯粹声明 2 内容构造 二.解析与序列化 字符串 解析 序列化 文件:// 比如有文件 c:\rankings.json,其内容 ...
- 创意小发明:使用51系列单片机的DIY点焊机控制项目(程序+原理图)
各位早上好,最近一段时间全市不好的消息,南方的洪水已经超过了98年是史上最厉害的洪水,但愿灾难赶紧过去 最近做了一个用单片机的点焊机控制装置,使用的是89C51单片机.LCD5110显示屏和微型继电器 ...
- 新唐M480系列单片机写入dataflash数据
因为项目第一次接触新唐的单片机,其大部分功能和开发环境和STM32是相似或者一样的,所以很多操作可以借鉴STM32的开发方式.也有很多操作细节不太一样,这篇博客主要是记录我在开发过程中所遇到的问题. ...
最新文章
- 艰难的原创——谈互联网创业
- 修改java启动参数_如何修改jvm启动参数
- MYSQ 查看 2 进制日志
- Orchard Core 1.0.0 正式发布!
- php类常量的特点,php类常量是什么?类常量用法详解
- PTA-7-1 输出大写英文字母 (15分)(C语言)
- SqlServer性能检测之Sql语句排查
- 计算机上的证书安装不了,数字证书认不到怎么办?
- MPlyaer播放高清视频的说明(CoreAVC、提高速度和清晰度等问题)
- 四维图新地图坐标_四维图新:自动驾驶的“高精度地图世界观”
- 1147 Heaps (30分)
- 手持小电风扇原理图挂脖小风扇电路图
- 求最小公倍数的几种方法
- 魔兽争霸3 ce基址 偏移
- 【JavaScript联系练习】实现一个打点计时器
- NTFS,FAT32和exFAT文件系统的区别
- Tensorflow详解 命令行参数flags
- 程序员写好简历的五大技巧
- Cicero:一个单细胞染色质可及性实验可视化R包
- HDFS成员的工作机制