摘要:
    当我们在调试代码时,通常需要将程序中的某个变量打印至PC机上,来判断我们的程序是否按预期的运行,printf函数很好的做到了这一点,它能直接以字符的方式输出变量名和变量的值,printf函数在使用时,不仅仅要初始化串口,还需要其它的一些设置或者要调用其它的一些函数,否则printf函数将不能按我们想要的方式执行。

由于不同的编译器studio函数不一样,所以使用的方法也不一样,这需要大家去看编译器的help,这里我以STM32、LPC24和AVR整理了几个串口打印程序,供需要的朋友参考。

简介:
   1、在KEIL下使用printf函数,以STM32为例
    在uart.c中添加如下代码

/*******************************************************************************
    函数名:fputc
    输  入:
    输  出:
    功能说明:
    重定义putc函数,这样可以使用printf函数从串口1打印输出
*/
int fputc(int ch, FILE *f)
{
    /* Place your implementation of fputc here */
    /* e.g. write a character to the USART */
    USART_SendData(USART1, (uint8_t) ch);

/* Loop until the end of transmission */
    while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
    {}

return ch;
}

/*******************************************************************************
    函数名:fputc
    输  入:
    输  出:
    功能说明:
    重定义getc函数,这样可以使用scanff函数从串口1输入数据
*/
int fgetc(FILE *f)
{
    /* 等待串口1输入数据 */
    while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET)
    {}

return (int)USART_ReceiveData(USART1);
}
    这样,只要在需要用printf的文件里#include <stdio.h>就可以了,printf会自已的调用fputc函数来实现串口数据的输出。
2、添加Retarget.c,实现在KEIL下使用printf函数,以LPC2478为例
    首先在Keil安装目录下面ARM/Startup/Retarget.c找到Retarget.c文件将其复制到你的工程文件夹下面;并将其加入到工程中
    在uart.c中添加如下代码

