STM32
登录
直播中
张辉
7年用户
1352经验值
私信
关注
[问答]
怎样使用STM32中的串口去封装printf函数呢
开启该帖子的消息推送
STM32
串口
printf函数
怎样使用
STM32
中的串口去封装printf函数呢?有哪几种封装方式呢?有哪些注意事项?
回帖
(1)
刘云
2021-11-30 09:27:49
在STM32开发中,会希望有串口打印,便于调试,接下来介绍两种封装方式。
自己封装一个类似 printf 的函数(前提是已经可以实现串口发送了):
#include
#include
#include
uint32_t Uart_strlen ( uint8_t *str )
{
uint32_t cnt = 0;
while(str[cnt] != 0)
{
cnt++;
}
return cnt;
}
void USART_Printf(uint8_t UsartPort,char *fmt, ...)
{
va_list ap;
uint8_t databuf[512] = {0};
va_start(ap, fmt);
vsprintf((char*)databuf, fmt, ap);
va_end(ap);
if(UsartPort == 1)
{
if(HAL_UART_Transmit_IT(&huart1, databuf, Uart_strlen(databuf))!= HAL_OK)
{
Error_Handler();
}
//等待串口1发送完成
while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);
}
else if(UsartPort == 2)
{
if(HAL_UART_Transmit_IT(&huart2, databuf, Uart_strlen(databuf))!= HAL_OK)
{
Error_Handler();
}
//等待串口2发送完成
while(HAL_UART_GetState(&huart2) == HAL_UART_STATE_BUSY_TX);
}
else
return;
}
之后就可以在代码里通过USART_Printf函数实现串口打印,需要注意的是:
打印最后需要加上"nr",否则换行会不正常,比如USART_Printf(1, “Hello world ! nr”);
使用标准的printf函数:
详情可参考这篇博文:
STM32上使用printf
.
勾选Use Micro LIB库,包含stdio.h头文件
采用串口的方式,主要就是重定向printf使用哪一个串口输出。
#include
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE* f)
#endif /* __GNUC__ */
#ifdef __cplusplus
extern "C" {
#endif //__cplusplus
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF); //调用STM32的HAL库,发送一个字节
return (ch);
}
#ifdef __cplusplus
}
#endif //__cplusplus
接下来就可以直接用printf函数实现打印。
No pains, no gains.
在STM32开发中,会希望有串口打印,便于调试,接下来介绍两种封装方式。
自己封装一个类似 printf 的函数(前提是已经可以实现串口发送了):
#include
#include
#include
uint32_t Uart_strlen ( uint8_t *str )
{
uint32_t cnt = 0;
while(str[cnt] != 0)
{
cnt++;
}
return cnt;
}
void USART_Printf(uint8_t UsartPort,char *fmt, ...)
{
va_list ap;
uint8_t databuf[512] = {0};
va_start(ap, fmt);
vsprintf((char*)databuf, fmt, ap);
va_end(ap);
if(UsartPort == 1)
{
if(HAL_UART_Transmit_IT(&huart1, databuf, Uart_strlen(databuf))!= HAL_OK)
{
Error_Handler();
}
//等待串口1发送完成
while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);
}
else if(UsartPort == 2)
{
if(HAL_UART_Transmit_IT(&huart2, databuf, Uart_strlen(databuf))!= HAL_OK)
{
Error_Handler();
}
//等待串口2发送完成
while(HAL_UART_GetState(&huart2) == HAL_UART_STATE_BUSY_TX);
}
else
return;
}
之后就可以在代码里通过USART_Printf函数实现串口打印,需要注意的是:
打印最后需要加上"nr",否则换行会不正常,比如USART_Printf(1, “Hello world ! nr”);
使用标准的printf函数:
详情可参考这篇博文:
STM32上使用printf
.
勾选Use Micro LIB库,包含stdio.h头文件
采用串口的方式,主要就是重定向printf使用哪一个串口输出。
#include
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE* f)
#endif /* __GNUC__ */
#ifdef __cplusplus
extern "C" {
#endif //__cplusplus
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF); //调用STM32的HAL库,发送一个字节
return (ch);
}
#ifdef __cplusplus
}
#endif //__cplusplus
接下来就可以直接用printf函数实现打印。
No pains, no gains.
举报
更多回帖
rotate(-90deg);
回复
相关问答
STM32
串口
printf函数
怎样
去
解决
stm32
中
无法使用
printf
函数
的问题
2021-11-25
1530
在
stm32
中
怎样
去
调用
printf
()
函数
呢
2021-12-02
594
怎样
在
stm32
中去
调用
printf
()
函数
呢
2021-11-30
604
在嵌入式
STM32
平台
中
怎样
去
使用
printf
打印
函数
呢
2021-12-01
824
怎样
去
解决
STM32
中
不能使用
printf
()
函数
的问题
呢
2021-12-01
2158
怎样
去
调试未定义
printf
()
函数
使用的
串口
呢
2021-11-30
1213
在
STM32
串口
通信程序
中
怎样
去
使用
printf
发送数据
呢
2021-11-30
637
如何在
STM32
中去
使用
printf
函数
呢
2021-12-10
1172
求大神指教
怎样
在
stm32
中去
使用
printf
函数
呢
2021-12-02
614
如何
去
实现
stm32
的
printf
函数
输出到
串口
呢
2021-11-30
728
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
首页
论坛版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分