通常Arduino中调整串口缓存大小的方法是修改HardwareSerial.h中的常量。
其实根本无需修改系统core中的定义值,只需要在代码最上方添加以下常量定义,抢在HardwareSerial.h之前定义缓存大小就可以了。
#define SERIAL_RX_BUFFER_SIZE 512
#define SERIAL_TX_BUFFER_SIZE 128
但是如果使用STM32的板子就没那么简单了。
无论你如何修改HardwareSerial.h的常量定义,或者是在代码上方添加定义都是无效的。
因为在STM32的HardwareSerial.h中即便有该常量的定义,其实也是没有用到的,请看以下代码。
#if 0
volatile uint8_t * const _ubrrh;
volatile uint8_t * const _ubrrl;
volatile uint8_t * const _ucsra;
volatile uint8_t * const _ucsrb;
volatile uint8_t * const _ucsrc;
volatile uint8_t * const _udr;
// Has any byte been written to the UART since begin()
bool _written;
volatile rx_buffer_index_t _rx_buffer_head;
volatile rx_buffer_index_t _rx_buffer_tail;
volatile tx_buffer_index_t _tx_buffer_head;
volatile tx_buffer_index_t _tx_buffer_tail;
// Don't put any members after these buffers, since only the first
// 32 bytes of this struct can be accessed quickly using the ldd
// instruction.
unsigned char _rx_buffer[SERIAL_RX_BUFFER_SIZE];
unsigned char _tx_buffer[SERIAL_TX_BUFFER_SIZE];
#endif
缓存数组的定义已经被#If 0 ... #endif包起来了,所以并不会起作用。
那么如果一定要改这个值的话,需要怎么做呢?
经过研究,发现只要修改中的常量定义就可以了。
/*
* Devices
*/
#ifndef USART_RX_BUF_SIZE
#define USART_RX_BUF_SIZE 512 //接收缓存大小
#endif
#ifndef USART_TX_BUF_SIZE
#define USART_TX_BUF_SIZE 64 //发送缓存大小
#endif
/** USART device type */
typedef struct usart_dev {
usart_reg_map *regs; /**< Register map */
ring_buffer *rb; /**< RX ring buffer */
ring_buffer *wb; /**< TX ring buffer */
uint32 max_baud; /**< @brief Deprecated.
* Maximum baud rate. */
uint8 rx_buf[USART_RX_BUF_SIZE]; /**< @brief Deprecated.
* Actual RX buffer used by rb.
* This field will be removed in
* a future release. */
uint8 tx_buf[USART_TX_BUF_SIZE]; /**< Actual TX buffer used by wb */
rcc_clk_id clk_id; /**< RCC clock information */
nvic_irq_num irq_num; /**< USART NVIC interrupt */
} usart_dev;
具体是否有上限并没有测试过,需要注意的是这两个数字将影响所有串口的缓存大小,所以如果设定过大就会占用太多内存。
另外这里是以STM32F1系列为例的,如果是其他系列就修改相应文件夹中的usart.h就可以了。