Inserimento valori in Union

Buongiorno,
sto cercando di inviare dei lavori tra due schede arduino mega utilizzando il metodo Union.
finche trasmetto dei valori preimpostati tutto apposto, i dati partono e il ricevitore ricompone il tutto.
ma quando cerco di dire al trasmettitore che al posto dei valori preimpostati deve trasmettere i valori che riceve da bluetooth (e in futuro da altre fonti) on riesco a fargliele digerire.

per cominciare in questo caso la sceda trasmettitore dovrà ricevere via bluetooth (per cominciare a lavorare) singoli caratteri a b c ecc… ma in futuro ho l’intenzione di fargli arrivare anche stringhe. poi la scheda farà quello che dovrà fare e ritrasmettere il ricevuto dal BT (assieme ad altri valori) alla seconda scheda.

qui ho postato solo la parte union e bt (per pulire un pò)

#include "def.h"

struct N_001_DATA
{
  char cmd;
  int count;
  float temp;
};

N_001_DATA N_001_DATAPACK = {"", 0, 18.0f};


void setup()
{
  Serial.begin(9600);
  Serial1.begin(115200);
  ARTV_00.begin(9600);
}

void loop()
{
    if (ARTV_00.available())
  {
    char ch = ARTV_00.read();
    Serial.write(ch);
  }

  
  Serial1.write((const uint8_t *)&N_001_DATAPACK, sizeof(struct N_001_DATA));
  Serial1.write((byte)'\n');
  N_001_DATAPACK.count++;
  N_001_DATAPACK.cmd = ch;
  
  delay(1000);
} 

nella def.h devinisco semplicemente la libreria softwareSerial e i relativi pin.

Grazie in anticipo

Buongiorno e benvenuto, :slight_smile:
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione … possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il succitato REGOLAMENTO … Grazie. :slight_smile:

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nel rispetto del suddetto regolamento nessuno ti risponderà, quindi ti consiglio di farla al più presto. :wink:

P.P.S.: Il codice NON metterlo come immagine, ma come testo racchiuso tra i tag CODE (bottone </>). Grazie.

letto presentato e corretto
scusate

Onestamente non ho capito cosa non funziona.
L’inserimento di valori a runtime nella union?
La trasmissione della union?

quello che vorrei riuscire a fare è ricevede dei valori da vari sensori e da bluetooth e impacchettarli tutti assieme per poi inviarli ad un altra scheda.
solo che non riesco a inserire i valori nella struttura.

in questo caso char cmd deve assumere i caratteri ricevuti da bluetooth (singoli carateri), essere impacchettato assieme al contatore ecc.

se definisco i valori manualmente {"", o, 18.0f} nessun problema, il pacchetto parte e arriva non riesco appunto ad assegnargli valori che cambiano a seconda di cosa riceve il Bluetooth

Ma il codice che hai postato ti compila?
A me da errore su ch… l’hai dichiarata dentro l’if e quindi fuori non è visibile.

ri ho inserito anche la pagina delle definizioni e appunto, il problema è nella dichiarazione del valore preso da bt.
se elimino quella parte funziona, ma assegnado il valore da esterno non va

#ifndef ANTROVER_001_DCM_DEF_H
#define ANTROVER_001_DCM_DEF_H

/*
 * DEFINIAMO LE LIBRERIE IN USO DA ANTROVER 001 DCM
 */
 #include <Arduino.h>        // Includiamo Libreria STD Arduino
 #include <SoftwareSerial.h>        // Includiamo Libreria Seriale Software
#include <set.h>
/*
 * DICHIARIAMO GLI OGGETTI IN UNO DA ANTROVER 001 DCM
 */
SoftwareSerial ARTV_00(52, 53);        //RX - TX
 
 #endif
#include "def.h"

struct N_001_DATA
{
  char cmd;
  int count;
  float temp;
};

N_001_DATA N_001_DATAPACK = {"", 0, 18.0f};


void setup()
{
  Serial.begin(9600);
  Serial1.begin(115200);
  ARTV_00.begin(9600);
}

void loop()
{
    if (ARTV_00.available())
  {
    char ch = ARTV_00.read();
    Serial.write(ch);
  }

  
  Serial1.write((const uint8_t *)&N_001_DATAPACK, sizeof(struct N_001_DATA));
  Serial1.write((byte)'\n');
  N_001_DATAPACK.count++;
  N_001_DATAPACK.cmd = ch;
  
  delay(1000);

Il problema è come hai dichiarato la variabile ch.
Come l’hai messa tu, quella variabile è visibile solo dentro le graffe dell’if.
Devi dichiararla fuori dall’if.
Prova a mettere char ch; in alto prima del setup() e togli il char dentro l’if.

ok! mi compila senza errori, ed è gia un ottimo passo.

se guardo a seriale ora mi riceve solo punti di domanda anche se invio caratteri singoli via bluetooth, sia su quella che riceve il segnale bluetooth e (giustamente dato che gli vengono trasmessi) anche l’altra che riceve il pacchetto.

read() restituisce un byte, prova a forzare il cast a char

char ch = (char) ARTV_00.read();

nope!
continua a restituire



Mi sembra di aver capito che stai usando una MEGA

Perché stai usando una softserial se usi quella?

Ho bisogno di sapere il collegamento esatto tra le due schede

Mi sembra che sia un problema di baud rate, ma devo capire come colleghi cosa

Inoltre stai inizializzando male la struttura che usi come contenitore
Il primo campo è char, ma tu lo inizializzi a stringa

Non va bene

Metti tutti e due i programmi

uso la software serial per il BT perchè più avanti con i lavori mi serviranno le altre rx/tx.

TRASMETTITORE

#ifndef DEF_H
#define DEF_H

 #include <Arduino.h>   
 #include <SoftwareSerial.h>    
#include <set.h>

SoftwareSerial ARTV_00(52, 53);        //RX - TX
 
 #endif
#include "def.h"

struct N_001_DATA
{
  char cmd;
};

N_001_DATA N_001_DATAPACK;
char ch = (char) ARTV_00.read();

void setup()
{
  Serial.begin(9600);
  Serial1.begin(115200);
  ARTV_00.begin(9600);
}

void loop()
{
    if (ARTV_00.available())
  {
    Serial.write(ch);
  }
   Serial1.write((const uint8_t *)&N_001_DATAPACK, sizeof(struct N_001_DATA));
  Serial1.write((byte)'\n');
  N_001_DATAPACK.cmd = ch;
  
  delay(1000);
 }

RICEVITORE (attualmente non ho ancora configurato lo smanellamento della struct dato che riceve per ora 1 solo carattere, poi la implemento quando collegherò anche il resto)

void setup()
{
  Serial.begin(9600);
  Serial1.begin(115200);

  pinMode(13, OUTPUT);

  Serial.println("ok");
}

void loop()
{
  if (Serial1.available())
  {
    char ch2 = Serial1.read();

    Serial.print(ch2);

    if (ch2 == 's')
    {
      digitalWrite(13, LOW);
      Serial.println(" OFF");
    }

    else if (ch2 == 'a')
    {
      digitalWrite(13, HIGH);
      Serial.println(" ON");
    }
  }
}

Mah, ho varii dubbi..

Comunque tu leggi una volta sola dalla softserial

E quindi trasmetti solo e sempre lo stesso valore letto la prima e unica volta

Ah
Aggiungo

Indenta 'seriamente' i tuoi programmi
Altrimenti non ci si capisce dentro un accidenti

E se non capisco mi passa la voglia di aiutare...