OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子新作:阿波罗STM32F767&F429&探索者STM32F4开发板&赶快来下载资料哦。

查看: 361|回复: 9

关于printf函数

[复制链接]

  离线 

12

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2017-11-19
在线时间
15 小时
发表于 2017-12-3 18:14:56 | 显示全部楼层 |阅读模式
1金钱
求问原子哥,printf 函数为什么可以发送任何符号都串口助手呢?

很是不解啊,,求助!!!!

最佳答案

查看完整内容[请看2#楼]

很简单啊。。。所有的可见不可见符号,都可以由二进制编码唯一表述。而printf说是打印函数,但是本质上就是格式化符号函数,将给定的符号——或者说是二进制编码按照一定格式输出。当然,输出到哪里,就看重定向了。事实上,只要重定向部分做得好,可以输出到任何总线、任何设备。
回复

使用道具 举报

  离线 

2

主题

240

帖子

0

精华

高级会员

Rank: 4

积分
704
金钱
704
注册时间
2017-10-24
在线时间
39 小时
发表于 2017-12-3 18:14:57 | 显示全部楼层
很简单啊。。。所有的可见不可见符号,都可以由二进制编码唯一表述。而printf说是打印函数,但是本质上就是格式化符号函数,将给定的符号——或者说是二进制编码按照一定格式输出。当然,输出到哪里,就看重定向了。事实上,只要重定向部分做得好,可以输出到任何总线、任何设备。
十六进制带我飞。
回复

使用道具 举报

  离线 

22

主题

1496

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3395
金钱
3395
注册时间
2016-5-29
在线时间
502 小时
发表于 2017-12-3 19:48:58 | 显示全部楼层
这个函数就是打印的功能嘛..设计如此..
深圳富美莱怡家智能科技有限公司
主营:可视对讲,智能家居安防,灯光控制,空调控制
智能门窗,门锁.
回复

使用道具 举报

  离线 

12

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2017-11-19
在线时间
15 小时
 楼主| 发表于 2017-12-3 20:14:56 | 显示全部楼层
操作系统 发表于 2017-12-3 19:48
这个函数就是打印的功能嘛..设计如此..

可以说的具体点吗?重定向又是什么用处啊?
回复

使用道具 举报

  离线 

12

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2017-11-19
在线时间
15 小时
 楼主| 发表于 2017-12-3 20:17:59 | 显示全部楼层
操作系统 发表于 2017-12-3 19:48
这个函数就是打印的功能嘛..设计如此..

你的宣传成功激起了我的好奇心
回复

使用道具 举报

  离线 

485

主题

9万

帖子

30

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
120540
金钱
120540
注册时间
2010-12-1
在线时间
965 小时
发表于 2017-12-4 01:07:19 | 显示全部楼层
你可以尝试自己写一个,然后就知道为什么了。不知道的多百度
回复

使用道具 举报

  离线 

22

主题

1496

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3395
金钱
3395
注册时间
2016-5-29
在线时间
502 小时
发表于 2017-12-4 09:03:33 | 显示全部楼层
lsx0812 发表于 2017-12-3 20:17
你的宣传成功激起了我的好奇心

我宣传了什么??
深圳富美莱怡家智能科技有限公司
主营:可视对讲,智能家居安防,灯光控制,空调控制
智能门窗,门锁.
回复

使用道具 举报

  离线 

1

主题

15

帖子

0

精华

新手上路

Rank: 1

积分
29
金钱
29
注册时间
2016-9-26
在线时间
3 小时
发表于 2017-12-5 20:05:34 | 显示全部楼层
这个事比较牛的函数   不定个数参数 平时建议用fprintf  ,安全点
回复

使用道具 举报

  离线 

0

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2015-10-15
在线时间
17 小时
发表于 2017-12-13 00:05:16 | 显示全部楼层
本帖最后由 lpc17707020887 于 2017-12-13 00:16 编辑

1111111111
路漫漫其修远兮,吾将上下而求索
回复

使用道具 举报

  离线 

0

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2015-10-15
在线时间
17 小时
发表于 2017-12-13 00:13:35 | 显示全部楼层
[C] 纯文本查看 复制代码
//看到朋友问了一下这个打印调试信息的问题,我分享一下我现在用在freertos里面的打印输出调试信息的代码的实现吧
//**************************************************************************************************
//**************************************************************************************************
//**************************************************************************************************
//下面是debug.h文件的内容
#ifndef  _DEBUG_H
#define         _DEBUG_H

//1、头文件
/********************************************************************************************************************************************************************/
#include "stm32f1xx_hal.h"
#include "usart.h"

//2、宏定义
/********************************************************************************************************************************************************************/
#define DEBUG_ON  1    //DEBUG_SWITCH为ON的时候,表示开启仿真
#define DEBUG_OFF 0    //如果DEBUG_SWITCH为OFF的时候,表示关闭仿真

#define  DEBUG_PIN_TOGGLE     HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_11)


#define DEBUG_SWITCH   DEBUG_ON        

#if DEBUG_SWITCH==DEBUG_ON
                #define TRACE(x...)   PRINTF(x)
#else
                #define TRACE(x...) 
#endif

//3、类型定义
/********************************************************************************************************************************************************************/

//4、变量声明
/********************************************************************************************************************************************************************/


//5、函数声明
/********************************************************************************************************************************************************************/
void PRINTF(char *format, ...);

#endif









//**************************************************************************************************
//**************************************************************************************************
//**************************************************************************************************
//下面是debug.c文件的内容

#include "debug.h"
#include "cmsis_os.h"
#include "string.h"
#include "stdarg.h"




//获取当前中断情况--返回0表示不在中断中,
//非0表示cpu被中断占用,且返回数字为中断向量编号
static int inHandlerMode (void)
{
                return __get_IPSR() != 0;
}

#define PRINTF_BUFFER_LENGTH 200
char printf_buff[PRINTF_BUFFER_LENGTH];
/**********************************************************************
** 函数名称         RINTF
** 创建人           :liupcngcheng
** 创建日期         :2017 2017/11/07 18:51
** 最新修改人       :liupcngcheng
** 最近修改日期      :2017 2017/11/07 18:51
** 功能描述         :通过串口1打印调试信息
** 入口参数         :
** 返回参数         :
** 备注/注意        :
** QQ              : 1240612852
***********************************************************************/
void PRINTF(char *format, ...)
{
                
        
                if(inHandlerMode() != 0)                 //如果在中断中
                {
                                taskDISABLE_INTERRUPTS();      //关闭中断
                }
                else                                                      //如果不在中断中在任务中
                {
                                while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX)     //如果发现调试串口被其他任务占用,则当前任务切出
                                {
                                                osThreadYield();
                                }
                }
                
                va_list ap;             //定义一个指针
                va_start(ap, format);   //将第一个变参的地址赋值给ap指针
                memset(printf_buff,0x00,strlen(printf_buff));
                
                if(vsprintf(printf_buff, format, ap) > 0)     
                {
                        //串口调用
                        HAL_UART_Transmit(&huart1,(uint8_t*)printf_buff ,strlen(printf_buff),0x05);
                }
                
                va_end(ap);

                //if(inHandlerMode() != 0)       //打印完调试信息之后还在中断中,则开启中断触发
                //{
                taskENABLE_INTERRUPTS();
                //}
}
路漫漫其修远兮,吾将上下而求索
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则




QQ|联系我们|手机版|官方淘宝店|新浪微博|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2018-1-22 12:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表
/* */