当前位置:首页 > 单片机 > 单片机
[导读]分享一个stm32串口打印函数,如果采用printf函数非常占内存而且需要重定向,采用以下方法可以简单打印调试信息等基本信息,可直接复制使用。/****************************************************** 整形数

分享一个stm32串口打印函数,如果采用printf函数非常占内存而且需要重定向,采用以下方法可以简单打印调试信息等基本信息,可直接复制使用。

/******************************************************
整形数据转字符串函数
char *itoa(int value, char *string, int radix)
radix=10 标示是10进制 非十进制,转换结果为0;

例:d=-379;
执行 itoa(d, buf, 10); 后

buf="-379"
**********************************************************/
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 */


/****************************************************************************
* 名 称:void USART_OUT(USART_TypeDef* USARTx, uint8_t *Data,...)
* 功 能:格式化串口输出函数
* 入口参数:USARTx:指定串口
Data: 发送数组
...: 不定参数
* 出口参数:无
* 说 明:格式化串口输出函数
"r" 回车符 USART_OUT(USART1, "abcdefgr")
"n" 换行符 USART_OUT(USART1, "abcdefgrn")
"%s" 字符串 USART_OUT(USART1, "字符串是:%s","abcdefg")
"%d" 十进制 USART_OUT(USART1, "a=%d",10)
* 调用方法:无
****************************************************************************/
void USART_OUT(USART_TypeDef* USARTx, char *Data,...)
{
const char *s;
int d;
char buf[16];
// uint8_t *Data = pData;
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;
}
}
else USART_SendData(USARTx, *Data++);
while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET);
}
}

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
换一批
延伸阅读
关闭