Serial Interrupts on Redboard Artemis Nano

Hi Everyone,

Hope we are all well!

I am trying to figure out how to implement the serial interrupt in either Arduino or the HAL language. for the Redboard Artemis Nano

I can find the examples on Arduino for general interrupts and for Serial communications, but not for what would essentially be “Serial.event()” in your traditional Arduino coding.

If anyone can help out, that would be really appreciated!

Cheers,

YF

That Apollo3 code does not have this option.

In Arduino’s main.cpp, as part of the never-ending loop, it has a check added for the "serialEventRun’ mechanism. If that is defined it will be called. In Arduino, it is actually defined in HardwareSerial.cpp. The Apollo3 board library has as part of the never-ending loop in main.cpp only loop().

Now it looks as if it is a serial interrupt, but if you check the code in Arduino it is clear that it only checks whether Serial data is available AND the serialEvent routine exists. If so, it will call that serialEvent-routine.

It is easy to add that in the loop() in your sketch.

Thanks Paul!

I reviewed the hardwareserial.cpp / .h files.

I’m not sure I understand what a weak reference is.

I tried running the serialEventRun() method which doesn’t work and tried referencing it as serial.serialEventRun() which doesn’t compile.

are you able to show me a very basic example?

any help would be really appreciated.

YF

it is defined as weak which means “it MIGHT be in place defined somewhere else”. Using the information from https://www.arduino.cc/en/Tutorial/Buil … erialEvent.

This does basically the same as Arduino does…

/*
  Serial Event example

  When new serial data arrives, this sketch adds it to a String.
  When a newline is received, the loop prints the string and clears it.

  This example code is in the public domain.

  https://www.arduino.cc/en/Tutorial/BuiltInExamples/SerialEvent
*/

String inputString = "";         // a String to hold incoming data
bool stringComplete = false;  // whether the string is complete

void setup() {
  // initialize serial:
  Serial.begin(9600);
  // reserve 200 bytes for the inputString:
  inputString.reserve(200);
}

void loop() {
  // print the string when a newline arrives:
  if (stringComplete) {
    Serial.println(inputString);
    // clear the string:
    inputString = "";
    stringComplete = false;
  }

  // now check whether anything has been received
  serialEvent();
}

/*
  SerialEvent occurs whenever a new data comes in the hardware serial RX. This
  routine is run each time loop() runs, so using delay inside loop can
  delay response. Multiple bytes of data may be available.
*/
void serialEvent() {
  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;
    }
  }
}

Thanks Paul, you’re a champ, works like charm.

YF.