STM32串口发送数据(不定参数版)

这篇文章主要是为了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等嵌入式系统中使用不定参数函数发送串口数据,可以提高代码复用性和灵活性,简化代码结构,更方便的处理不同串口的通信,使得函数在处理不同数量参数的情况下更加灵活,适应不同的输入需求。

  • 11
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32F4中,可以使用以下代码来发送数据帧: ```c void USART1_Tx(uint8_t *data, uint8_t len) { int i; for(i = 0; i < len; i++) { while(!LL_USART_IsActiveFlag_TXE(USART1)); //等待发送缓冲区为空 LL_USART_TransmitData8(USART1, data\[i\]); //发送数据 while(!LL_USART_IsActiveFlag_TC(USART1)); //等待发送完成 } } ``` 这个函数使用了LL库函数来操作USART1串口。在发送数据帧之前,需要将数据存储在一个uint8_t类型的数组中,并将数组的度作为参数传递给函数。函数会逐个字节地发送数据,并在每个字节发送完成后等待发送完成标志位被置位,以确保数据发送完整。 #### 引用[.reference_title] - *1* *2* [STM32开发小结--使用STM32F4串口的空闲中断模式+DMA接收不定数据帧](https://blog.csdn.net/u014421520/article/details/81227606)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [CubeMx LL库 STM32 通过串口接收一帧数据(解决接收丢包问题)](https://blog.csdn.net/weixin_42721131/article/details/119675160)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值