在平常调试程序时候,经常发现标准输出被重定向了,也就是说printf无法打印,以下提供三种方法强制打印。
方法一:
#include <syslog.h>
#include <sys/syslog.h>
#include <stdarg.h>
#include <stddef.h>
#include <stdio.h>
#include <unistd.h>
static int doser_debug_print_message(char *fmt, ...)
{
va_list ap;
int ret;
FILE *fp;
#if 0
//freopen("/dev/console","w",stderr);
if((fp = fopen("/nv/printf.log", "a+")) == NULL) {
return;
}
#else
if((fp = fopen("/dev/ttyS0", "w")) == NULL) //注意ttyS0要根据实际设备串口对应的字符节点
{
return;
}
#endif
va_start(ap, fmt);
ret = vfprintf(fp, fmt, ap);
va_end(ap);
#ifndef PLATFORM_TestPlat
va_start(ap, fmt);
vsyslog(6, fmt, ap); //一般情况,vsyslog都是有效的
va_end(ap);
#endif
fclose(fp);
fp = NULL;
return ret;
}
#define DoserDebugPrint(...) doser_debug_print_message(__VA_ARGS__)
以上其实是打印了两次,可以根据实际情况选择一种。
方法二:
#define apifilename(x) strrchr(x,'/')? strrchr(x,'/')+1:x
#define TARGET "/dev/ttyS4" //需根据设备串口实际对应字符节点修改
#define APIDEBUG(arg...) \
do{ \
char command[0x3ff], string[0x1ff], line[0xff]; \
sprintf(line, "[(%s)%04d]%s: ", apifilename(__FILE__), __LINE__, __FUNCTION__); \
sprintf(string, ##arg); \
sprintf(command, "echo -n \"%s %s\" > %s", line, string, TARGET); \
system(command); \
}while(0)
方法三:
#define MYPRINTF(info,...) \
do{ \
char mybuf[0xff]; \
sprintf(mybuf, "%s,%s,%d:" info "", __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__);\
myprintf_file(mybuf); \
}while(0)
void myprintf_file(char *content)
{
std::ofstream myout;
myout.open("/dev/ttyS4"); //根据设备串口实际对应字符驱动节点修改
if(!myout.is_open())
{
return;
}
else
{
myout << content;
myout.close();
return;
}
return;
}
上面三种方法都是需要通过串口驱动打印,所有如果串口驱动(被修改)内部做了屏蔽,那这三种方法均无效,那就只剩下一种了:将串口控制器的寄存器映射到用户层,强制操作寄存器发送数据。