STM32中,不进行printf改写通过函数达到同款效果
void bt_send(char *format,...)
{
uint8_t send_buf[128]={0};
va_list arg;
va_start(arg,format);
vsprintf((char*)send_buf,format,arg);
va_end(arg);
HAL_UART_Transmit(&uart2_handle,send_buf,sizeof(send_buf),100);
}
这段代码定义了一个名为 bt_send
的函数,用于通过串口(UART)发送格式化后的字符串。这个函数利用了 C 语言中的可变参数(varargs)特性以及串口通信的功能。下面是对这段代码的详细解释:
- 函数定义:
void bt_send(char *format,...)
: 这个函数没有返回值(void
),并且接受至少一个参数。第一个参数char *format
是一个指向字符数组的指针,即格式化字符串,它指定了后续参数如何被格式化和插入到最终的字符串中。...
表示这个函数可以接受可变数量的参数,这些参数的类型和数量由format
字符串中的格式指定符决定。
- 局部变量定义:
uint8_t send_buf[128]={0};
: 定义了一个类型为uint8_t
(无符号8位整型,通常用于表示字节)的数组send_buf
,大小为128个字节,并将所有元素初始化为0。这个数组用于存储格式化后的字符串,准备通过串口发送。
- 处理可变参数:
va_list arg;
: 声明了一个va_list
类型的变量arg
,用于存储处理可变参数列表的信息。va_start(arg,format);
: 初始化arg
变量,使其指向format
之后的第一个参数。这是处理可变参数列表的起始点。vsprintf((char*)send_buf,format,arg);
: 使用vsprintf
函数将格式化字符串format
和其后的可变参数列表arg
格式化后存储到send_buf
中。这里将send_buf
强制转换为char*
类型,因为vsprintf
需要一个char*
类型的参数作为输出缓冲区。va_end(arg);
: 清理arg
变量,结束对可变参数列表的处理。
- 串口发送:
HAL_UART_Transmit(&uart2_handle,send_buf,sizeof(send_buf),100);
: 调用HAL_UART_Transmit
函数,通过 UART 发送数据。这个函数是 STM32 HAL 库的一部分,用于配置和发送数据通过指定的 UART 接口。&uart2_handle
: 指向 UART2 的句柄(handle)的指针,这个句柄包含了 UART 配置和状态的信息。send_buf
: 指向要发送的数据的指针,即之前格式化好的字符串。sizeof(send_buf)
: 要发送的数据的大小,这里是send_buf
数组的大小,即128字节。注意,这里有一个潜在的问题:如果format
字符串和可变参数生成的格式化后的字符串长度超过了127字节(因为最后一个字节被初始化为0,作为字符串的结束符),则会导致数据截断或溢出。100
: 超时时间,单位为毫秒。如果在这个时间内数据没有被完全发送,函数将返回错误。
原文地址:https://blog.csdn.net/weixin_52307528/article/details/143779100
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!