打印

《STM32不完全手册》中串口printf函数调用问题

[复制链接]
6038|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
LO单片机VE|  楼主 | 2011-9-9 09:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
按照《STM32不完全手册》中的串口例程调试时发现每次仿真到printf函数就死机。不知大家有没有发现这个情况,都是如何解决的啊,小弟在此向各位大虾请教了?
沙发
电子乌托邦| | 2011-9-9 10:01 | 只看该作者
1.myprintf.c
#include "inc/myprintf.h"
#include <stdarg.h>
#include <stdio.h>
#include "inc/main.h"

#define putc MyPutChar
/*
* Conver int to string based on radix (usually 2, 8, 10, and 16)
*/
char *itoa(int num, char *str, int radix)
{
    char string[] = "0123456789abcdefghijklmnopqrstuvwxyz";

    char* ptr = str;
    int i;
    int j;

    while (num)
    {
        *ptr++ = string[num % radix];
        num /= radix;

        if (num < radix)
        {
            *ptr++ = string[num];
            *ptr = '\0';
            break;
        }
    }

    j = ptr - str - 1;

    for (i = 0; i < (ptr - str) / 2; i++)
    {
        int temp = str;
        str = str[j];
        str[j--] = temp;
    }

    return str;
}

/*
* A simple printf function. Only support the following format:
* Code Format
* %c character
* %d signed integers
* %i signed integers
* %s a string of characters
* %o octal
* %x unsigned hexadecimal
*/
int my_printf( const char* format, ...)
{
    va_list arg;
    int done = 0;

    va_start (arg, format);
    //done = vfprintf (stdout, format, arg);

    while( *format != '\0')
    {
        if( *format == '%')
        {
            if( *(format+1) == 'c' )
            {
                char c = (char)va_arg(arg, int);
//                putc(c, stdout);
                putc(c);
            } else if( *(format+1) == 'd' || *(format+1) == 'i')
            {
                char store[20];
                int i = va_arg(arg, int);
                char* str = store;
                itoa(i, store, 10);
                while( *str != '\0')
//                                        putc(*str++, stdout);
                                        putc(*str++);
            } else if( *(format+1) == 'o')
            {
                char store[20];
                int i = va_arg(arg, int);
                char* str = store;
                itoa(i, store, 8);
                while( *str != '\0')
//                                        putc(*str++, stdout);
                                        putc(*str++);
            } else if( *(format+1) == 'x')
            {
                char store[20];
                int i = va_arg(arg, int);
                char* str = store;
                itoa(i, store, 16);
                while( *str != '\0')
//                                        putc(*str++, stdout);
                                        putc(*str++);
            } else if( *(format+1) == 's' )
            {
                char* str = va_arg(arg, char*);
                while( *str != '\0')
//                                        putc(*str++, stdout);
                                        putc(*str++);
            }

            // Skip this two characters.

            format += 2;
        } else {
//            putc(*format++, stdout);
            putc(*format++);
        }
    }

    va_end (arg);

    return done;
}

使用特权

评论回复
板凳
电子乌托邦| | 2011-9-9 10:01 | 只看该作者
2.myprintf.h
/*
*********************************************************************************************************
** Include
*********************************************************************************************************
*/
#ifndef __MYPRINTF_H
#define __MYPRINTF_H

int my_printf( const char* format, ...);

#endif /* __MYPRINTF_H */

使用特权

评论回复
地板
电子乌托邦| | 2011-9-9 10:03 | 只看该作者
3.第一步的MyPutChar函数是自己写的一个发送单字节函数。
eg.
/*
*********************************************************************************************************
** Description        :发送一个字节,用于myprintf函数
** Arguments        :data     待发送的字节
** Returns                :NONE
*********************************************************************************************************
*/
void MyPutChar(u16 data)
{
  USART_SendData(USART1, data);
  while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}

使用特权

评论回复
5
电子乌托邦| | 2011-9-9 10:04 | 只看该作者
4.这样就构造了一个自己能用的printf函数了。
用这个就行了。
over

使用特权

评论回复
6
LO单片机VE|  楼主 | 2011-9-9 10:11 | 只看该作者
很感谢《电子乌托邦》网友的回帖,但是我想用printf函数输出汉字到串口显示,如printf("欢迎光临\n");是不是您自己写的《myprintf.c》和《myprintf.h》也能输出汉字,还有就是有没有简单点的方法啊?

使用特权

评论回复
7
电子乌托邦| | 2011-9-9 22:41 | 只看该作者
你就想完成这么简单的输出啊,那还真是浪费了printf。
不是说printf函数能输出汉字,而是编译器能编译汉字就行,我用的keil、IAR没问题。
用myprintf函数当然也能完成。

你自己写个输出字符串的函数,把汉字当字符串输出就行了。
不用非得printf

使用特权

评论回复
8
zhanxiage110| | 2012-4-10 14:48 | 只看该作者
学习

使用特权

评论回复
9
beyond696| | 2012-4-11 10:30 | 只看该作者
在调用printf函数时一般要在编译器里面设置“Use MicroLIB”这项

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

44

帖子

0

粉丝