原文排版远些乱,整理了一下。
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