解决 stm32 使用 Arduino 库无法修改串口缓冲区大小的问题

由 三硝基豆腐 发布

说明一下,这篇文章主要是凑更新,然后唠嗑,所以如果想看干货直接翻到底部就行。

好吧首先主题更新一直咕咕咕我真不是故意的,六月份比我想象中的要忙很多,又是大学网课又是实习。(没错我找了个地儿实习,其实就是去学习的哈哈哈)

由于之前单片机接触的真的很浅,拿到一块 stm32 的板子的时候我是很绝望的……

我看到网上说可以用 Arduino 的库来进行 stm32 的板子开发,瞬间产生了浓厚的兴趣。

经过朋友推荐我找到了 PlatformIO 这个神器,只需要在 vscode 里装个插件,就能轻松一键创建项目、编译和下载,真心 i 了。

而且支持多种项目架构,有 Arduino、CMSIS、Stm32Cube(用的 HAL),我这种辣鸡当然就选择了 Arduino 啦。

由于 Arduino 把很多复杂的底层操作都封装好了,所以确实是比直接用官方的 SPL 库方便许多,也好理解很多。

但是这确实也带来了问题——那个主板要进行比较复杂的串口通信,所以对串口缓冲区需求比较高,大概需要 100B。

而经测试 Arduino 默认的串口缓冲区大小只有 64B。

64B 其实基本上也够用了,但是为了稳妥还是得扩大的。

我查了官方工作人员给出的文档,说是要在HardwareSerial.h里这么改:

#define SERIAL_TX_BUFFER_SIZE 256
#define SERIAL_RX_BUFFER_SIZE 256

然而我改了以后发现没 P 用,无论改成多少测出来缓冲区都是 64B。

而且一开始没改的时候这个设定是 16B,就已经和实验结果不符了。

然后我又浪费了一两个小时找文档,最后实在受不了放弃了。

然后我开始翻起了库文件,并很快发现这两个宏定义似乎并没有起作用——没人引用它们。

???

啥???

我又顺着定义接着翻,最后发现在usart.h这个头文件里有这么一段:

#ifndef USART_RX_BUF_SIZE
#define USART_RX_BUF_SIZE               64
#endif

#ifndef USART_TX_BUF_SIZE
#define USART_TX_BUF_SIZE               64
#endif

所以只要把这两个 64 改了就行。

我当时一边烧录一边说:你要是真是这问题你就是头猪。

好吧其实我感觉可能是兼容没做好,毕竟官方提供的修改意见中真没提到这个。

然后如果你不想直接修改头文件,只要在platform.ini里加上这么一行:

build_flags = -D USART_RX_BUF_SIZE=256 -D USART_TX_BUF_SIZE=256

如果是其他的 IDE 的话就是在编译选项里添加上两个 Define:USART_RX_BUF_SIZE=256 USART_TX_BUF_SIZE=256

这个故事告诉我们翻库文件效率可能比查资料要快。

顺带一提,我看了下,Arduino 的串口缓冲区是用循环队列实现的。


2 条评论

  1. 特厉害
    特厉害 · 2020-07-17 05:26

    上次照着某库官网上的文档写应用,库一直有更新,可我怎么写都觉得那些 API 像半成品,我都快写完了发现源码和文档的版本号差了十几个,我用的都是早就废弃了的......

  2. tencent
    tencent · 2020-07-10 13:01

    不错

发表评论