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