Sam*_*Sam 10 c c++ microcontroller uart
我正在使用arm微处理器进行编程,并尝试通过UART使用print语句进行调试.我不想stdlibs
只为调试添加.有没有办法打印到控制台没有stdio.h
/ iostream.h
?我可以写自己的printf()
吗?
或者,我可以使用DMA控制器直接写入UART.但是,我想避免这是可能的.使用内置测试功能"echo"或"remote loop-back"我知道我已正确配置UART.
简短回答:是的,完全有可能同时完成两种解决方案.
如果要支持所有数据类型和格式,printf函数非常复杂.但是编写可以在几个不同的基础上输出字符串或整数的东西并不难(大多数人只需要十进制和十六进制,但是一旦你有十进制和十六进制,八进制可能只会增加另外3-4行代码).
通常,printf的编写方式如下:
int printf(const char *fmt, ...)
{
int ret;
va_list args;
va_start(args, fmt)
ret = do_xprintf(outputfunc, NULL, fmt, args);
va_end(args);
return ret;
}
Run Code Online (Sandbox Code Playgroud)
然后do_xprintf()
对所有变体(printf,sprintf,fprintf等)进行所有艰苦的工作
int do_xprintf(void (*outputfunc)(void *extra, char c), void *extra, const char *fmt, va_list args)
{
char *ptr = fmt;
while(1)
{
char c = *ptr++;
if (c == '%')
{
c = *ptr++; // Get next character from format string.
switch(c)
{
case 's':
char *str = va_arg(args, const char *);
while(*str)
{
count++;
outputfunc(extra, *str);
str++;
}
break;
case 'x':
base = 16;
goto output_number;
case 'd':
base = 10;
output_number:
int i = va_arg(args, int);
// magical code to output 'i' in 'base'.
break;
default:
count++;
outputfunc(extra, c);
break;
}
else
count++;
outputfunc(extra, c);
}
return count;
}
Run Code Online (Sandbox Code Playgroud)
现在,您需要做的就是填写上面代码的几个部分并编写一个输出到您的串行端口的outputfunc().
请注意,这是粗略的草图,我确信代码中存在一些错误 - 如果您想支持浮点或"宽度",您将需要更多地工作...
(关于额外参数的注意事项 - 输出到文件FILE *
指针,对于sprintf
,你可以传递缓冲区的结构和缓冲区中的位置,或类似的东西)