单片机使用printf函数进行串口打印输出

发布者:老桃子最新更新时间:2015-10-12 来源: eefocus关键字:单片机  printf函数  串口打印 手机看文章 扫描二维码
随时随地手机看文章
以前在使用keil编写51单片机程序的时候,经常使用printf函数打印输出一些关键的过程数据到电脑,方便监控程序的运行状况。最近使用IAR for MSP430 调试 MSP430G2553 程序的时候,发现了一些小问题,MSP430G2553单片机并没有按照我的预期输出数据到电脑。

带着疑惑我查看了keil的帮助文件里面的printf函数说明,原来printf函数最终是调用putchar函数来实现打印输出字符的。

putchar,该函数将制定的表达式的值所对应的字符输出到标准输出终端上。表达式可以是字符型或整型,它每次只能输出一个字符。我们来看keil标准函数库里的putchar函数的函数体。

根据说明提示,我在D:KeilC51LIB文件夹里面找到了putchar.c文件

#include

#define XON 0x11

#define XOFF 0x13

char putchar (char c) {

if (c == ' ') {

if (RI) {

if (SBUF == XOFF) {

do {

RI = 0;

while (!RI);

}

while (SBUF != XON);

RI = 0;

}

}

while (!TI);

TI = 0;

SBUF = 0x0d;

}

if (RI) {

if (SBUF == XOFF) {

do {

RI = 0;

while (!RI);

}

while (SBUF != XON);

RI = 0;

}

}

while (!TI);

TI = 0;

return (SBUF = c);

}

#if 0 // comment out versions below

char putchar (char c) {

if (c == ' ') {

while (!TI);

TI = 0;

SBUF = 0x0d;

}

while (!TI);

TI = 0;

return (SBUF = c);

}

char putchar (char c) {

while (!TI);

TI = 0;

return (SBUF = c);

}

#endif[page]

由说明文件可以看出,我们可以改写这个底层的putchar函数来适应不同的硬件。keil里面的putchar函数是默认用串行口输出信息的,我们可以自由定义成另外的输出模块,比如自定义IO向1602液晶输出信息。

keil的printf函数大致搞明白了,回头再研究下IAR for MSP430,可惜,我没有能够查看该软件标准函数库里的printf.c 和 putchar.c,不过我觉得程序没有通过串口向电脑打印输出信息,是因为底层的putchar函数没有定义为通过MSP430G2553的UART进行输出,那如果我自己重定向一个putchar函数,覆盖掉标准函数库里面的putchar,是不是就能够输出了呢。于是编写putchar函数如下:

int putchar(int c)

{

if(c == ' ')

{

while(UCA0STAT & UCBUSY);

UCA0TXBUF = ' ';

}

while(UCA0STAT & UCBUSY);

UCA0TXBUF = c;

return c;

}

编译后,输出完全正确。大功告成。

将测试程序向大家展示一下,希望能帮到大家。

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

uart.c

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include

void UartInit()

{

BCSCTL1 = CALBC1_1MHZ; // Set DCO

DCOCTL = CALDCO_1MHZ;

BCSCTL2 &= ~(DIVS_3);

P1SEL = BIT1 + BIT2 ; // P1.1 = RXD, P1.2=TXD

P1SEL2 = BIT1 + BIT2; // P1.1 = RXD, P1.2=TXD

UCA0CTL1

= UCSSEL_2; // SMCLK

UCA0BR0 = 104; // 1MHz 9600

UCA0BR1 = 0; // 1MHz 9600

UCA0MCTL = UCBRS0; // Modulation UCBRSx = 1

UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**

UC0IE

= UCA0RXIE; // Enable RX int

}

int putchar(int c)

{

if(c == ' ')

{

while(UCA0STAT & UCBUSY);

UCA0TXBUF = ' ';

}

while(UCA0STAT & UCBUSY);

UCA0TXBUF = c;

return c;

}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

main.c

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include

#include "uart.h"

#include "stdio.h"

void main()

{

float value = 123.123456789;

char *string="http://www.hao123.com";

WDTCTL = WDTPW + WDTHOLD;

UartInit();

printf("value = %f %s ",value,string);

while(1);

}

关键字:单片机  printf函数  串口打印 引用地址:单片机使用printf函数进行串口打印输出

上一篇:一种用于压力传感器的温度控制系统设计
下一篇:关于单片机程序中使用printf的一点建议

推荐阅读最新更新时间:2024-03-16 14:35