// Implementation of sendchar (also used by printf function to output data) 
   int sendchar (int ch) {                 // Write character to Serial Port 
   while (!(U0LSR & 0x20)); 
  return (U0THR = ch); 

int getkey (void)  {                     // Read character from Serial Port 
  while (!(U0LSR & 0x01)); 
  return (U0RBR); 
}
    这样,只要在需要用printf的文件里#include <stdio.h>就可以了,printf会通过Retarget中的fputc函数调用sendchar来实现串口数据的输出。
   事实上,和第一种的方式是一样的。
3、自定义printf函数,以AVR为例
   前面介绍的是在KEIL编译器上使用printf函数,但不是所有的编译器平台都能适用,因此有时候我们需要自定义printf函数,下面以AVR在GCC下为例
   在usart.c中添加如下代码

#include    <stdio.h>
#include    <stdarg.h>

/*********************************************************/
//向串口usart0发送一个字节函数   
 void Uart0_putchar( unsigned char sdbyte)  
 {
     UDR0=sdbyte;
     while(!(UCSR0A&0x40));
     UCSR0A|=0x40;
 }

////////////////////////////////////////////////////////
void Uart0_printf(char *str,...)
{
 char  buf[128];
 unsigned char i = 0;
 va_list ptr;
 va_start(ptr,str);
 vsprintf(buf,str,ptr);
 while(buf[i])
 {
     Uart0_putchar(buf[i]);
     i++;
 }
}
结语:
   有了printf格式化输出函数,调试起来就方便多了。

如何在单片机上使用printf函数(printf)(avr)(stm)(lpc)(单片机)(转)的更多相关文章

  1. 关于printf函数输出先后顺序的讲解!!

    对于printf函数printf("%d%d\n",a,b);函数的实际输出顺序是这样的先计算出b,然后在计算a,接着输出a,最后在输出b:例子如下:#include<ios ...

  2. C笔记01:关于printf函数输出先后顺序的讲解

    关于printf函数输出先后顺序的讲解!! 对于printf函数printf("%d%d\n", a, b);函数的实际输出顺序是这样的先计算出b,然后再计算a,接着输出a,最后再 ...

  3. 【C语言】模拟实现printf函数(可变参数)

    一.printf函数介绍 printf功能 printf函数是格式化输出函数,一般用于向标准输出设备按规定格式输出信息. printf原型 int printf( const char* format ...

  4. 单片机中printf函数的重映射

    单片机中printf函数的重映射 一.源自于:大侠有话说 1.如果你在学习单片机之前学过C语言,那么一定知道printf这个函数.它最最好用的功能 除了打印你想要的字符到屏幕上外,还能把数字进行格式化 ...

  5. 【转】stm32CubeMx上移植自己的printf()和scanf()函数

    要想printf()和scanf() 函数工作,我们需要把printf()和scanf() 重新定向到串口中.重定向是指用户可以自己重写C 的库函数,当连接器检查到用户编写了与C 库函数相同名字的函数 ...

  6. STM32 printf函数

    /******************** (C) COPYRIGHT 2012 WildFire Team *************************** * 文件名 :usart1.c * ...

  7. s3c2440——实现裸机的简易printf函数

    在单片机开发中,我们借助于vsprintf函数,可以自己实现一个printf函数,但是,那是IDE帮我们做了一些事情. 刚开始在ARM9裸机上自己写printf的实现的时候,包含对应头文件也会提示vs ...

  8. Linux Linux下特殊的printf函数和fputs函数

    Linux下,printf函数必须以'\n'结尾才会立刻输出到屏幕,如果没有'\n'直到输出缓冲区满了以后才会打印到屏幕上(敲击换行也算),如果需要不换行的输出,一般可以使用write函数代替.'\n ...

  9. 关于printf函数的所思所想

    缘起大一下学期,C语言程序设计徐小青老师的随口一提,经娄嘉鹏老师提醒,我觉得应该自己整理清楚这一问题.涉及网上资料将会标明出处. 关于printf函数的所思所想 * printf的定义 printf( ...

随机推荐

  1. jquery和css3实现的很酷的菜单导航

    今天为大家带来的是jquery和css3实现的不错的导航菜单.点击列表图表后,内容页面向内移动显示菜单项.当单击关闭菜单按钮时,菜单项隐藏,内容页恢复原位.看下图 在线预览   源码下载 我们看下实现 ...

  2. 一款纯css3实现的超炫动画背画特效

    之前为大家介绍了很多款由纯css3实现的特效.今天要再给大家带来一款纯css3实现的超炫动画背画特效.代码非常简单,没有引用任何其它js代码.css代码也不多.效果非常炫.一起看下效果图: 在线预览  ...

  3. slimphp中间件调用流程的理解

    slimphp是一款微型php框架,主要是处理http请求,并调用合适的程序处理,并返回一个http响应. 它遵循php的psr7规范,可以很方便的集成其它遵循psr7规范的php组建. 当读到中间件 ...

  4. WampServer安装环境

    今天在阿里云ESC服务器上,用的Window Server2012版本,安装WampServer时,报错msvcr100.dll缺失.上网下了好几次,也确定是64位的放到了C:\Windows\Sys ...

  5. 【Unity/Kinect】Kinect实现UI控件的点击

    用体感来实现UI控件的点击,如点击按钮. 做法:用一个图片表示左手手掌,图片位置追踪左手手掌移动,当手掌位于UI控件的矩形内时,握拳表示点击该控件. using UnityEngine; using ...

  6. 【WPF】弹窗定位、弹窗关闭后再打开的报错

    需求:点击按钮,打开一个弹窗. // 获得窗体实例 Window window = openDesignViewModel.View as Window; // 这是使用了WAF框架 //Window ...

  7. javascript中全局变量的定义

    首先确实简单,在js脚本的函数外面使用. 但是要注意点: 不能写到jquery的框框代码里面,之前粗心放到$(function(){ })里面去了. <script type="tex ...

  8. shell脚本----for循环

      1.方法1 #!/bin/bash for((i=1;i<10;i++)) do echo $i done 保存为for1.sh 直接sh for1.sh 会报错: Syntax error ...

  9. PHP框架之ThinkPHP项目CMS内容管理系统源码及开发手册视频

    http://download.csdn.net/download/duguqing/4203042

  10. R语言基于S4的面向对象编程

    前言 本文接上一篇文章 R语言基于S3的面向对象编程,本文继续介绍R语言基于S4的面向对象编程. S4对象系统具有明显的结构化特征,更适合面向对象的程序设计.Bioconductor社区,以S4对象系 ...