Skip to content
Snippets Groups Projects
Commit 2ad95a1d authored by patacongo's avatar patacongo
Browse files

Correct error handling in the case of an overrun error in the serial driver

git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@3774 42af7a65-404d-4744-a932-0658087f49c3
parent f204ed65
No related branches found
No related tags found
No related merge requests found
......@@ -1900,4 +1900,11 @@
* Makefile: Added a export target that will bundle up all of the NuttX
libraries, header files, and the startup object into an export-able
tarball.
\ No newline at end of file
tarball.
* arch/arm/src/lpc17xx/lpc17_can.h: Correct some typos in the CAN
register definitions.
* drivers/serial/serialirq.c: Correct an error that can occur if the
serial RX buffer becomes full. Data is now discarded in that case;
before, leaving data in the hardware would cause infinite interrupts
one most MCUs since you must read the data in order to clear the
interrupt.
\ No newline at end of file
/************************************************************************************
* drivers/serial/serialirq.c
*
* Copyright (C) 2007-2009 Gregory Nutt. All rights reserved.
* Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
*
* Redistribution and use in source and binary forms, with or without
......@@ -101,8 +101,8 @@ void uart_xmitchars(FAR uart_dev_t *dev)
}
}
/* When all of the characters have been sent from the buffer
* disable the TX interrupt.
/* When all of the characters have been sent from the buffer disable the TX
* interrupt.
*/
if (dev->xmit.head == dev->xmit.tail)
......@@ -110,8 +110,8 @@ void uart_xmitchars(FAR uart_dev_t *dev)
uart_disabletxint(dev);
}
/* If any bytes were removed from the buffer, inform any waiters
* there there is space available.
/* If any bytes were removed from the buffer, inform any waiters there there is
* space available.
*/
if (nbytes)
......@@ -126,8 +126,8 @@ void uart_xmitchars(FAR uart_dev_t *dev)
* Description:
* This function is called from the UART interrupt handler when an interrupt
* is received indicating that are bytes available in the receive fifo. This
* function will add chars to head of receive buffer. Driver read() logic will take
* characters from the tail of the buffer.
* function will add chars to head of receive buffer. Driver read() logic will
* take characters from the tail of the buffer.
*
************************************************************************************/
......@@ -142,28 +142,41 @@ void uart_recvchars(FAR uart_dev_t *dev)
nexthead = 0;
}
/* Loop putting characters into the receive buffer until either: (1) the buffer
* is full, or (2) there are no further characters to add.
/* Loop putting characters into the receive buffer until either there are no
* further characters to available.
*/
while (nexthead != dev->recv.tail && uart_rxavailable(dev))
while (uart_rxavailable(dev))
{
/* Add the character to the buffer */
char ch = uart_receive(dev, &status);
/* If the RX buffer becomes full, then the serial data is discarded. This is
* necessary because on most serial hardware, you must read the data in order
* to clear the RX interrupt. An option on some hardware might be to simply
* disable RX interrupts until the RX buffer becomes non-FULL. However, that
* would probably just cause the overrun to occur in hardware (unless it has
* some large internal buffering).
*/
if (nexthead != dev->recv.tail)
{
/* Add the character to the buffer */
dev->recv.buffer[dev->recv.head] = uart_receive(dev, &status);
nbytes++;
dev->recv.buffer[dev->recv.head] = ch;
nbytes++;
/* Increment the head index */
/* Increment the head index */
dev->recv.head = nexthead;
if (++nexthead >= dev->recv.size)
{
nexthead = 0;
dev->recv.head = nexthead;
if (++nexthead >= dev->recv.size)
{
nexthead = 0;
}
}
}
/* If any bytes were added to the buffer, inform any waiters
* there there is new incoming data available.
/* If any bytes were added to the buffer, inform any waiters there there is new
* incoming data available.
*/
if (nbytes)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment