我在Stm32串口编程中遇到的一些很有用的函数
下面的这几个函数和测试是我在Stm32串口编程中遇到的一些对新人极不友好 的函数,但是学会之后非常的好用!!写好一次,以后可以直接复制粘贴了!!
再说一遍,这几个函数主要是围绕串口输出的哦。
最后一部分是我自己编写的输出函数,模仿printf就直接输出了,虽然也可以函数重定向,但是重定向不如这种方式灵活。
串口初始化就直接跳过,例程网上非常丰富。
1、va_list va_start(ap, variable) va_arg(ap, type) va_end(ap)
//当出现可变数量的入参时的va_list、va_start
va_list ap; 定义一个va_list变量ap
va_start(ap,v);执行ap = (va_list)&v + _INTSIZEOF(v),ap指向参数v之后的那个参数的地址,即ap指向第一个可变参数在堆栈的地址。
va_arg(ap,t) , ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )取出当前ap指针所指的值,并使ap指向下一个参数。
ap+= sizeof(t类型),让ap指向下一个参数的地址。然后返回ap-sizeof(t类型)的t类型指针,这正是第一个可变参数在堆栈里的地址。然后
用取得这个地址的内容。
va_end(ap); 清空va_list ap。
//示例,这个函数就是我们的串口输出函数,把串口的输出写成模拟printf的形式
void u3_printf(char* fmt, ...)
{
u16 i,j;
va_list ap;
va_start(ap,fmt);//初始化ap,ap指向第二个开始的参数(第一个参数后)
vsprintf((char*)USART3_TX_BUF,fmt,ap);//将ap根据format格式化后填入数组
va_end(ap);//结束可变参数获取
i=strlen((const char*)USART3_TX_BUF); //此次发送数据的长度
for(j=0;j<i;j++) //循环发送数据
{
while(USART_GetFlagStatus(USART3<