Moving serialEvent() calls from RX interrupts to main for() loop (after loop()).

http://code.google.com/p/arduino/issues/detail?id=584
This commit is contained in:
David A. Mellis 2011-08-31 15:52:56 -04:00
parent 61b33f11ce
commit 1278144d50
4 changed files with 69 additions and 17 deletions

View File

@ -38,20 +38,23 @@ void loop() {
}
/*
SerialEvent occurs whenever a new byte comes in the
hardware serial RX. Don't do complex things here, as the
processor halts the regular program to run this routine:
SerialEvent occurs whenever a new data comes in the
hardware serial RX. This routine is run between each
time loop() runs, so using delay inside loop can delay
response. Multiple bytes of data may be available.
*/
void serialEvent() {
// get the new byte:
char inChar = (char)Serial.read();
// add it to the inputString:
inputString += inChar;
// if the incoming character is a newline, set a flag
// so the main loop can do something about it:
if (inChar == '\n') {
stringComplete = true;
}
while (Serial.available()) {
// get the new byte:
char inChar = (char)Serial.read();
// add it to the inputString:
inputString += inChar;
// if the incoming character is a newline, set a flag
// so the main loop can do something about it:
if (inChar == '\n') {
stringComplete = true;
}
}
}

View File

@ -88,6 +88,8 @@ inline void store_char(unsigned char c, ring_buffer *buffer)
#else
void serialEvent() __attribute__((weak));
void serialEvent() {}
volatile static unsigned char serialEvent_flag = 0;
#define serialEvent_implemented
#if defined(USART_RX_vect)
SIGNAL(USART_RX_vect)
#elif defined(SIG_USART0_RECV)
@ -108,18 +110,20 @@ inline void store_char(unsigned char c, ring_buffer *buffer)
#error UDR not defined
#endif
store_char(c, &rx_buffer);
serialEvent();
serialEvent_flag = 1;
}
#endif
#if defined(USART1_RX_vect)
void serialEvent1() __attribute__((weak));
void serialEvent1() {}
volatile static unsigned char serialEvent1_flag = 0;
#define serialEvent1_implemented
SIGNAL(USART1_RX_vect)
{
unsigned char c = UDR1;
store_char(c, &rx_buffer1);
serialEvent1();
serialEvent1_flag = 1;
}
#elif defined(SIG_USART1_RECV)
#error SIG_USART1_RECV
@ -128,11 +132,13 @@ inline void store_char(unsigned char c, ring_buffer *buffer)
#if defined(USART2_RX_vect) && defined(UDR2)
void serialEvent2() __attribute__((weak));
void serialEvent2() {}
volatile static unsigned char serialEvent2_flag = 0;
#define serialEvent2_implemented
SIGNAL(USART2_RX_vect)
{
unsigned char c = UDR2;
store_char(c, &rx_buffer2);
serialEvent2();
serialEvent2_flag = 1;
}
#elif defined(SIG_USART2_RECV)
#error SIG_USART2_RECV
@ -141,16 +147,55 @@ inline void store_char(unsigned char c, ring_buffer *buffer)
#if defined(USART3_RX_vect) && defined(UDR3)
void serialEvent3() __attribute__((weak));
void serialEvent3() {}
volatile static unsigned char serialEvent3_flag = 0;
#define serialEvent3_implemented
SIGNAL(USART3_RX_vect)
{
unsigned char c = UDR3;
store_char(c, &rx_buffer3);
serialEvent3();
serialEvent3_flag = 1;
}
#elif defined(SIG_USART3_RECV)
#error SIG_USART3_RECV
#endif
void serialEventRun(void)
{
unsigned char flag, oldSREG;
#ifdef serialEvent_implemented
oldSREG = SREG;
noInterrupts();
flag = serialEvent_flag;
serialEvent_flag = 0;
SREG = oldSREG;
if (flag) serialEvent();
#endif
#ifdef serialEvent1_implemented
oldSREG = SREG;
noInterrupts();
flag = serialEvent1_flag;
serialEvent1_flag = 0;
SREG = oldSREG;
if (flag) serialEvent1();
#endif
#ifdef serialEvent2_implemented
oldSREG = SREG;
noInterrupts();
flag = serialEvent2_flag;
serialEvent2_flag = 0;
SREG = oldSREG;
if (flag) serialEvent2();
#endif
#ifdef serialEvent3_implemented
oldSREG = SREG;
noInterrupts();
flag = serialEvent3_flag;
serialEvent3_flag = 0;
SREG = oldSREG;
if (flag) serialEvent3();
#endif
}
#if !defined(UART0_UDRE_vect) && !defined(UART_UDRE_vect) && !defined(USART0_UDRE_vect) && !defined(USART_UDRE_vect)
#error Don't know what the Data Register Empty vector is called for the first UART

View File

@ -74,4 +74,6 @@ class HardwareSerial : public Stream
extern HardwareSerial Serial3;
#endif
extern void serialEventRun(void);
#endif

View File

@ -7,8 +7,10 @@ int main(void)
setup();
for (;;)
for (;;) {
loop();
serialEventRun();
}
return 0;
}