普中开源电子分享网

 找回密码
 立即注册
搜索
查看: 5423|回复: 0

单片机KEIL软件下库函数scanf( ) 与printf( )的“爱”与“恨”

 关闭 [复制链接]

139

主题

382

帖子

1531

积分

金牌会员

Rank: 6Rank: 6

积分
1531
发表于 2015-9-11 16:12:01 | 显示全部楼层 |阅读模式
本帖最后由 scholarship 于 2015-9-11 16:11 编辑

最近本人在开发一个设计,主要的功能是要刷新LCD与扫描键盘,在必要的时候还要不断的接收COM口通过RS485发送过来的数据。开始做的时候,也没有考虑太多,直接用到这两个库函数来接收数据与发送数据,调试时出现了让人难受的问题,键盘灵敏度极低,按好几下还是没有反应,这是作为产品所不能容许的,没办法,我抽了点时间仔细分析了这两个库函数。现把分析结果给大家作参考,在开发通信项目时少走弯路。

库函数printf( )的发送原理:首先在初始化时要把TI置1,如果不这样做,你的程序是会一直在JNB TI,$这条指令上跑,可能还不理解,以下是这个printf( ) 库函数发送流程图:




系统参数:晶振:11.0592,单片机PC936,BAND:9600bps

从以上流程图我想大家明白了它的发送原理,从KEIL的模拟发送字节结果来看,发送一个字节用了1042.39us,此波特率发送一位的时间为130.30us,936单片机执行一条单周期指令的时间为180.8ns到361.7ns。如果发送多个字节,可以算一下,在顺序执行时,浪费的时间是相当大的,在发送一个字节如果用中断,那么发送一个字节的1042.39us时间可以用来做主程序里面的事,如扫描键盘与刷新LCD,如果转换成可以执行的指令的条数大约为:2882到5765条!!!

    库函数scanf( )的接收原理:




对这个函数,从模拟结果来看,当接收完到接收下一个数据用时为34.18us,对于9600bps的UART接收一个字节用时833.3us,在这个时间内如果转换成可以执行的指令条数大约为:2304到4608条!!!如果想多接收几个,浪费的时间就是这个数据的倍数,对于想不断的接收数据的系统来说,这个功能函数是不可取的了,用方便是我们喜欢这个函数的地方,但也给系统资源带来了极大的浪费。所以对于通信来说,功能函数是方便,但不一定都可取的。\
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|普中开源电子分享网 粤ICP备16123577号-2

GMT+8, 2024-5-5 16:07 , Processed in 0.202923 second(s), 30 queries .

Powered by 论坛搭建 X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表