微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > ARM技术讨论 > STM32串口1与串口2一起开时的printf函数问题

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

时间:10-02 整理:3721RD 点击:
请问,在32中,串口1与串口2一起用时,要怎样配置才能让printf()函数在两个串口中正常使用
希望看到该问题的大神指点一下。

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的重定义应该怎样写

/*
* 函数名: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 );
        }
}

/*
* 函数名: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 );
        }
}

楼上的学习了

非常感谢你的指教

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

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

怎么都没有说道方法,,,,,,同样的问题

我也想用串口printf,用在2/3/4/5上面,不知道怎么弄

上一篇:cuteftp问题
下一篇:ARM启动代码深入分析

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top