Problema con seriale, dati ripetuti

Ciao a tutti ragazzi,

sono incappato in un nuovo problema. Il mio progetto è sempre quello di collegare il mio arduino uno con un PLC Omron tramite seriale. (vedi vedi discussione Hostlink PLC e arduino, generare FCS - Software - Arduino Forum )

Questa volta invece riesco a trasmettere e ricevere i dati con il PLC. Il problema è quando vado a creare un programma undendo le due cose.
Praticamente se utilizzo solo la parte per ricevere i dati dal PLC, quindi eliminando la trasmissione di un byte nella memoria del PLC, il programma funziona correttamente.

Praticamente utilizzando solo questo codice nel loop

 if(valletto=='a'){ //legge dal PLC
    ReadArea(areadaleg);
    delay(10);
    
    serialEvent();
     for(int a=0;a<14;a++){
    valoreletto[a]=(mySerial.read());
     }
     
     delay(200);
    Serial.println(valoreletto);
    }

Dalla seriale ricevo:

Stringa inviata al PLC: @00RR0002000143*
e funziona tutto correttamente

mentre se aggiungo il secondo pezzo cioè:

 if(valletto=='k'){   //Scrive sul PLC
 WriteArea(areadascrivere,valdascrivere);
 }

il programma inizia a non funzionare bene. Dalla seriale ricevo:
Stringa inviata al PLC: @00RR0002000143*@00WR00020001
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ

Grazie!

Premesso che non ho avuto tempo di esaminare in dettaglio il codice ...
... sicuro di aver tenuto conto, nei tuoi calcoli degli array di char, della giusta lunghezza ? Compreso il carattere terminatore di string a 0x00 ? (cioè, sai vero che "123" è lungo 4 caratteri :wink: )

Perché sembra che tu vada a sporcare la memoria ... e, a quel punto, può succedere di tutto XD

Guglielmo

Mettendo Serial.write al posto di Serial.print? Spedendo singoli byte, il metodo write spedisce il dato grezzo mentre print lo formatta prima dell'invio in base al dato da spedire.

Ho risolto aumentando la dimensione del vettore.. anche se non riesco a capire ancora delle volte funzionava e altre no.

leo72:
Mettendo Serial.write al posto di Serial.print? Spedendo singoli byte, il metodo write spedisce il dato grezzo mentre print lo formatta prima dell'invio in base al dato da spedire.

se utilizzo mySerial.write non funziona più niente.

Ancora qualche domandina :smiley:

-Conoscete qualche funzione che mi permette di scrivere un singolo bit alla volta in una variabile di tipo int? (tipo nel pic variabile.b1)----> risolto utilizzo bitWrite()

-Poi se è possibile recuperare il valore dalla variabile int direttamente in valore in esadecimale senza convertirla da int in hex.
O magari, se bisogna convertirla, qualche funzione che può aiutarmi.

Grazie ancora!

blasted:
-Conoscete qualche funzione che mi permette di scrivere un singolo bit alla volta in una variabile di tipo int? (tipo nel pic variabile.b1)----> risolto utilizzo bitSet()

Credo che il sistema più rapido sia usare l'operatore OR per settare i singoli bit (... tutti a 0 meno quello da settare a 1) e l'operatore AND per resettarli (tutti a 1 meno quello da resettare a 0) ... in una operazione ne setti o resetti quanti ne vuoi :wink:

Guglielmo

blasted:
Ancora qualche domandina :smiley:

-Poi se è possibile recuperare il valore dalla variabile int direttamente in valore in esadecimale senza convertirla da int in hex.
O magari, se bisogna convertirla, qualche funzione che può aiutarmi.

Recuperare a video ? Arduino Playground - HomePage

Recuperare e mettere da qualche altra parte ? Non è chiara la domanda, magari fai un esempio ...

madmatt71:

blasted:
Ancora qualche domandina :smiley:

-Poi se è possibile recuperare il valore dalla variabile int direttamente in valore in esadecimale senza convertirla da int in hex.
O magari, se bisogna convertirla, qualche funzione che può aiutarmi.

Recuperare a video ? Arduino Playground - HomePage

Recuperare e mettere da qualche altra parte ? Non è chiara la domanda, magari fai un esempio ...

si scusa, mi sono espresso male. praticamente ho una variabile di tipo int, ho bisogno di recuperare il valore in hex per poi andarlo ad inserirlo in un vettore.
Cioè, facciamo finta che dichiaro una variabile e ci inserisco:
int a=65535; //cioè tutti i bit a 1, in HEX= FFFF
adesso vorrei inserire in un vettore il numero, esempio
char pippo[5];
pippo[0]= la prima F
...
pippo[4]= l'ultima F

Come potrei fare?

blasted:
si scusa, mi sono espresso male. praticamente ho una variabile di tipo int, ho bisogno di recuperare il valore in hex per poi andarlo ad inserirlo in un vettore.
Cioè, facciamo finta che dichiaro una variabile e ci inserisco:
int a=65535; //cioè tutti i bit a 1, in HEX= FFFF
adesso vorrei inserire in un vettore il numero, esempio
char pippo[5];
pippo[0]= la prima F
...
pippo[4]= l'ultima F

Come potrei fare?

1 - Leggere qui: Operatori e operandi CPP e capire come si usano gli shift e gli and binari, e capire la rappresentazione binaria di un numero
2 - 65535 valori sono 2^16 e stanno in due char, ma ammettiamo che tu per qualche ragione voglia lo stesso dividere i 16 bit che rappresentano un intero in 4 byte che avranno quindi ognuno un valore compreso tra 0 e 16 (decimale) o 0 e F (hex), dovrai quindi splittare i tuoi sedici bit :

char pippo[4]; // non 5 ! 
pippo[0]= a >> 12 & 0x0F;
pippo[1]= a >> 8 & 0x0F ;
pippo[2]= a >> 4 & 0x0F;
pippo[3]= a & 0x0F;

Credo @Blasted abbia bisogno del valore in testo 65535=>FFFF
Se è così usi la snprint() omologa della printf() base del C ma invece di stampare (formattando) variabili su video, stampa in un vettore.
http://www.cplusplus.com/reference/cstdio/snprintf/?kw=snprintf

char pippo[10];
unsigned int num=65535;
snprintf(pippo,10,"%x",num);

Mi sembra che però ti stampa anche i caratteri 0xFFFF
Fai un pò di prove.

nid69ita:
Credo @Blasted abbia bisogno del valore in testo 65535=>FFFF
Se è così usi la snprint() omologa della printf() base del C ma invece di stampare (formattando) variabili su video, stampa in un vettore.
http://www.cplusplus.com/reference/cstdio/snprintf/?kw=snprintf

char pippo[10];

unsigned int num=65535;
snprintf(pippo,10,"%x",num);




Mi sembra che però ti stampa anche i caratteri <mark>0x</mark>FFFF
Fai un pò di prove.

Si perfetto, funziona.
Grazie!