使用串口打印的常见几种方法

❤️作者主页:嵌入式_源-CSDN博客 

❤️作者简介:嵌入式软件工程师,记录学习

❤️点赞 👍 收藏 ,感谢您的关注

一、前期准备

我用野火开发板做的例程,你们可自行选择现有的硬件进行测试

1、硬件:

  • 野火STM32F103ZET6
  • DAP下载器

2、软件:

  • keil5-IDE
  • cubeMX

二、cubeMX配置

1、配置RCC——选择外部时钟源

2、配置SYS—— Serial Wire模式 

 3、时钟树拉满72M 

       

 4、配置串口1   

 5.创建工程

        ......

三、keil5代码
1.方式一:将调试信息通过sprintf函数转化为字符串,然后通过串口直接打印

char DebufPrintfBuf[50];

void debugprintf(uint8_t *str,uint16_t len)
{
    HAL_UART_Transmit(&huart1,str,len,1000);
}

 snprintf(DebufPrintfBuf,50,"key1->>value:%d\r\n",value);
debugprintf(DebufPrintfBuf,strlen(DebufPrintfBuf));

2.方式二:使用keil自带的微库进行打印调试信息

①  


#include "stdio.h"
int fputc(int ch, FILE *f)//串口重定向
{
    HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,1000);
    return ch;
}


printf("key2->>value:%d\r\n",value);

② 在Keil5中勾选如下选项

3.方式三   使用c语言完整的库进行打印调试信息。


#include "stdio.h"
struct __FILE
{
    int handle;
};

FILE __stdout;

void _sys_exit(int x)
{
    x = x;
}

int fputc(int ch, FILE *f)
{
    HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,1000);
    return ch;
	//while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
   //USART1->DR = (uint8_t) ch;      
	//return ch;
}

printf("key3->>value:%d\r\n",value);

4.方式四   使用c语言完整的库+指令进行打印调试信息。 加头文件


#include "stdio.h"
uint16_t DebugPrintfCmd=0x0001;//只有cmd的最低为1时才能启用打印,例如3,二进制0011
//DebugPrintfCmd=0xFFFF;cmd输入除0之外都可打印
void debug_printf(uint16_t cmd, char *fmt, ...)
{
    if (cmd & DebugPrintfCmd)
    {
        va_list ap;
        va_start(ap, fmt);
        vprintf(fmt, ap); //必须用带v的
        va_end(ap);
    }
}

struct __FILE
{
    int handle;
};

FILE __stdout;

void _sys_exit(int x)
{
    x = x;
}

int fputc(int ch, FILE *f)
{
    HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,1000);
}

debug_printf(3,"key4->>value:%d\r\n",value);
printf("key4->>value:%d\r\n",value);

5.方式五   使用c语言另一种用法+指令进行打印调试信息

#include "string.h"
#include "stdio.h"

uint16_t DebugPrintfCmd=0x0001;
static uint8_t USART1_TX_BUF[50]; 	//发送缓冲,最大USART1_MAX_SEND_LEN字节
void u1_printf(uint16_t cmd,char* fmt,...)  
{  
    if (cmd & DebugPrintfCmd)
    {
        uint16_t len;
        va_list ap;
        va_start(ap,fmt);
        vsprintf((char*)USART1_TX_BUF,fmt,ap);
        va_end(ap);
        len=strlen((const char*)USART1_TX_BUF);//此次发送数据的长度     
        
        HAL_UART_Transmit(&huart1,USART1_TX_BUF,len,1000);
    }
}


u1_printf(1,"key5->>value:%d\r\n",value);

6. 方法六  当单片机无串口资源时,使用数组来显示调试信息

#include <stdarg.h>
#include "string.h"
#include "stdio.h"

__align(8) uint8_t USART1_TX_BUF[50]; 	//发送缓冲,最大USART1_MAX_SEND_LEN字节
uint16_t DebugPrintfCmd=0x0001;
char debugbuf[20][50];//最多存放20组调试信息
void u1_printf(uint16_t cmd,char* fmt,...)  
{  
    if (cmd & DebugPrintfCmd)
    {
        static uint8_t cmd=0;
        uint16_t len;
        va_list ap;
        va_start(ap,fmt);
        vsprintf((char*)USART1_TX_BUF,fmt,ap);
        va_end(ap);
        len=strlen((const char*)USART1_TX_BUF);//此次发送数据的长度
        
        memcpy(debugbuf[cmd],USART1_TX_BUF,len);
        cmd++;
        if(cmd>19)
        {
            cmd=0;
        }
    }
}

 u1_printf(1,"key6->>value:%d\r\n",value);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值