Hi everyone,
I'm currently trying to send a message wireless from an Arduino Uno (emitter) to an Arduino Nano. I'm using Python and Pyserial to do so, since I need to get the message through several algorithms before the transmission step.
When it comes to this step, things do not work anymore. As you'll see, I separated my message in 8-bytes-long strings which I send one after another from the Uno to the Nano. I expect them all to be send to the Nano before I ask it to read them (since the 'for' loop should end before the reading instruction below), and only then, I ask to read what has been received by the Nano.
In the same time, the Nano should wait for an end-of-line character to be received to read the buffer (see code below). However, one of the algorithms I use tells me the variable "recu" is actually empty. Following the Serial Input Basics Tutorial, I think the problem comes from the buffer being read too quickly, and therefore the Nano reading 'empty' slots. Can you help me solving this, if this is the problem ?
What also disturbs me, is that if I add a 'time.sleep(5)' just before the reading instruction, each character sent from the Nano to the Serial Monitor is delayed from 5 seconds, which means the reading instructions works only for one character and goes to the next instruction (every 5 seconds delay means a new execution of the 'while True' loop).
The relevant part of the codes follow :
Python pySerial :
while True :
for i in range(len(bits)):
ArduinoUno.write(bytes(bits[i], 'utf-8'))
time.sleep(5)
recu = str(ArduinoNano.read())
print(recu)
Receiver (Nano) :
#include <SPI.h>
#include <RF24.h>
#define pinCE 7 // On associe la broche "CE" du NRF24L01 à la sortie digitale D7 de l'arduino
#define pinCSN 8 // On associe la broche "CSN" du NRF24L01 à la sortie digitale D8 de l'arduino
#define tunnel "PIPE1" // On définit le "nom de tunnel" (5 caractères) à travers lequel on va recevoir les données de l'émetteur
RF24 radio(pinCE, pinCSN); // Instanciation du NRF24L01
const byte adresse[6] = tunnel; // Mise au format "byte array" du nom du tunnel
char message[32];
boolean newData = false;
const byte numChars = 32;
char receivedChars[numChars];
char add = '\0';
void setup() {
// Initialisation du port série (pour afficher les infos reçues, sur le "Moniteur Série" de l'IDE Arduino)
Serial.begin(9600);
Serial.println("Récepteur NRF24L01");
Serial.println("");
// Partie NRF24
radio.begin(); // Initialisation du module NRF24
radio.openReadingPipe(0, adresse); // Ouverture du tunnel en LECTURE, avec le "nom" qu'on lui a donné
radio.setPALevel(RF24_PA_MIN); // Sélection d'un niveau "MINIMAL" pour communiquer (pas besoin d'une forte puissance, pour nos essais)
radio.startListening(); // Démarrage de l'écoute du NRF24 (signifiant qu'on va recevoir, et non émettre quoi que ce soit, ici)
}
void loop() {
//recvWithEndMarker();
if (radio.available()) { // On vérifie si un message est en attente de lecture
radio.read(&message, sizeof(message));// Si oui, on le charge dans la variable "message"
newData = true;
}
showNewData();
}
Emitter :
#include <SPI.h>
#include <RF24.h>
#define pinCE 7 // On associe la broche "CE" du NRF24L01 à la sortie digitale D7 de l'arduino
#define pinCSN 8 // On associe la broche "CSN" du NRF24L01 à la sortie digitale D8 de l'arduino
#define tunnel "PIPE1" // On définit un "nom de tunnel" (5 caractères), pour pouvoir communiquer d'un NRF24 à l'autre
RF24 radio(pinCE, pinCSN); // Instanciation du NRF24L01
const byte adresse[6] = tunnel; // Mise au format "byte array" du nom du tunnel
// Message à transmettre à l'autre NRF24 (32 caractères maxi, avec cette librairie)
const byte numChars = 32;
char receivedChars[numChars]; // an array to store the received data
boolean newData = false;
void setup() {
Serial.begin(9600);
Serial.println("<Arduino is ready>");
radio.begin(); // Initialisation du module NRF24
radio.openWritingPipe(adresse); // Ouverture du tunnel en ÉCRITURE, avec le "nom" qu'on lui a donné
radio.setPALevel(RF24_PA_MIN); // Sélection d'un niveau "MINIMAL" pour communiquer (pas besoin d'une forte puissance, pour nos essais)
radio.stopListening(); // Arrêt de l'écoute du NRF24 (signifiant qu'on va émettre, et non recevoir, ici)
}
void loop() {
recvWithEndMarker();
sendNewData();
}
void recvWithEndMarker() {
static byte ndx = 0;
char endMarker = '\n';
char rc;
while (Serial.available() > 0 && newData == false) {
rc = Serial.read();
if (rc != endMarker) {
receivedChars[ndx] = rc;
ndx++;
if (ndx >= numChars) {
ndx = numChars - 1;
}
}
else {
receivedChars[ndx] = '\0'; // terminate the string
ndx = 0;
newData = true;
}
}
}
void showNewData() {
if (newData == true) {
Serial.print("This just in ... ");
Serial.println(receivedChars);
newData = false;
}
}
void sendNewData() {
if (newData == true){
radio.write(&receivedChars, sizeof(receivedChars)); // Envoi de notre message
delay(1000);
}
}
Could you please help me locate the problem and understand what I did wrong ?
Thank you all !