野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 25744|回复: 7

usart中printf函数重定向问题

[复制链接]
发表于 2014-3-24 20:57:12 | 显示全部楼层 |阅读模式
今天研究了一下printf函数重定向的问题,照着野火的例程做了一遍,发现了一个小问题,就是字符串的第一个字节并没有发出来,由于野火的例子中字符串前面加了\r\n,printf("\r\nthis is a printf demo \r\n");所以并未发现,但是当我去掉前面的\r\n之后,
printf("this is a printf demo \r\n");问题就出来了,串口调试助手上面的信息显示为his is a printf demo ,前面的字符“t”并没有发出来!!求解^_^
回复

使用道具 举报

发表于 2014-3-24 20:58:41 | 显示全部楼层
火哥的 STM32例程有bug ,好像是改一个寄存器标志位才行的
回复 支持 反对

使用道具 举报

发表于 2014-3-24 20:59:11 | 显示全部楼层
之前也遇到过,忘了,等火哥回答吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-24 20:59:49 | 显示全部楼层
祁羽彤 发表于 2014-3-24 20:58
火哥的 STM32例程有bug ,好像是改一个寄存器标志位才行的

怎么改,求指点!!!
回复 支持 反对

使用道具 举报

发表于 2014-3-24 21:02:42 | 显示全部楼层
本帖最后由 flyleaf 于 2014-3-24 21:04 编辑

程序有bug,把标志位的宏 USART_FLAG_TC 全改成 USART_FLAG_TXE 就好了
  1. /*
  2. * 函数名:USART2_printf
  3. * 描述  :格式化输出,类似于C库中的printf,但这里没有用到C库
  4. * 输入  :-USARTx 串口通道,这里只用到了串口2,即USART2
  5. *         -Data   要发送到串口的内容的指针
  6. *         -...    其他参数
  7. * 输出  :无
  8. * 返回  :无
  9. * 调用  :外部调用
  10. *         典型应用USART2_printf( USART2, "\r\n this is a demo \r\n" );
  11. *                 USART2_printf( USART2, "\r\n %d \r\n", i );
  12. *                 USART2_printf( USART2, "\r\n %s \r\n", j );
  13. */
  14. void USART2_printf(USART_TypeDef* USARTx, char *Data,...)
  15. {
  16.   const char *s;
  17.   int d;   
  18.   char buf[16];

  19.   va_list ap;
  20.   va_start(ap, Data);

  21.   while ( *Data != 0)     // 判断是否到达字符串结束符
  22.   {                                 
  23.     if ( *Data == 0x5c )  //'\'
  24.     {                    
  25.       switch ( *++Data )
  26.       {
  27.         case 'r':                        //回车符
  28.           USART_SendData(USARTx, 0x0d);
  29.           Data ++;
  30.           break;

  31.         case 'n':                        //换行符
  32.           USART_SendData(USARTx, 0x0a);  
  33.           Data ++;
  34.           break;
  35.         
  36.         default:
  37.           Data ++;
  38.             break;
  39.       }      
  40.     }
  41.     else if ( *Data == '%')
  42.     {                    //
  43.       switch ( *++Data )
  44.       {        
  45.         case 's':                      //字符串
  46.           s = va_arg(ap, const char *);
  47.           for ( ; *s; s++)
  48.           {
  49.             USART_SendData(USARTx,*s);
  50.             while( USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET );
  51.           }
  52.           Data++;
  53.           break;

  54.         case 'd':                    //十进制
  55.           d = va_arg(ap, int);
  56.           itoa(d, buf, 10);
  57.           for (s = buf; *s; s++)
  58.           {
  59.             USART_SendData(USARTx,*s);
  60.             while( USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET );
  61.           }
  62.           Data++;
  63.           break;
  64.          default:
  65.             Data++;
  66.             break;
  67.       }     
  68.     } /* end of else if */
  69.     else USART_SendData(USARTx, *Data++);
  70.     while( USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET );
  71.   }
  72. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-24 21:03:18 | 显示全部楼层
怎么改,求指点
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-24 21:06:25 | 显示全部楼层
成功了,谢谢啊,这个论坛真是棒,谢谢大家
回复 支持 反对

使用道具 举报

发表于 2014-3-24 21:14:07 | 显示全部楼层
真的 不客气哟  
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-23 19:37 , Processed in 0.025665 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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