分享 收藏 返回

ARM技术论坛

yygy3748 关注 私信

[问答] STM32串口1与串口2一起开时的printf函数问题

2012-8-14 20:54

请问,在32中,串口1与串口2一起用时,要怎样配置才能让printf()函数在两个串口中正常使用

希望看到该问题的大神指点一下。

回帖(9)

yygy3748

2012-8-14 21:00:53
int fputc(int ch, FILE *f)  
{  
    USART2->DR = (u8) ch;  
      
    /* Loop until the end of transmission */  
    while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET)
    {  
    }



    return ch;  
}

我是这样重定义串口2的,现在串口2正常

int fputc(int ch, FILE *f)  这个函数名好像不能改变,因为这是调用了库的函数,请问串口1的重定义应该怎样写

qq1226317595

2014-2-23 10:21:10
/*
* 函数名:itoa
* 描述  :将整形数据转换成字符串
* 输入  :-radix =10 表示10进制,其他结果为0
*         -value 要转换的整形数
*         -buf 转换后的字符串
*         -radix = 10
* 输出  :无
* 返回  :无
* 调用  :被USART_printf()调用
*/
static char *itoa(int value, char *string, int radix)
{
    int     i, d;
    int     flag = 0;
    char    *ptr = string;

    /* This implementation only works for decimal numbers. */
    if (radix != 10)
    {
        *ptr = 0;
        return string;
    }

    if (!value)
    {
        *ptr++ = 0x30;
        *ptr = 0;
        return string;
    }

    /* if this is a negative value insert the minus sign. */
    if (value < 0)
    {
        *ptr++ = '-';

        /* Make the value positive. */
        value *= -1;
    }

    for (i = 10000; i > 0; i /= 10)
    {
        d = value / i;

        if (d || flag)
        {
            *ptr++ = (char)(d + 0x30);
            value -= (d * i);
            flag = 1;
        }
    }

    /* Null terminate the string. */
    *ptr = 0;

    return string;

} /* NCL_Itoa */

/*
* 函数名:USART_printf
* 描述  :格式化输出,类似于C库中的printf,但这里没有用到C库
* 输入  :-USARTx 串口通道
*                     -Data   要发送到串口的内容的指针
*                           -...    其他参数
* 输出  :无
* 返回  :无
* 调用  :外部调用
*         典型应用USART_printf( USART1, "\r\n this is a demo \r\n" );
*                             USART_printf( USART2, "\r\n %d \r\n", i );
*                             USART_printf( USART3, "\r\n %s \r\n", j );
*/
void USART_printf(USART_TypeDef* USARTx, uint8_t *Data,...)
{
        const char *s;
  int d;   
  char buf[16];

  va_list ap;
  va_start(ap, Data);

        while ( *Data != 0)     // 判断是否到达字符串结束符
        {                                                          
                if ( *Data == 0x5c )  //'\'
                {                                                                          
                        switch ( *++Data )
                        {
                                case 'r':                                                                  //回车符
                                        USART_SendData(USARTx, 0x0d);
                                        Data ++;
                                        break;

                                case 'n':                                                                  //换行符
                                        USART_SendData(USARTx, 0x0a);       
                                        Data ++;
                                        break;
                               
                                default:
                                        Data ++;
                                    break;
                        }                         
                }
                else if ( *Data == '%')
                {                                                                          //
                        switch ( *++Data )
                        {                               
                                case 's':                                                                                  //字符串
                                        s = va_arg(ap, const char *);
          for ( ; *s; s++)
                                        {
                                                USART_SendData(USARTx,*s);
                                                while( USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET );
          }
                                        Data++;
          break;

        case 'd':                                                                                //十进制
          d = va_arg(ap, int);
          itoa(d, buf, 10);
          for (s = buf; *s; s++)
                                        {
                                                USART_SendData(USARTx,*s);
                                                while( USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET );
          }
                                        Data++;
          break;
                                 default:
                                                Data++;
                                    break;
                        }                 
                } /* end of else if */
                else USART_SendData(USARTx, *Data++);
                while( USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET );
        }
}

qq1226317595

2014-2-23 10:31:20
/*
* 函数名:USART_printf
* 描述  :格式化输出,类似于C库中的printf,但这里没有用到C库
* 输入  :-USARTx 串口通道
*                     -Data   要发送到串口的内容的指针
*                           -...    其他参数
* 输出  :无
* 返回  :无
* 调用  :外部调用
*         典型应用USART_printf( USART3, "\r\n this is a demo \r\n" );
*                             USART_printf( USART1, "\r\n %d \r\n", i );
*                             USART_printf( USART2, "\r\n %s \r\n", j );
*/
void USART_printf(USART_TypeDef* USARTx, uint8_t *Data,...)
{
        const char *s;
  int d;   
  char buf[16];

  va_list ap;
  va_start(ap, Data);

        while ( *Data != 0)     // 判断是否到达字符串结束符
        {                                                          
                if ( *Data == 0x5c )  //'\'
                {                                                                          
                        switch ( *++Data )
                        {
                                case 'r':                                                                  //回车符
                                        USART_SendData(USARTx, 0x0d);
                                        Data ++;
                                        break;

                                case 'n':                                                                  //换行符
                                        USART_SendData(USARTx, 0x0a);       
                                        Data ++;
                                        break;
                               
                                default:
                                        Data ++;
                                    break;
                        }                         
                }
                else if ( *Data == '%')
                {                                                                          //
                        switch ( *++Data )
                        {                               
                                case 's':                                                                                  //字符串
                                        s = va_arg(ap, const char *);
          for ( ; *s; s++)
                                        {
                                                USART_SendData(USARTx,*s);
                                                while( USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET );
          }
                                        Data++;
          break;

        case 'd':                                                                                //十进制
          d = va_arg(ap, int);
          itoa(d, buf, 10);
          for (s = buf; *s; s++)
                                        {
                                                USART_SendData(USARTx,*s);
                                                while( USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET );
          }
                                        Data++;
          break;
                                 default:
                                                Data++;
                                    break;
                        }                 
                } /* end of else if */
                else USART_SendData(USARTx, *Data++);
                while( USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET );
        }
}

gugu

2014-5-1 17:56:31
楼上的学习了{:1:}

yygy3748

2014-5-25 18:31:20
非常感谢你的指教

zoupengju

2014-6-10 11:00:19
引用: qq1226317595 发表于 2014-2-23 10:31
/*
* 函数名:USART_printf
* 描述  :格式化输出,类似于C库中的printf,但这里没有用到C库

调用的时候头文件需要包括哪些 ?   我这里编译不通过

zoupengju

2014-6-10 11:01:01
引用: qq1226317595 发表于 2014-2-23 10:31
/*
* 函数名:USART_printf
* 描述  :格式化输出,类似于C库中的printf,但这里没有用到C库

需要哪些头文件声明  我这里编译不过去

杨锋

2014-9-7 10:50:20
怎么都没有说道方法,,,,,,同样的问题

钟太松

2015-8-31 15:49:33
我也想用串口printf,用在2/3/4/5上面,不知道怎么弄

更多回帖