STM32
直播中

刘军

7年用户 1396经验值
私信 关注
[问答]

怎样去编写USART1与USART2专用的printf函数呢

如何对usart2的串口进行配置?

怎样去编写USART1与USART2专用的printf函数呢?

回帖(1)

赵爱香

2021-11-30 10:01:23
1.配置usart2的串口配置,gpio,rcc enable,跟上面类似
2.勾选u*** micro lib,跟上面类似
3.添加头文件#include ,编写USART2的printf函数
(1)hal库
  /*
USART1专用的printf函数
在usart.c中添加下列函数,还要添加申明头文件#include
#include //支持printf函数
USART1_printf(“abcd”)用USART2发送字符abcd
*/
//hal库自定义串口printf函数
void printf2(char * fmt,…)
{
char buffer[100];
uint16_t i=0;
va_list arg_ptr;
va_start(arg_ptr,fmt);
vsnprintf(buffer,100,fmt,arg_ptr);
while(i<99&&buffer)
{
HAL_UART_Transmit(&huart1,(uint8_t *)&buffer,1,0xFFFF);
i++;
}
va_end(arg_ptr);
}
  (2)固件库
1、申明头文件#include
2、buffer的大小根据需要调整,相应的循环条件也要改,此处可以定义成宏,方便调节buffer大小。
3、定义va_list变量,该变量是一个字符指针,可以理解为指向当前参数的一个指针,取参必须通过这个指针进行。
4、va_start让arg_ptr指向printf函数可变参数里边的第一个参数;
5、vsnprintf()将按照fmt的格式将arg_ptr里的值依次转换成字符保存到buffer中,该函数有最大字符数限制,超过后会被截断,且该函数会自动在字符串末尾加‘’。
6、最后必须调用va_end(),由此确保堆栈的正确恢复。
  void USART1_printf (char *fmt, …){
char buffer[USART1_REC_LEN+1]; // 数据长度
u8 i = 0;
va_list arg_ptr;
va_start(arg_ptr, fmt);
vsnprintf(buffer, USART1_REC_LEN+1, fmt, arg_ptr);
while ((i < USART1_REC_LEN) && (i < strlen(buffer))){
USART_SendData(USART1, (u8) buffer[i++]);
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
}
va_end(arg_ptr);
}
  代码分析:
可变参数:c语言可变参数输出
      va_list ap;  //va_list 可变参数列表,存参数地址 va_start(ap,fmt);//获取可变参数地址 fmt地址赋给ap  vsprintf(Usart3_TxBuff,fmt,ap);/*使用参数列表发送格式化输出到字符串, 函数功能将可变参数格式化输出到一个字符数组 */ //fmt中内容赋给Usart3_TxBuff, va_end(ap);        //清空参数列表   把可变参数地址存到ap中,存储图如下。
  函数形式参数存储:
  void func(char * parameter0,char * parameter1,char * parameter2,char * parameter3){
}
栈向下生长,先入后出
举报

更多回帖

发帖
×
20
完善资料,
赚取积分