Go Down

Topic: Problema con seriale, dati ripetuti (Read 1 time) previous topic - next topic

blasted

Nov 06, 2013, 06:08 pm Last Edit: Nov 08, 2013, 01:01 pm by blasted Reason: 1
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 http://forum.arduino.cc/index.php?topic=189564.0 )

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
Code: [Select]
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è:
Code: [Select]
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!

gpb01

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

Guglielmo
Search is Your friend ... or I am Your enemy !

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.

blasted

#3
Nov 08, 2013, 01:00 pm Last Edit: Nov 08, 2013, 01:18 pm by blasted Reason: 1
Ho risolto aumentando la dimensione del vettore.. anche se non riesco a capire ancora delle volte funzionava e altre no.


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 :D

-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!


gpb01


-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 ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

madmatt71


Ancora qualche domandina :D

-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 ? http://playground.arduino.cc/Main/Printf

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

blasted



Ancora qualche domandina :D

-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 ? http://playground.arduino.cc/Main/Printf

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?

madmatt71



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: http://www.bo.cnr.it/corsi-di-informatica/corsoCstandard/Lezioni/07Operatori.html 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 :


Code: [Select]

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



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
Code: [Select]
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.
my name is IGOR, not AIGOR

blasted

#9
Nov 08, 2013, 05:26 pm Last Edit: Nov 08, 2013, 06:44 pm by blasted Reason: 1

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
Code: [Select]
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.


Si perfetto, funziona.
Grazie!

Go Up