Results 4 comments of cc-caixf

> 你提到的“数据包中掉**1个**字节”,是不是在遇到 \r\n 两个字符的时候,\n没有了? > > 如果是这种情况的话,原因在于: ./rt-thread/components/net/at/src/at_client.c 的at_recv_readline和client_parser函数中 如果传输的是二进制文件或数据,其中内容当中凑巧有\r\n的字符,at_recv_readline函数会解释为换行 随后client_parser函数当中,会把把\n替换为\0, 导致内容变化。 我是串口接收数据流, 没用到at, 跟你描述的不是同一个现象/问题.

这个串口DMA接收实现(stm32)就是个大坑!!!!! 现在的逻辑是: DMA一直接收, 根本不管buffer有没有溢出, 这将导致: 如果buffer溢出(buffer里面的值可能已经修改了几伦, 然而len值已经不能反应buffer内的真实数据量), 上层(应用层)根本感知不到buffer已经溢出(buffer中的数据已经覆盖再覆盖了, len已经背离真实情况), 上层怎么处理都恢复不了正常状态, 除非关闭再打开串口(清除底层buffer的len, 让len恢复正常). 正常的逻辑不应该是: DMA根据buffer的余量接收, 如果buffer满了, 就不应该接收, 等上层处理完了(buffer有余量了), 在接收数据啊.

> > 这个串口DMA接收实现(stm32)就是个大坑!!!!! > > 现在的逻辑是: DMA一直接收, 根本不管buffer有没有溢出, 这将导致: 如果buffer溢出(buffer里面的值可能已经修改了几伦, 然而len值已经不能反应buffer内的真实数据量), 上层(应用层)根本感知不到buffer已经溢出(buffer中的数据已经覆盖再覆盖了, len已经背离真实情况), 上层怎么处理都恢复不了正常状态, 除非关闭再打开串口(清除底层buffer的len, 让len恢复正常). > > 正常的逻辑不应该是: DMA根据buffer的余量接收, 如果buffer满了, 就不应该接收, 等上层处理完了(buffer有余量了), 在接收数据啊. > > 还可以保证新的数据全部就收,丢弃最旧的数据,反正应用层已经处理不过来了,总需要丢掉一些数据。 > > 放弃...

我对SERIAL_V2框架的问题: 假如驱动实现 INT TX 的`RT_SERIAL_TX_BLOCKING_NO_BUFFER`, 也就是TX用`_serial_fifo_tx_blocking_nbuf()`, 那么SERIAL_V2框架里都[没有初始化`rb`](https://github.com/RT-Thread/rt-thread/blob/ecd29fda6005ef19c625f194f9311259ba907a78/components/drivers/serial/serial_v2.c#L697C11-L697C11), [这里又调用`rt_ringbuffer_data_len()`](https://github.com/RT-Thread/rt-thread/blob/ecd29fda6005ef19c625f194f9311259ba907a78/components/drivers/serial/serial_v2.c#L1552C5-L1552C5), 明显不对. (意思就是 驱动 实现TX 中断模式 下用RT_SERIAL_TX_BLOCKING_NO_BUFFER模式, SERIAL_V2框架会出现错误)