强制打印方法,输出重定向解决

14 篇文章 2 订阅

在平常调试程序时候,经常发现标准输出被重定向了,也就是说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;
}

上面三种方法都是需要通过串口驱动打印,所有如果串口驱动(被修改)内部做了屏蔽,那这三种方法均无效,那就只剩下一种了:将串口控制器的寄存器映射到用户层,强制操作寄存器发送数据。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值