C8051f中用keil编程,printf()这个函数是不是直接向串口输?

2020-01-23 14:38发布

C8051f中用keil编程,printf()这个函数是不是直接向串口输出字符串?用这个函数时,输出的是哪个串口(我用的C8051f023有两个串口)?用这个函数时,串口是否要初始化?初始化时主要设置哪几个参数?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
tigeroser
1楼-- · 2020-01-24 16:59
printf()是库函数,你是找不到他的函数体的,有的只是一个原型声明。

你将putchar()函数的实现包含在自己的源程序中,这样编译器会优先使用你改写的putchar()函数,而不会去使用其他地方的putchar()函数。

XON、XOFF是流控制字符,你可以查一下ASCII码表,其实这两个宏定义的值就是退格和回车,只是接收到这两个字符做一下特殊处理而已
techbaby
2楼-- · 2020-01-24 19:46

以前项目中使用的代码,MCU貌似是C8051F520A

  1. /*
  2. ***************************************************************************************************
  3. *
  4. *                                           上海有限公司
  5. *                                              研    发    部
  6. *                                      Shanghai  Co.,Ltd
  7. *                                           All Rights Reserved
  8. *
  9. *------------------------------------------------文件信息------------------------------------------
  10. * 文   件          名:        uart0.c
  11. * 版                  本:        v0.0
  12. * 日                期:        2012.06.06
  13. * 作        者:
  14. * 描                述:        uart0串口通信
  15. ***************************************************************************************************
  16. */

  17. /*
  18. ***************************************************************************************************
  19. *                                        include files
  20. ***************************************************************************************************
  21. */
  22. // #pragma src
  23. #include "cpu.h"
  24. #include "uart0.h"
  25. #include "flash.h"
  26. #include "adc0.h"

  27. /*
  28. ***************************************************************************************************
  29. *                                       predefinition
  30. ***************************************************************************************************
  31. */
  32. /*
  33. ***************************************************************************************************
  34. *                                 constants &macros & variables
  35. ***************************************************************************************************
  36. */
  37. #define BAUDRATE    (9600)        // Baud rate of UART in bps

  38. FRAME frame;

  39. //-----------------------------------------------------------------------------
  40. // UART0_Init
  41. //-----------------------------------------------------------------------------
  42. //
  43. // Return Value : None
  44. // Parameters   : None
  45. //
  46. // Configure the UART0 using Timer1, for <BAUDRATE> and 8-N-1.
  47. //-----------------------------------------------------------------------------
  48. static void _UART0_Init (void)
  49. {
  50.    SCON0 = 0x10;         // SCON0: 8-bit variable bit rate
  51.                         //        level of STOP bit is ignored
  52.                               //        RX enabled
  53.                           //        ninth bits are zeros
  54.                           //        clear RI0 and TI0 bits
  55. #if (SYSCLK/BAUDRATE/2/256 < 1)
  56.         TH1 = -(SYSCLK/BAUDRATE/2);
  57.         CKCON &= ~0x0B;                  // T1M = 1; SCA1:0 = xx
  58.         CKCON |=  0x08;
  59. #elif (SYSCLK/BAUDRATE/2/256 < 4)
  60.         TH1 = -(SYSCLK/BAUDRATE/2/4);
  61.         CKCON &= ~0x0B;                  // T1M = 0; SCA1:0 = 01
  62.         CKCON |=  0x01;
  63. #elif (SYSCLK/BAUDRATE/2/256 < 12)
  64.         TH1 = -(SYSCLK/BAUDRATE/2/12);
  65.         CKCON &= ~0x0B;                  // T1M = 0; SCA1:0 = 00
  66. #else
  67.         TH1 = -(SYSCLK/BAUDRATE/2/48);
  68.         CKCON &= ~0x0B;                  // T1M = 0; SCA1:0 = 10
  69.         CKCON |=  0x02;
  70. #endif

  71.    TL1 = TH1;                          // Init Timer1
  72.    TMOD &= ~0xf0;                     // TMOD: timer 1 in 8-bit autoreload
  73.    TMOD |=  0x20;
  74.    TR1 = 1;                                // START Timer1
  75.    TI0 = 1;                                  // Indicate TX0 ready

  76.         ET1  = 1;                         // Timer1 interrupt enabled
  77.        
  78. //    ES0 = 1;                                 // Enable UART0 interrupt
  79. }

  80. /*
  81. ***************************************************************************************************
  82. * 函数名称: uart0_init()
  83. * 输   入:
  84. * 输   出:
  85. * 作   者:
  86. * 日   期: 2012.06.15
  87. * 功能描述: uart0 init
  88. ***************************************************************************************************
  89. */
  90. void uart0_init(void)
  91. {
  92.         _UART0_Init();
  93.         frame.flag = FALSE;
  94. }

  95. /*
  96. * putchar (basic version): expands ' ' into CR LF
  97. */
  98. char putchar (char c)  
  99. {
  100.           if (c == ' ')  
  101.           {
  102.             while (!TI0);
  103.             TI0 = 0;
  104.             SBUF0 = 0x0d;         /* output CR  */
  105.           }

  106.         while (!TI0);

  107.           TI0 = 0;
  108.           return (SBUF0 = c);
  109. }

  110. /*
  111. ***************************************************************************************************
  112. * 函数名称: uart0_init()
  113. * 输   入:
  114. * 输   出:
  115. * 作   者:
  116. * 日   期: 2012.06.15
  117. * 功能描述: uart0 init
  118. ***************************************************************************************************
  119. */
  120. void frame_scan(void)
  121. {
  122.         if (frame.flag == TRUE)
  123.         {
  124.                 if ((FRAME_START == frame.buf[0])         /* 帧开始 */
  125.                  && (FRAME_STOP == frame.buf[3]))        /* 帧结束 */
  126.                 {
  127.                         if (FRAME_TYPE_V == frame.buf[1])        /* 帧类型:电压V */
  128.                         {
  129.                                 if (FRAME_TYPE_INC == frame.buf[2])        /* 修改类型:增加 */
  130.                                 {
  131.                                         flash_change(TYPE_VOLTAGE, flash_voltage_value + ADC_VOLTAGE_MAX/2500);
  132.                                         printf("SV+P ");
  133.                                 }
  134.                                 else if (FRAME_TYPE_DEC == frame.buf[2])         /* 修改类型:减少 */
  135.                                 {
  136.                                         flash_change(TYPE_VOLTAGE, flash_voltage_value - ADC_VOLTAGE_MAX/2500);       
  137.                                         printf("SV-P ");
  138.                                 }
  139.                         }
  140.                         else if (FRAME_TYPE_I == frame.buf[1])        /* 帧类型:电流I */
  141.                         {
  142.                                 if (FRAME_TYPE_INC == frame.buf[2])        /* 修改类型:增加 */
  143.                                 {
  144.                                         flash_change(TYPE_CURRENT, flash_current_value + 2);
  145.                                         printf("SI+P ");
  146.                                 }
  147.                                 else if (FRAME_TYPE_DEC == frame.buf[2])         /* 修改类型:减少 */
  148.                                 {
  149.                                         flash_change(TYPE_CURRENT, flash_current_value - 2);
  150.                                         printf("SI-P ");
  151.                                 }
  152.                         }       
  153.                 }
  154.                
  155.                 frame.flag = FALSE;
  156.         }
  157. }

  158. /*
  159. ***************************************************************************************************
  160. * 函数名称: uart0_init()
  161. * 输   入:
  162. * 输   出:
  163. * 作   者:
  164. * 日   期: 2012.06.15
  165. * 功能描述: uart0 init
  166. ***************************************************************************************************
  167. */
  168. // static void uart0_isr(void) interrupt INTERRUPT_UART0
  169. // {
  170. //         static bool flag = FALSE;
  171. //         static int8u cnt;

  172. //         if (RI0)
  173. //         {
  174. //                 if (frame.flag == FALSE)
  175. //                 {
  176. //                         if (flag == TRUE)
  177. //                         {
  178. //                                 frame.buf[cnt++] = SBUF0;

  179. //                                 if (cnt > FRAME_BUF_MAX - 1)
  180. //                                 {
  181. //                                         cnt = 0;
  182. //                                         frame.flag = TRUE;       
  183. //                                         flag = FALSE;
  184. //                                 }
  185. //                         }
  186. //                         else
  187. //                         {
  188. //                                 frame.buf[0] = SBUF0;
  189. //                                
  190. //                                 if (FRAME_START == frame.buf[0])
  191. //                                 {
  192. //                                         cnt = 1;
  193. //                                         flag = TRUE;
  194. //                                 }               
  195. //                         }       
  196. //                 }                       
  197. //         }
  198. //        
  199. //         RI0 = 0;
  200. //         TI0 = 0;       
  201. // }
复制代码
techbaby
3楼-- · 2020-01-24 22:26
 精彩回答 2  元偷偷看……
tigeroser
4楼-- · 2020-01-25 02:07
techbaby 发表于 2014-5-27 22:14
以前项目中使用的代码,MCU貌似是C8051F520A

近楼主的意思
这段程序中的Putchar();用的应该是keil目录下的库函数,这样printf就直接用程序中的putchar();了

流控制是通信协议,协调速率匹配问题。。。。。。这些东西属于计算机的知识吧,不容易真正理解
tigeroser
5楼-- · 2020-01-25 05:10
techbaby 发表于 2012-6-19 11:52
要学会查找keil帮助文件!

学习了。

一周热门 更多>