搜索
bottom↓
回复: 8

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

[复制链接]

出0入0汤圆

发表于 2012-5-31 21:24:26 | 显示全部楼层 |阅读模式
之前一直用的是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完成


求人指点,我是这个论坛的新人,慕名而来

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

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

出0入0汤圆

 楼主| 发表于 2012-5-31 21:31:33 | 显示全部楼层
忘了说一件事,在51单片机里面无法调用fprintf函数

出0入0汤圆

发表于 2012-6-1 09:03:14 | 显示全部楼层
本帖最后由 chinabn 于 2012-6-1 09:05 编辑

编译器不一样!
语法需要做变更!

printf 参考 Keil 下的范例。

http://www.ourdev.cn/forum.php?m ... 6orderby%3Ddateline

出0入0汤圆

 楼主| 发表于 2012-6-1 09:48:41 | 显示全部楼层
看了你的帖子,你的方法和51单片机带的例程中的hello.c方法相似,但是不能通用,比如说不能再在液晶屏(lcd1602)上用printf函数

出0入0汤圆

 楼主| 发表于 2012-6-1 09:49:51 | 显示全部楼层
新手,求照顾,阿莫大哥别给我删了

出0入0汤圆

发表于 2012-6-1 10:01:27 | 显示全部楼层
考虑一下栈是否溢出了。

出0入0汤圆

 楼主| 发表于 2012-6-1 22:16:59 | 显示全部楼层
把所有的问题详细的解释一下吧,谢谢了

出0入0汤圆

 楼主| 发表于 2012-6-3 20:50:27 | 显示全部楼层
sprintf(date,"b=%d,c=%f,d=%ld",b,c,d)        //在51上测试发现只能有两个,例如,b,c输出正确,d输出就不正确了
这个估计是堆栈问题,其他的怎么回事,求人解决呀

出0入0汤圆

发表于 2012-6-3 23:55:20 | 显示全部楼层
如果d是无符号长整型的话输出应该是:
sprintf(date,"b=%d,c=%f,d=%lu",b,c,d);才行,否则可能会有溢出问题!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-7-24 02:14

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

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