搜索
bottom↓
回复: 12

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

[复制链接]

出0入0汤圆

发表于 2012-6-19 11:41:11 | 显示全部楼层 |阅读模式
C8051f中用keil编程,printf()这个函数是不是直接向串口输出字符串?用这个函数时,输出的是哪个串口(我用的C8051f023有两个串口)?用这个函数时,串口是否要初始化?初始化时主要设置哪几个参数?

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出20入70汤圆

发表于 2012-6-19 11:52:18 | 显示全部楼层
要学会查找keil帮助文件!


int printf (
  const char *fmtstr       /* format string */
  <[>, arguments ... <]>);   /* additional arguments */

The printf function formats a series of strings and numeric values and builds a string to write to the output stream using the putchar function. The fmtstr argument is a format string that may be composed of characters, escape sequences, and format specifications.

在keil安装文件目录\C51\LIB中,找到PUTCHAR.C文件,将其包含进工程文件中,并修改。

/*
* putchar (full version):  expands '\n' into CR LF and handles
*                          XON/XOFF (Ctrl+S/Ctrl+Q) protocol
*/
char putchar (char c)  {

  if (c == '\n')  {
    if (RI)  {
      if (SBUF == XOFF)  {
        do  {
          RI = 0;
          while (!RI);
        }
        while (SBUF != XON);
        RI = 0;
      }
    }
    while (!TI);
    TI = 0;
    SBUF = 0x0d;                         /* output CR  */
  }
  if (RI)  {
    if (SBUF == XOFF)  {
      do  {
        RI = 0;
        while (!RI);
      }
      while (SBUF != XON);
      RI = 0;
    }
  }
  while (!TI);
  TI = 0;
  return (SBUF = c);
}


上面的寄存器明显不是C8051串口的寄存器,需要修改。


出20入70汤圆

发表于 2012-6-19 11:54:00 | 显示全部楼层
使用printf之前,要先配置串口的,如波特率,数据格式等。

出0入0汤圆

发表于 2012-6-26 17:52:08 | 显示全部楼层
楼上写的很仔细...赞一个

出0入0汤圆

发表于 2012-6-26 18:00:45 | 显示全部楼层
以前还真没注意到....

出0入0汤圆

 楼主| 发表于 2012-6-26 20:13:02 | 显示全部楼层
看了一下,有点收获。

出0入0汤圆

发表于 2013-7-5 11:27:19 | 显示全部楼层

出0入0汤圆

发表于 2014-5-27 21:39:46 | 显示全部楼层
techbaby 发表于 2012-6-19 11:52
要学会查找keil帮助文件!

还是有些不懂,再此请教一下:
首先我确定printf是通过操作SBUF来实现的,
keil中stdio.h中有函数extern int printf   (const char *, ...);说明printf是外部的函数,怎么找到它的函数体,虽然它是通过putchar()实现的。

2-------putchar.c文件中有3个一样的函数体char putchar (char c) {},那printf是怎么区分调用这些函数的


还有一问题就是putchar.c中定义的
#define XON  0x11
#define XOFF 0x13
代表什么意思


以上的问题让我觉得关于标准C语言的用法,还是什么也不会。。。。


希望能指点一下!  

出20入70汤圆

发表于 2014-5-27 22:09:31 | 显示全部楼层
printf()是库函数,你是找不到他的函数体的,有的只是一个原型声明。

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

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

出20入70汤圆

发表于 2014-5-27 22:14:06 | 显示全部楼层

以前项目中使用的代码,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 '\n' into CR LF
  97. */
  98. char putchar (char c)  
  99. {
  100.           if (c == '\n')  
  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\r\n");
  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\r\n");
  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\r\n");
  146.                                 }
  147.                                 else if (FRAME_TYPE_DEC == frame.buf[2])         /* 修改类型:减少 */
  148.                                 {
  149.                                         flash_change(TYPE_CURRENT, flash_current_value - 2);
  150.                                         printf("SI-P\r\n");
  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. // }
复制代码

出0入0汤圆

发表于 2014-5-27 22:37:03 | 显示全部楼层
techbaby 发表于 2014-5-27 22:09
printf()是库函数,你是找不到他的函数体的,有的只是一个原型声明。

你将putchar()函数的实现包含在自 ...

懂了一步,但是putchar.c中的3个程序是一样的(我没看错吧)它是怎么有区分的调用的,这些和流控制、计算机语言之类的有关吧
要关门了,明天研究一下

出0入0汤圆

发表于 2014-5-28 08:17:03 | 显示全部楼层
techbaby 发表于 2014-5-27 22:14
以前项目中使用的代码,MCU貌似是C8051F520A

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

流控制是通信协议,协调速率匹配问题。。。。。。这些东西属于计算机的知识吧,不容易真正理解

出0入0汤圆

发表于 2014-6-5 20:21:44 | 显示全部楼层
techbaby 发表于 2012-6-19 11:52
要学会查找keil帮助文件!

学习了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 12:29

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表