mirror of
https://github.com/arduino/Arduino.git
synced 2025-01-17 06:52:18 +01:00
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:
parent
61b33f11ce
commit
1278144d50
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
@ -74,4 +74,6 @@ class HardwareSerial : public Stream
|
||||
extern HardwareSerial Serial3;
|
||||
#endif
|
||||
|
||||
extern void serialEventRun(void);
|
||||
|
||||
#endif
|
||||
|
@ -7,8 +7,10 @@ int main(void)
|
||||
|
||||
setup();
|
||||
|
||||
for (;;)
|
||||
for (;;) {
|
||||
loop();
|
||||
serialEventRun();
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user