diff --git a/components/drivers/serial/serial_v2.c b/components/drivers/serial/serial_v2.c index d7576dbed87dd4d756a719c70eb1658e3bbd576d..3a41f11caf547f2f430b5ad6908dfd2d65555d99 100644 --- a/components/drivers/serial/serial_v2.c +++ b/components/drivers/serial/serial_v2.c @@ -263,23 +263,18 @@ static rt_ssize_t rt_serial_update_write_index(struct rt_ringbuffer *rb, rt_uint16_t size; RT_ASSERT(rb != RT_NULL); - /* whether has enough space */ + /* get available space */ size = rt_ringbuffer_space_len(rb); - /* no space, drop some data */ - if (size < write_size) - { - write_size = size; -#if !defined(RT_USING_ULOG) || defined(ULOG_USING_ISR_LOG) - LOG_W("The serial buffer (len %d) is overflow.", rb->buffer_size); -#endif - } - if (rb->buffer_size - rb->write_index > write_size) { /* this should not cause overflow because there is enough space for * length of data in current mirror */ rb->write_index += write_size; + if (write_size > size) + { + rb->read_index = rb->write_index; + } return write_size; } @@ -287,6 +282,14 @@ static rt_ssize_t rt_serial_update_write_index(struct rt_ringbuffer *rb, rb->write_mirror = ~rb->write_mirror; rb->write_index = write_size - (rb->buffer_size - rb->write_index); + if (write_size > size) + { + /* available space is insufficient,it will overwrite the existing data + * in the ring buffer.*/ + if (rb->write_index <= rb->read_index) + rb->read_mirror = ~rb->read_mirror; + rb->read_index = rb->write_index; + } return write_size; }