当我们调PID时想看目标值与实际值的差别,这时VOFA可以给我们提供一个便利,但是像我一样的小白一开始就迷迷糊糊不知道FireWater里面的printf为何能给电脑传数据并做出波形图。
那么这里先说一下printf传给电脑数据的原理:
在单片机串口通信中,printf函数能够打印数据是因为其底层实现使用了串口串行通信协议。串口通信是通过将数码信号转换为序列化的二进制信息来传输数据的,而printf函数可以将需要打印的数据转换成二进制信息,并将其通过串口发送到目标设备。
具体来说,当使用printf函数时,其会先将需要打印的数据转换成一定格式的字符串,然后将该字符串逐字符发送到串口,串口再将每个字符转化为二进制信息进行传输。在接收端,接收到的二进制信息再通过相应的解析算法转换回字符,最终输出打印的数据。
需要注意的是,在单片机中使用printf函数需要先配置好串口相关的参数,如波特率、数据位、停止位等,以确保正常的数据传输。同时,printf函数在单片机中的使用也要注意内存占用和代码效率等问题。
这下应该就清楚知道了为啥VOFA能使用串口来收取printf中的数据进而解析成图像的了吧。
那么基本原理知道了,我们还会有个疑问,那就是如果我在程序中只写了一个串口,那么毫无疑问就只有这一个串口能给电脑发数据。但是如果我写了很多个串口呢?我怎么知道是哪个串口将printf中的数据传给了电脑呢?其实这就涉及了printf的底层重定向问题。具体如何重定向的大家可以在CSDN上搜搜别的大佬写的文章。
这里我以江协科技的串口发送+接收例程为例进行讲解
注释的那一行便是江协的源代码,大家如果去看的话会发现它指定了USART1,也就是说,他将printf数据发送到了串口1,那么其他的串口肯定接收不到数据了。这下就知道究竟是哪个串口给电脑发数据了吧。那么如何指定串口来发数据呢?我们只需要在fputc之前加上这样的代码:
加上void USART_SendChar(USART_TypeDef* pUSARTx, uint8_t c)之后,在相应的.h文件进行声明即可
然后在fputc中进行引用,就可以让printf的数据发送到咱们需要的串口中了。
这里举个例子:
main.c
选择串口5
在VOFA中选择串口波特率为9600(串口5我设置为了9600)
然后开始可以看到这样的现象,则证明程序正确,没有问题
将重定向改成串口一波特率改成115200同理,能够观察到下面的现象:
想必大家看到这里应该都知道print到底数据去到哪个串口里面了吧,如果大家有疑问可以在下面留言,希望大家多多关注我,本人大一,我也会继续发一些我遇到过的问题,希望大家看到后能少走一些弯路,也希望大家能和我多多交流,一起进步。