https://github.com/RT-Thread-packages/at_device/issues/85 之前也有人反映过 不知道是不是同类型的问题
这个问题的原因就是底层的串口缓存开小了(RT_SERIAL_RB_BUFSZ 开小了);
简单点,在rtconfig.h 中直接修改RT_SERIAL_RB_BUFSZ为512或者其他值就OK了。
但这个有一个问题,或许其他串口不需要开那么大的缓存,只有esp8266的串口需要。
这个问题,原来想使用RT_DEVICE_CTRL_CONFIG来修改:
pconfig.baud_rate = BAUD_RATE_9600;
pconfig.data_bits = DATA_BITS_8;
pconfig.stop_bits = STOP_BITS_1;
pconfig.parity = PARITY_NONE;
pconfig.bit_order = BIT_ORDER_LSB;
pconfig.invert = NRZ_NORMAL;
pconfig.bufsz = RT_SERIAL_RB_BUFSZ;
pconfig.reserved = 0;
/* 设置串口参数 */
rt_device_control(SerialDev.dev, RT_DEVICE_CTRL_CONFIG, &pconfig);
但是看了代码发现4.0.4的代码不支持使用这个来修改缓存大小了:
struct serial_configure *pconfig = (struct serial_configure *) args;
if (pconfig->bufsz != serial->config.bufsz && serial->parent.ref_count)
{
/*can not change buffer size*/
return RT_EBUSY;
}
所以只能在串口驱动里修改了。
(或许有其他的好办法,最好是在atclient中添加一个参数来传到里面去,或者修复完善RT_DEVICE_CTRL_CONFIG)
int rt_hw_usart_init(void)
{
rt_size_t obj_num = sizeof(uart_obj) / sizeof(struct stm32_uart);
struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
rt_err_t result = 0;
stm32_uart_get_dma_config();
for (int i = 0; i < obj_num; i++)
{
/* init UART object */
uart_obj[i].config = &uart_config[i];
uart_obj[i].serial.ops = &stm32_uart_ops;
uart_obj[i].serial.config = config;
// 特殊修改串口2的缓存大小
if (rt_strcmp(uart_obj[i].config->name, "uart2") == 0)
uart_obj[i].serial.config.bufsz = 1024;
/* register UART device */
result = rt_hw_serial_register(&uart_obj[i].serial, uart_obj[i].config->name,
RT_DEVICE_FLAG_RDWR
| RT_DEVICE_FLAG_INT_RX
| RT_DEVICE_FLAG_INT_TX
| uart_obj[i].uart_dma_flag
, NULL);
RT_ASSERT(result == RT_EOK);
}
return result;
}
后面还有一个问题, 我是用atclient设置esp8266做httpd, 一旦超过设定的缓存,就会报错:
先这么滴吧, 自己确保客户端不发送超过1024的字节。