我现在已经用VS2017写STM32的程序有一段时间了,在这段时间里,遇到了不少问题,今天就和大家分享一下有关于printf的故事....
之前用MDK开发STM32的时候用正点原子教给大家的printf,很好用,但是在VS上,一直打印不出来东西,于是,我打算重新写printf
废话不多说,直接上代码
void myPrintf(char* fomat, ...)
{
char buf[1000] = "";
char* p;
u16 i = 0;
int num;
float fnum;
char* str;
char tem[100] = "";
va_list va;
va_start(va, fomat);
p = fomat;
while (*p)
{
if (*p == '%')
{
switch (*(++p))
{
case 'd':
num = va_arg(va, int);
itoa(num, tem, 10);
strcpy(buf + i, tem);
i += strlen(tem) - 1;
break;
case 's':
str = va_arg(va, char*);
strcpy(buf + i, str);
i += strlen(str) - 1;
break;
case 'f':
fnum = va_arg(va, double);
gcvt(fnum, 8, tem);
strcpy(buf + i, tem);
i += strlen(tem) - 1;
break;
}
}
else
{
buf
= *p;
}
i++;
p++;
}
p = buf;
while (*p)
{
while ((USART1->SR & 0X40) == 0)
;
USART1->DR = (u8) *p;
p++;
}
va_end(va);
}
其中,使用了string.h strlib.h strarg.h 这三个头文件
原理很简单,就是一个可变参函数.
建立一个1000字节的缓冲区,然后向缓冲区打印数据,最后就是通过串口发送到上位机啦.
测试代码:
测试结果
因为VS的代码编写环境和调试能力都比MDK强了太多太多
用了Visual GDB插件
一周热门 更多>