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
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 )
Perché sembra che tu vada a sporcare la memoria ... e, a quel punto, può succedere di tutto XD
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
-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.
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
-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.
-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 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
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;