本帖最后由 不爱胡萝卜的仓鼠 于 2024-10-12 00:40 编辑
在日常调试中日志输出是一个非常重要的功能,今天我们就在上一篇文章工程的基础上增加串口功能。本来这种基础的功能我想跳过,但是调试过程中发现了一个很有意思的事情,想写出来与大家分享
一.配置CubeMX
在配置cubemx前,我们需要知道开发板上ST-Link虚拟串口与H7的那个uart连接,并使用的是哪两个引脚。这个信息可以在《DM01038846_ENV2.0》这个文档中找到,如下图所示
使用的是PD0、PD1
接下来我们双击打开cubemx的ioc文件
在Connectivity中打开UART4,选择“App”的那个框。mode选择“Asynchronous”。接下来还要改一下右边的引脚图,RX默认是PB8,我们要改成PD0(虽然我们待会儿只用于打印日子,暂时用不到RX,不过还是给他配置正确)
然后点击右上角的生成代码即可
因为上一篇中ld的那个问题,每次cubemx生成后,都要记得回去把那个文件给变回去
二.CubeIDE中代码修改
2.1 发送测试
首先我们现在测试一下数据能不能发出去,我们直接调用HAL_UART_Transmit函数即可发送数据。我在while1中放了以下测试代码
unsigned char data[] = "123";
HAL_UART_Transmit(&huart4, data, sizeof(data), 0xFFFF);
串口日志正常输出,说明配置没问题
2.2 printf
想要使用printf函数,需要做一下重定向,首先需要增加以下头文件,否则编译会报错
#include "stdio.h"
然后写一下printf重定向函数
int __io_putchar(int ch)
{
HAL_UART_Transmit(&huart4 , (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
然后针对float类型的数据,还需要额外再做一个操作
把这两个勾上即可
然后我们替换刚才的测试函数,换上printf来试试
printf("666\r\n");
float a = 3.14;
printf("a = %.2f\r\n", a);
结果如下
三.有意思的事情
我今天调试一开始使用的串口工具是正点原子的XCOM,平时我默认打开的是sscom,不知道咋了,今天鬼使神差的点了XCOM,既然都打开了,就用他吧。然后这个软件我之前还打开了时间戳
结果发现他一直不出数据,我以为是我的代码有问题,给我一顿好找。最终发现下方的R:的数字是一直在上涨的,但是界面不显示。那我的程序应该没问题,串口是有东西输出的
接下来我换了SSCOM,就正常了(SSCOM我也勾选了时间戳)
经过我反复的尝试,我发现XCOM的时间戳功能可能有点小问题,当向XCOM定时发送数据时,我的发送频率超过某个值后(这个值的边界是多少我没测试),他就会一直接收,不打印出来。
我猜测他是接收完数据后,要多少时间没有新的数据,他就认为接收完毕,然后把它打印出来,但是这个时间他写的比较大(我代码里400ms的delay发送一次数据,他这个至少是大于400ms的),就导致了这个问题。
解决策略:
1.关闭时间戳功能
2.一定要时间戳的,要么换软件,要么保证不要很快的定时发送
3.XCOM开发人员修改一下代码,当RX buffer到达一定值后,例如50字节,就强制输出一次,不要一直收