1. 无线串口调试:为什么我们需要更“聪明”的数据发送方式?
搞过嵌入式开发的朋友,尤其是参加过智能车竞赛的同学们,肯定对“无线串口”这个老朋友不陌生。它就像是我们单片机(比如逐飞科技常用的CYT 4BB7、TC264这些芯片)和电脑之间的一座无线桥梁。调试的时候,我们总想知道小车当前的速度是多少、电机的PWM占空比是多少、摄像头识别到的偏差角是几度。这时候,把芯片里的数据发到电脑的串口助手上看,是最直接的办法。
但不知道你有没有踩过这样的坑:直接用逐飞库里的 wireless_uart_send_buffer 函数,把一个整数 speed = 1000 发出去,结果在串口助手上看到的是一堆莫名其妙的十六进制字符,或者干脆就是乱码。我第一次遇到的时候也懵了,心想这数据怎么还对不上号了呢?其实原因很简单,这个底层函数是把内存里的二进制数据“原封不动”地扔出去,而串口助手默认是以ASCII字符来解读的,两边“语言不通”,自然就鸡同鸭讲。
所以,我们得做个“翻译官”,把芯片里那些 int、float 这样的二进制数据,翻译成人类和串口助手都能看懂的十进制数字字符串,再发送出去。这就是我当初封装那几个“懒人函数”最直接的动机。我不想每次调试都去写一堆格式转换和发送的代码,太繁琐了,容易出错还浪费时间。尤其是在比赛调试那种争分夺秒的环境下,一个简单、可靠、拿来就用的数据发送工具,能省下大把时间去调PID参数和算法逻辑。
说白了,我们的需求很明确:像在电脑上用 printf 打印调试信息一样方便,在嵌入式端也能轻松地把各种类型的数据,清晰、正确地显示在无线串口助手的界面上。 这不仅仅是方便看数据,更是提升调试效率、快速定位问题的关键一步。接下来,我就带你从最基础的整型发送开始,一步步实现这个目标,并分享我在实战中优化和封装的一些心得。
2. 基础类型发送优化:告别乱码,让数据“说人话”
2.1 整型(int)数据发送:从二进制到清晰数字
我们先来解决最简单也最常用的整型数据发送。核心思路就是“格式转换+发送”。逐飞库提供的 wireless_uart_send_buffer 是发送数据的“搬运工”,但它只认字节流。我们的任务是把一个整数,比如 10086,变成它对应的字符串 "10086",再交给这个搬运工。
这里我直接用了C标准库里的 sprintf 函数,它是个“格式化高手”,能轻松把数字“打印”到一个字符数组里。下面是我封装的函数:
/**
* @brief 用无线串口发送int型数字
* @param number 要发送的int型数字
*/
void wireless_send_int(int32_t number)
{
// 先发送回车换行,让每次数据在串口助手上独立成行,看起来清爽
wireless_uart_send_byte('\r');
wireless_uart_send_byte('\n');
char str_buffer[12]; // 缓冲区,32位有符号int最大长度是“-2147483648”,共11位,加1位结束符
sprintf(str_buffer, "%d", number); // 关键转换:“%d”告诉sprintf,把number当十进制整数转成字符串
uint32_t len = strlen(str_buffer); // 计算这个字符串有多长
wireless_uart_send_buffer((const uint8_t *)str_buffer, len); // 把字符串数据发出去
}
几个实战细节和踩过的坑:
- 缓冲区大小:这里我用了12字节。为什么?一个32位有符号整数(int32_t)的最小值是 -2,147,483,648,转换成字符串是11个字符,再加上字符串结尾的
\0(虽然我们发送时用strlen忽略了它),12字节稳稳的。如果你确定数据范围,可以适当减小,但宁大勿小,避免缓冲区溢出导致程序跑飞。 - 回车换行
\r\n:这个很重要!不加的话,所有数据会连在一起,比如连续发送100和200,串口助手会显示100200,很难阅读。加上\r\n,每个数据独占一行,一目了然。这是提升调试体验的一个小技巧。 - 数据类型:原函数我用了
uint32_t,这里我改成了int32_t。因为实际应用中,速度、偏差这些值很可能有正有负。用有符号类型兼容性更好。当然,如果你确信数据非负,用uint32_t并配合%u格式符也行。
使用起来非常简单:
#include "zf_common_headfile.h"
// 假设函数声明已经放在某个头文件里,或者直接写在这里
void wireless_send_int(int32_t number);
int main(void)
{
// 逐飞标准初始化
clock_init(SYSTEM_CLOCK


365

被折叠的 条评论
为什么被折叠?



