44b0 之 Uart_Printf(char *fmt,...)

本文详细介绍了如何使用vsprintf函数将参数按照指定格式输出到字符串中,并解释了如何利用va_list、va_start及va_end处理可变数量的参数,适用于嵌入式系统中的格式化字符串输出。

void Uart_Printf(char *fmt,...)
{
    va_list ap;
    char string[256];
    va_start(ap,fmt);
    vsprintf(string,fmt,ap);
    Uart_SendString(string);
    va_end(ap);
}

1> vsprintf

2>可变参数

 

1> vsprintf

函数名:vsprintf

功能:送格式化输出到串中

用法:int vsprintf(char *string, char *format, va_list param);

  1.1> 什么是格式化??

         格式化就是把你要输出的数字按照一定的格式输出.

  1.2> 把参数param按照*format指定的格式写到*string中.

         vsprintf(buffer,fmt,argptr);

         fmt="%d %f %s"

         就是把argptr中的参数按照"%d %f %s"这个格式输出到buffer中

2>可变参数

   1.1> va_list().首先在函数里定义一具有va_list型的变量,这个变量是指向参数的指针

   1.2> va_start().对ap进行初始化,让它指向可变参数表里面的第一个参数.

   1.3> va_end().获取参数之后,设置ap为NULL.

 

Uart_Printf(char *fmt,...)初步印象

void _sys_exit(int x) { x = x; } //֘¶¨ҥfputcº¯ʽ int fputc(int ch, FILE *f) { while((USART1->SR&0X40)==0);//ѭ»··¢ˍ,ֱµ½·¢ˍͪ±Ϡ USART1->DR = (u8) ch; return ch; } #endif #if EN_USART1_RX //ȧ¹ûʹĜÁ˽ӊՍ u8 USART_RX_BUF[USART_REC_LEN]; //½ӊջº³嬗USART_REC_LEN¸öז½ڮ u16 USART_RX_STA=0; //½ӊ՗´̬±꼇 /******************************************************************** * º¯ʽû£ºvoid USART1_IRQHandler(void) * ¹¦Ĝèʶ: ´®¿ڱ֐¶Ϸþα³̐򍊪 µ÷Ӄ: * ±»³Ǝª: * ʤȫ²Ίý£º * ·µ»غ * ׷՟: * Ƥ˻: * ±дȕƚ: 2013.8.27 * Ӳ¼þÁ¬½Ӻ *********************************************************************/ void USART1_IRQHandler(void) { u8 res; #ifdef OS_CRITICAL_METHOD //ȧ¹ûOS_CRITICAL_METHOD¶¨ҥÁˬ˵÷ʹӃucosIIÁˮ OSIntEnter(); #endif if(USART1->SR&(1<<5)) //½ӊյ½ʽ¾ݍ { res=USART1->DR; if((USART_RX_STA&0x8000)==0) //½ӊՎ´ͪ³ɍ { if(USART_RX_STA&0x4000) //½ӊյ½Á˰x0d { if(res!=0x0a)USART_RX_STA=0;//½ӊմ펳,֘Ђ¿ªʼ else USART_RX_STA|=0x8000; //½ӊՍ곉Áˠ }else //»¹ûʕµ½0X0D { if(res==0x0d)USART_RX_STA|=0x4000; else { USART_RX_BUF[USART_RX_STA&0X3FFF]=res; USART_RX_STA++; if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//½ӊՊý¾ݴ펳,֘Ђ¿ªʼ½ӊՉ } } } } #ifdef OS_CRITICAL_METHOD //ȧ¹ûOS_CRITICAL_METHOD¶¨ҥÁˬ˵÷ʹӃucosIIÁˮ OSIntExit(); #endif } #endif /******************************************************************** * º¯ʽû£º * ¹¦Ĝèʶ:³õʼ»¯IO ´®¿ڱ * µ÷Ӄ: * ±»³Ǝª: * ʤȫ²Ίý£º1¡¢pclk2:PCLK2ʱ֓ƵŠ(Mhz) 2¡¢bound:²¨̘Š * ·µ»غ * ׷՟: * Ƥ˻: * ±дȕƚ: 2013.8.27 * Ӳ¼þÁ¬½Ӻ *********************************************************************/ void uart_init(u32 pclk2,u32 bound) // 72,9600 { float temp; u16 mantissa; //´淅²¨̘Šջʽ²¿·֍ u16 fraction; //´淅²¨̘ŠСʽ²¿·֠ RCC->APB2ENR|=1<<2; //ʹĜPORTA¿ڊ±֓ RCC->APB2ENR|=1<<14; //ʹĜ´®¿ڱʱ֓ GPIOA->CRH&=0XFFFFF00F; //IOɨփ£¬ǥÁ㐁9º͐A10 GPIOA->CRH|=0X000004b0; //IOɨփ£¬PA10¸¡¿Պ䈫£¬PA9¸´Ӄ͆ͬʤ³ö RCC->APB2RSTR|=1<<14; //¸´λ´®¿ڱ RCC->APB2RSTR&=~(1<<14);//ֹͣ¸´λ //²¨̘Šɨփ temp=(float)(pclk2*1000000)/(bound*16); //µõ½²¨̘Š mantissa=temp; //µõ½ջʽ²¿·֍ fraction=(temp-mantissa)*16; //µõ½Сʽ²¿·։ mantissa<<=4; mantissa+=fraction; USART1->BRR=mantissa; // ²¨̘Šɨփ USART1->CR1|=0X200C; //1λֹͣ,ΞУѩλ. } char Uart_Getch(void) { while(!(USART1->SR & (1<<5))); //Receive data ready return USART1->DR; } void Uart_SendByte(int data) { if(data=='\n') { while(!(USART1->SR & (1<<6))); //µȴý£¬ֱµ½·¢ˍ»º³凸Ϊ¿Ս USART1->DR='\r'; //·¢ˍ»سµ·û } while(!(USART1->SR & (0x01<<6))); //Wait until THR is empty. USART1->DR=data; //·¢ˍז·û } void Uart_SendString(char *pt) { while(*pt) Uart_SendByte(*pt++); } void Uart_Printf(char *fmt,...) { __va_list ap; char string[256]; va_start(ap,fmt); vsprintf(string,fmt,ap); Uart_SendString(string); va_end(ap); } 每行代码的意思
最新发布
06-13
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值