原文排版远些乱,整理了一下。

 1 #include <reg51.h>
 2 
 3 #define XON  0x11            /*串口流控制符  启动*/
 4 #define XOFF 0x13            /*串口流控制符  中断*/
 5 
 6 /* putchar (full version):  expands '
' into CR LF and handles        完整版 每次发送数据都要检查sbuf是否有中断信号
 7  *XON/XOFF (Ctrl+S/Ctrl+Q) protocol                                    XON启动 XOFF中断      通信协议*/
 8 char putchar (char c)
 9 {
10     if (c == '
') /*判断是否是换行符的原因,是因为字符串的标准格式是末尾为(回车符)
(换行符)这两个字符*/
11     { 
12         if (RI) /*判断接收标识符是否为1,若为1则说明SBUF接受到了信息*/
13         {
14             if (SBUF == XOFF) /*判断SBUF中的信息是否为中断信号  是则执行以下程序*/
15             {
16                 do
17                 {
18                     RI = 0; /*将接收标识符置1 可以继续接收信息*/
19                     while (!RI); /*判断是否接收到了信息,是则往下循环*/
20                 }while (SBUF != XON); /*判断接收的信息是否为启动信息,是则退出循环,不是继续循环*/
21                 RI = 0; /*将接受标识符置1 可以继续接收信息*/
22             }
23         } /*只要c是换行符,最终都要执行这里判断发送标识符是否为1,只有为1才往下执行,这点非常重要调用printf函数时,必须将TI置1*/
24         while (!TI);
25         TI = 0; /*将TI置0 准备发送数据*/
26         SBUF = 0x0d; /* output CR  */          /*  发送回车符*/
27     }
28     if (RI) /*下面的if函数又是判断SBUF中是否接收了中断信号与上面的一样*/
29     {
30         if (SBUF == XOFF)
31         {
32             do
33             {
34                 RI = 0;
35                 while (!RI);
36             } while (SBUF != XON);
37             RI = 0; 
38         }
39     }
40     while (!TI); /*判断发送标识符是否为1*/
41     TI = 0; /*将TI置0 准备发送数据*/
42     return (SBUF = c); /*发送字符c*/
43 }
44 
45 
46 
47 #if 0  // comment out versions below
48 /*
49 * putchar (basic version): expands '
' into CR LF  精简版
50 */
51 char putchar (char c)
52 {              
53     if (c == '
') /*还是判断字符c是不是换行符*/
54     {
55         while (!TI); /*判断TI是否置1     为1向下执行*/
56         TI = 0;
57         SBUF = 0x0d; /* output CR  */       /* c是换行符先发送回车符*/
58     }
59     while (!TI); /*又是判断TI是否为1   为1向下执行*/
60     TI = 0; /*将TI置0 准备发送数据*/
61     return (SBUF = c); /*发送字符c*/
62 }
63 
64 
65 /*
66 * putchar (mini version): outputs charcter only  少了判断字符c是否为换行符的步骤
67 */
68 char putchar (char c)
69 {
70     while (!TI);  /*判断TI是否置1     为1向下执行*/
71     TI = 0;  /*将TI置0 准备发送数据*/
72     return (SBUF = c);  /*发送字符c*/
73 }                                                          
74 #endif