最近本人在开发一个设计,单片机用到的是LPC936,主要的功能是要刷新LCD与扫描键盘,在必要的时候还要不断的接收COM口通过RS485发送过来的数据。开始做的时候,也没有考虑太多,直接用到这两个库函数来接收数据与发送数据,调试时出现了让人难受的问题,键盘灵敏度极低,按好几下还是没有反应,这是作为产品所不能容许的,没办法,我抽了点时间仔细分析了这两个库函数。现把分析结果给大家作参考,在开发通信项目时少走弯路。
库函数printf( )的发送原理:首先在初始化时要把TI置1,如果不这样做,你的程序是会一直在JNB TI,$这条指令上跑,可能还不理解,以下是这个printf( )库函数发送流程图:
从以上流程图我想大家明白了它的发送原理,从KEIL的模拟发送字节结果来看,发送一个字节用了1042.39us,此波特率发送一位的时间为130.30us,936单片机执行一条单周期指令的时间为180.8ns到361.7ns。如果发送多个字节,可以算一下,在顺序执行时,浪费的时间是相当大的,在发送一个字节如果用中断,那么发送一个字节的1042.39us时间可以用来做主程序里面的事,如扫描键盘与刷新LCD,如果转换成可以执行的指令的条数大约为:2882到5765条!!!
系统参数:晶振:11.0592,单片机:LPC936,BAND:9600bps
库函数scanf( )的接收原理:
对这个函数,从模拟结果来看,当接收完到接收下一个数据用时为34.18us,对于9600bps的UART接收一个字节用时833.3us,在这个时间内如果转换成可以执行的指令条数大约为:2304到4608条!!!如果想多接收几个,浪费的时间就是这个数据的倍数,对于想不断的接收数据的系统来说,这个功能函数是不可取的了,用方便是我们喜欢这个函数的地方,但也给系统资源带来了极大的浪费。所以对于通信来说,功能函数是方便,但不一定都可取的。