/**** 该文章只是个人的一些总结,是对自我提升的一种手段,如有错误欢迎各位指出,如果有幸能解决大家的问题那就再好不过了。****/
一、重定向函数
printf函数是C语言中用来打印数据的函数,但在Keil中是不能直接调用的。
与C语言中的使用相同的是,调用printf函数必须引用<stdio.h>头文件。调用printf函数后,系统又会调用更底层的 fputc() 函数(putchar函数),故若要在Keil中使用printf函数,我们必须人为实现fputc() 函数(putchar函数)。
具体代码的实现如下:
/********STC15********/
char putchar(char ch)
{
SBUF = ch;
while(TI == 0);
TI = 0;
return ch;
}
/********STM32********/
void Send_Byte(uint8_t dat)
{
USART_SendData(USART1,dat);
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);
}
int fputc(int ch,FILE *f)
{
Send_Byte(ch);
return ch;
}
该函数也被称作重定向函数,printf()函数默认将数据打印在屏幕上,与C语言不同,由于单片机没有屏幕,所以需要用 fputc() 函数对数据进行重定向,将数据重定向到串口发送。每调用一次printf()函数,系统进一步调用 fputc() 函数,从而数据通过串口输出。此函数无需调用,只需写在程序中,但必须写下该函数printf函数才能正常运行。
二、利用printf函数发送数据至VOFA+上位机
使用VOFA+时选用的是FireWater协议,该协议是使用最简单的协议。
使用该协议时,协议规定必须在发送的数据后加上换行符 ' \n '。
"<any>:ch0,ch1,ch2,...,chN\n"
- any和冒号可以为空,但换行(\n)不可省略;
- any不可以为"image",这个前缀用于解析图片数据;
- 此处\n为换行,并非指字符斜杠+字符n;
- \n也可以为\n\r,或\r\n。
完成以上操作后,即可在VOFA+上看到正常显示的波形。若要同时显示多个变量的数据波形呢?此处需要注意打印多个数据不能多次调用printf函数来发送不同数据,只能在一个printf函数中同时发送多个变量。
具体代码如下:
printf("%f,%f\n",(float)count_2,(float)sum_2);