管理员
最后登录1970-1-1
在线时间 小时
注册时间2013-5-3
|
发表于 2014-3-24 21:02:42
|
显示全部楼层
本帖最后由 flyleaf 于 2014-3-24 21:04 编辑
程序有bug,把标志位的宏 USART_FLAG_TC 全改成 USART_FLAG_TXE 就好了- /*
- * 函数名:USART2_printf
- * 描述 :格式化输出,类似于C库中的printf,但这里没有用到C库
- * 输入 :-USARTx 串口通道,这里只用到了串口2,即USART2
- * -Data 要发送到串口的内容的指针
- * -... 其他参数
- * 输出 :无
- * 返回 :无
- * 调用 :外部调用
- * 典型应用USART2_printf( USART2, "\r\n this is a demo \r\n" );
- * USART2_printf( USART2, "\r\n %d \r\n", i );
- * USART2_printf( USART2, "\r\n %s \r\n", j );
- */
- void USART2_printf(USART_TypeDef* USARTx, char *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_TXE) == 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_TXE) == RESET );
- }
- Data++;
- break;
- default:
- Data++;
- break;
- }
- } /* end of else if */
- else USART_SendData(USARTx, *Data++);
- while( USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET );
- }
- }
复制代码 |
|