首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

stm32上的c语言可变参数 实现自己的printf(2)

stm32上的c语言可变参数 实现自己的printf(2)

上面函数就实现了可变参数%s了,同样的道理,可以继续添加如%d,%c等,前提是理解了上面的例子,呵呵
还是有点模糊的同学请自行充电。。。
下面给出我自己在stm32上封装的函数void USART_printf(USART_TypeDef* USARTx,uint8_t* data, ...);
i的作用是解决第一次串口发送数据重第二个字符发送的bug
void USART_printf(USART_TypeDef* USARTx, uint8_t* data,...)
{
uint8_t *position, *next,*next_addr;//position保存第一个参数入栈地址,next指向下一个  
static uint8_t i = 1; //解决bug,第一次串口发送数据重第二个字符发送
position = (uint8_t*)(&data);//获取第一个参数入栈地址   
next = position;//保存在next

while(*data)//第二个参数,字符串
{
if(*(data - i) == '%' ) //判断是否为'%'   
{
data++; //指针移至下一个,为下一步判断做准备
switch(*(data - i))//如果是'%'需要判断下一个字符是s/d
{
case 's'://字符串处理
next += 4;//获取下一个参数入栈地址
next_addr =(uint8_t*)(*((uint32_t*)(next)));//恢复第二个参数入栈钱地址
while(*next_addr)//发送字符串函数循环
{
USART_Send_8b(USARTx, *next_addr);//发一个字符  
next_addr++; //指针移至下一位
}
data++; //跳过发送字符's'
break; //结束本次switch  
case 'd': //整变变量处理
next += 4; //获取下一个参数入栈地址

next_addr =NumberToString((uint16_t)(*((uint32_t*)(next))));//获取数字转换成字符后的地址
while(*next_addr) //发送转换好的字符串循环
{
USART_Send_8b(USARTx, *next_addr);//发送一个字符
next_addr++; //指针移到下一位
}
data++; //跳过发送字符'd'
break; //结束本次switch

default : //'%'后面不是s/d
USART_Send_8b(USARTx, '%'); //发送'%'
USART_Send_8b(USARTx, *(data - i)); //发送'%'后面字符
break; //结束本次switch
} //switch(*(data - i))
}
else if(*(data - i) == '\n' ) //如果是换行字符
{
USART_Send_8b(USARTx, '\r'); //回到第一个字符位置
USART_Send_8b(USARTx, '\n'); //下一行
data++;
}
else //if(*(data - i) == '%' )
{
USART_Send_8b(USARTx, *(data - i)); //不是'%',发送该字符
data++; //指针移至下一位
}
} //while(*data)
if(i == 1)
{
i = 0;
}
USART_Send_8b(USARTx, '\r');
USART_Send_8b(USARTx, '\n');//收尾工作,换行
}
继承事业,薪火相传
返回列表