原文排版远些乱,整理了一下。
1 #include <reg51.h>
2
3 #define XON 0x11 /*串口流控制符 启动*/
4 #define XOFF 0x13 /*串口流控制符 中断*/
5
6 /* putchar (full version): expands '\n' 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 == '\n') /*判断是否是换行符的原因,是因为字符串的标准格式是末尾为\r(回车符)\n(换行符)这两个字符*/
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 '\n' into CR LF 精简版
50 */
51 char putchar (char c)
52 {
53 if (c == '\n') /*还是判断字符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
来源:https://www.cnblogs.com/jqdy/p/12255620.html