51单⽚机printf重定向
从keil的帮助⽂档⾥我们可以看到,printf是基于putchar实现的,所以我们只要重新实现putchar,就可以实现printf的重定向,即可以
将printf⽤在其他串⼝上。
putchar的函数实现在…/C51/LIB下可以到。
#include<reg51.h>
#define XON  0x11
#define XOFF 0x13
/*
* putchar (full version):  expands '\n' into CR LF and handles
*                          XON/XOFF (Ctrl+S/Ctrl+Q) protocol
*/
char putchar(char c){
有没有解释c语言程序的软件if(c =='\n'){
if(RI){
if(SBUF == XOFF){
do{
RI =0;
while(!RI);
}
while(SBUF != XON);
RI =0;
}
}
while(!TI);
TI =0;
java语言程序设计考试SBUF =0x0d;/* output CR  */
}
二郎神和三圣母是什么关系if(RI){
if(SBUF == XOFF){
do{
putchar函数RI =0;
while(!RI);
}
python3下载哪个版本while(SBUF != XON);
RI =0;
}
}
while(!TI);
TI =0;
return(SBUF = c);
}
我们来分析⼀下代码,⾸先我们先不管那两个if判断,putchar函数总是要执⾏的语句其实只有三句,⾸先先等待上⼀个数据发送完毕,将标志位置零以后,再发送下⼀个数据。这也解释了为什么我们在第⼀次调⽤printf函数时要先把TI置1,因为STC单⽚机复位以后TI的值为0,直接调⽤printf函数就会⼀直卡死在while(!TI)⾥⾯了。
while(!TI);
TI =0;
return(SBUF = c);
if(c == '\n')部分是判断是否接收到换⾏符,如果接收到换⾏符以后,就会输出CR+LF。SBUF = 0X0d是在输出CR,推测LF是在putchar函数之外输出的。
最后if(RI)部分是软件流控制。当接收端数据缓存区满了以后,就会向发送端发送XOFF标志,发送端接收到XOFF以后停⽌发送数据。接收端处理完数据以后,会向发送端发送XON标志,表⽰可以继续发送数据。
使⽤流控制可以有效的防⽌数据传输过程中的丢失情况。
分析完官⽅的putchar函数以后,我们需要⾃⼰写⼀个putchar函数来调⽤串⼝3,这⾥要说明⼀下,如果我们的⼯程中包含了putchar函数,编译器会优先使⽤我们所定义的函数,⽽不会去使⽤…/C51/LIB下的putchar函数。
下⾯是我写的putchar函数,因为没有那么⾼的要求,所以我并没有使⽤流控制,其次我的代码是先发送数据,再检测标志位,我认为这样做更符合我们平时的使⽤习惯。
char putchar(char c)
{
if(c =='\n')
{
S3BUF =0x0d;
while(!(S3CON & S3TI));//等待发送成功
S3CON &=~S3TI;
matlab 数组赋值/* output CR  */
}
S3BUF = c;
while(!(S3CON & S3TI));//等待发送成功
S3CON &=~S3TI;//清除发送中断标志
return c;
}
我们只需要将这个putchar函数包含在⼯程中,然后初始化串⼝3,便可以利⽤printf打印串⼝了。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。