这篇文章主要是为了ESP8266模块部分对串口使用的讲解,以方便接下来使用STM32与ESP8266进行通信。
首先来讲解一下什么是不定参数。不定参数是指函数可以接收不确定个数的参数,不定参数用...来表示,它必须要写在正常参数表的后面,例如我们熟知的printf函数:
int printf (char *fmt, ...);
stdarg.h 头文件定义了一个变量类型 va_list 和三个宏,这三个宏可用于在参数个数未知(即参数个数可变)时获取函数中的参数。
void va_start(va_list ap, last_arg) 获取可变参数列表的第一个参数的地址
va_arg(va_list ap, type) 获取可变参数的当前参数,返回指定类型并将指针指向下一参数
void va_end(va_list ap) 清空va_list可变参数列表
vsnprintf() 是一个 C 语言函数,用于将可变数量的参数按照指定格式写入字符串中,类似于 sprintf() 函数。不同之处在于 vsnprintf()接受一个可变参数列表 va_list`来代替可变数量的参数。这使得开发者能够更加灵活地处理参数列表,避免缓冲区溢出等安全问题。
int vsnprintf(char *str, size_t size, const char *format, va_list ap);
其中:
- str是要写入的目标字符串的指针。
- size是目标字符串的最大长度,避免写入超出范围。
- format是格式化字符串,类似于printf()中的格式化字符串。
- ap是一个va_list类型的参数列表。
介绍完不定参数的基本含义讲解一下不定参数在串口发送的基本使用方法。
void UsartPrintf(USART_TypeDef *USARTx, char *fmt,...)
{
unsigned char UsartPrintfBuf[256];
va_list ap;
unsigned char *pStr = UsartPrintfBuf;
va_start(ap, fmt);
vsnprintf((char *)UsartPrintfBuf, sizeof(UsartPrintfBuf), fmt, ap); //格式化
va_end(ap);
while(*pStr != 0)
{
USART_SendData(USARTx, *pStr++);
while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET); //数据缓冲区为空时置1
}
}
STM32等嵌入式系统中使用不定参数函数发送串口数据,可以提高代码复用性和灵活性,简化代码结构,更方便的处理不同串口的通信,使得函数在处理不同数量参数的情况下更加灵活,适应不同的输入需求。