基于AT89C52单片机的SD卡的读写设计
前言   长期以来,以Flash Memory为存储体的SD卡因具备体积小、功耗低、可擦写以及非易失性等特点而被广泛应用于消费类电子产品中。特别是近年来,随着价格不断下降且存储容量不断提高,它的应用范围日益增广。当数据采集系统需要长时间地采集、记录海量数据时,选择SD卡作为存储媒质是开发者们一个很好的选择。在电能监测以及无功补偿系统中,要连续记录大量的电压、电流、有功功率、无功功率以及时间等参数,当单片机采集到这些数据时可以利用SD作为存储媒质。本文主要介绍了SD卡在电能监测及无功补偿数据采集系统中的应用方案。 设计方案   应用AT89C52读写SD卡有两点需要注意。首先,需要寻找一个实现AT89C52单片机
[安防电子]
基于AT89C52<font color='red'>单片机</font>的SD卡的读写设计
STM32单片机实现外部中断的步骤及方法
先从最简单的问题开始,用STM32外部中断的方法实现PB.0按键控制PA.0LED灯: 先总的说下实现中断的步骤: 1,配置NVIC寄存器(函数),设置中断为第几组,占先优先级和次优先级; 函数方法: void NVIC_Configuration() { NVIC_InitTypeDef NVIC_InitStruct; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); NVIC_InitStruct.NVIC_IRQChannel=EXTI0_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreempTIonPriority=0; NVIC_Init
[单片机]
STM32<font color='red'>单片机</font>实现外部中断的步骤及方法
瑞萨新一代“RX系列”微控制器
· 快速、高性能 CPU—— 新型架构可实现 200MHz 的高速运行,每个时钟周期可以同时处理更多的指令: Dhrystone v2.1 基准测得的结果为 1.25MIPS/MHz 。 该新型 CPU 采用了哈佛( Harvard )架构,可以提供独立的地址和数据通道,有助于实现一个周期内的指令执行和数据存取。这种单周期能力已通过现场使用瑞萨 MCU 进行了测试和验证。为了确保尽可能高的性能,瑞萨对该架构进行了严谨的设计和广泛的测试工作。因此,新型架构通过对寄存器、指令和地址模式的有效利用而进行了充分的优化。此外,它还有 16 个 32 位通用寄存器,有助于 CPU 处理所有可用寄存器的数据和地址。
[新品]
PIC单片机如何定义配置字与芯片标记
PICC提供了相关的预处理指令以实现在源程序中定义单片机的配置字和标记单元。 1)定义工作配置字 在源程序中定义PIC单片机工作配置字的重要性在前面章节中已经阐述。在用PICC写程序时同样可以在C原程序中定义,具体方式如下: __CONFIG(HS&UNPROTECT&PWRTEN&BORDIS&WDTEN); 上面的关键词“__CONFIG”(注意前面有两个下划线符)专门用于是芯片配置字的设定,后面括号中的各项配置位符号在特定型号单片机的头文件中已经定义(注意不是pic.h头文件),相互之间用逻辑“与”操作符组合在一起。这样定义的配置字信息最后将和程序代码一起放入同一个HEX文件。 在这里列出了适用于16F7
[单片机]
基于51单片机的多点测温系统设计
1.温度传感器DS18B20介绍 DALLAS公司单线数字温度传感器DS18B20是一种新的“一线器件”,它具有体积小、适用电压宽等特点。一线总线独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。DS18B20支持“一线总线”接口,测量温度范围为-55℃~+125℃,在-10℃~+85℃范围内,精度为±0.5℃;通过编程可实现9~12位的数字值读数方式;可以分别在93.75ms和750ms内将温度值转化为9位和12位的数字量。每个DS18B20具有唯一的64位长序列号,存放于DS18B20内部ROM只读存储器中。 DS18B20温度传感器的内部存储器包括1个高速暂存RAM和1个非易失性的电可擦
[单片机]
基于51<font color='red'>单片机</font>的多点测温系统设计
单片机为核心接近360°全景式摄像机设计方案
0 引言 采用单片机为核心设计的云台控制器在监控场合能实现控制摄像机进行大范围、宽角度的移动,以使lcd液晶屏图摄像机能够达到接近360°全景式摄像,且其在经济性、灵活性、扩展性和可维护性等方面都具有独特的优势。 1 系统总体结构 系统由以下几部分构成:①单片机:设计的核心,在软件的配合下实现对键盘所输入信息的识别,根据输入信息向云台中的步进电机发出指令,使其实现正/ 反转、速度控制、程序控制等功能,并将步进电机的转速通过数码管显示出来;②步进电机及驱动:负责云台系统在竖直和水平两个方向上的转动,是系统的执行部件;③键盘:外部信息的输入器件,是控制人员指挥云台系统工作的重要组成部分; ④显示器件:将步进电机的实时转速显示出来
[单片机]
<font color='red'>单片机</font>为核心接近360°全景式摄像机设计方案
STM32中映射 C库函数printf
一、MDK设置 在工程的 Target中MicroLib 二、main函数之前添加如下编译代码: #define COM USART1 //串口选择初始化,USART1为串口1,USART2为串口2 #ifdef __GNUC__ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif PUTCHAR_PROTOTYPE { USART_SendData(COM, (uint8_t) ch); //此处用到了 COM宏定义为了 USART1
[单片机]
STM32中映射 C库<font color='red'>函数</font><font color='red'>printf</font>
STM32单片机半主机模式的应用
在keil中编程时常会遇到__use_no_semihosting_swi的警告,这时你就是进入了半主机模式。 在嵌入式的编程中你是避免不了使用printf、fopen、fclose等函数的但是因为嵌入式的程序中并没有对这些函数的底层实现,使得设备运行时会进入软件中断BAEB处,这时就需要__use_no_semihosting_swi这 个声明,使程序遇到这些文件操作函数时不停在此中断处,具体操作如下,将下列程序加入你的工程中: #pragmaimport(__use_no_semihosting_swi)#pragmaimport(_main_redirection)constchar__stdin_name[150]
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved