at client 接收esp8266的数据的时候有一部分数据丢失了。串口接收不完整。
查看更多
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);
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; }
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;}
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的字节。