在51单片机中使用printf和sprintf出现问题

2020-02-05 09:11发布

之前一直用的是avr单片机,最近帮同学做毕业设计,用了51单片机,在使用C语言标准中的输入输出出现了问题
1.在atmage16上使用printf函数完全好用,在51出现错误
2.sprintf(*a,b,c);参数a在51单片机中不能是函数名,在avr单片机中我用过函数名,完全可以;
3.sprintf(*a,"%d%d%d",b,c,d);格式话输出的参数在51单片机中最多只能有两个,但在AVR上曾经用过4个好用。
上面的问题期待大虾回答
下面分享一些资料
printf.h文件
#ifndef __PRINTF_H
#define __PRINTF_H

#include <stdio.h>

void printf_init(void);

#endif
#include "printf.h"
#include "Qinux_io.h"
printf.c文件                         //重定向标准输出流
static int z_putc(char c, FILE *stream);

static FILE z_stdout = FDEV_SETUP_STREAM(z_putc, NULL, _FDEV_SETUP_WRITE);
void printf_init(void)
{
        stdout = &z_stdout;
}

static int z_putc(char c, FILE *stream)
{
        Z_PUTC(c);
        return 0;
}
Qinux_io.h文件
#ifndef __PRINTF_HD
#define __PRINTF_HD

#include "../usart/usart.h"               //包含有硬件输出的文件,比如说串口,usart_tx_char(char c),

#define Z_PUTC(c) usart_tx_char(c)    //只要将usart_tx_char(c)改一下就可以用了,比如说lcd1602

#endif
以上三个文件在是一起的,在atmega16上好用,改动之后放在51上不能用了。
使用printf函数需要重定向标准输出流,



使用sprintf的话就不需要了
只需要sprintf(usart_tx_char,"b=%d,c=%f,d=%ld",b,c,d);     //在atmega16上好用,在51上不好用


在51上要变化一些
char date[32];
sprintf(date,"b=%d,c=%f,d=%ld",b,c,d)        //在51上测试发现只能有两个,例如,b,c输出正确,d输出就不正确了
usart_tx_sting(date);                                   //3句话的printf完成


求人指点,我是这个论坛的新人,慕名而来
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。