I'm using a RedBear Duo to read the Serial writes from a RedBear Nano v2. Basically, I use a digital pin of the Duo to raise an interrupt on the Nano. Once, the nano catches the interrupt it writes on its Serial.
You can find a minimum working example below:
RedBear Duo
#include <Wire.h>
/*BLE and WiFi setup*/
#if defined(ARDUINO)
SYSTEM_MODE(MANUAL);
#endif
char incomingByte; // for incoming serial data
void setup() {
Serial1.begin(115200); // opens serial port, sets data rate to 9600 bps
delay(500);
Serial1.println("Begin!");
Serial2.begin(115200);
pinMode(D5, OUTPUT);
}
void readSerial() {
while (Serial2.available() > 0) {
incomingByte = Serial2.read();
Serial1.print(incomingByte);
}
Serial1.println(" ");
}
void loop() {
digitalWrite(D5, HIGH);
readSerial();
delay(2); // Here's the delay I'm talking about
digitalWrite(D5, LOW);
delay(1000);
}
RedBear Nano
uint8_t fire;
void task_handle(void) {
fire = 1;
}
void setup() {
Serial.begin(115200);
fire = 0;
pinMode(D4, INPUT);
attachInterrupt(D4, task_handle, RISING);
}
void loop() {
if (fire == 1) {
fire = 0;
Serial.write("hello ");
// Serial.println("fire");
digitalWrite(D13, HIGH);
}
delay(150);
}
I found this question (https://electronics.stackexchange.com/questions/28739/arduino-delay-of-1ms-necessary-between-serial-read-and-serial-write), and I understood that the problem might be the fact that it takes a while to empty the Serial buffer.
However, I tried to bring the baudrate at 500000 (more than 3x) and still if I change the delay to delay(1), the code is not printing what it has received on the Serial.
I'm trying to understand what is really going on and why I need this delay(2).
Thanks a lot in advance!
-
declare the variable fire as volatileJuraj– Juraj ♦2018年05月07日 06:25:37 +00:00Commented May 7, 2018 at 6:25
2 Answers 2
Try this code: first delay produces 1ms pulse on pin D5. Without this delay the pulse could be too short for the nano to catch it (you can use delayUs and try finding the shortest interval that produces reliable result). We know that after this pulse, nano sends some data. So wait 100ms to collect it. If you call readSerial right after the pulse was sent, you won't get anything, because you need to wait at least for single byte transmission
void loop() {
digitalWrite(D5, HIGH);
delay(1);
digitalWrite(D5, LOW);
delay(100);
readSerial();
delay(1000);
}
This line is wrong:
attachInterrupt(D4, task_handle, RISING);
It should be:
attachInterrupt (digitalPinToInterrupt (4), task_handle, RISING);
In any case, attachInterrupt does not apply to D4, it is for D2 and D3 on the Atmega328P.
Note that the pin number is 4, not D4.