Pages: 1 [2] 3   Go Down
Author Topic: Strano comportamento seriale  (Read 2419 times)
0 Members and 1 Guest are viewing this topic.
0
Online Online
Shannon Member
****
Karma: 132
Posts: 10498
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

quando il pc apre la porta seriale invia un comando di reset, che riavvia l'arduino. Cerca il sistema per disattivare l'autorest
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Newbie
*
Karma: 0
Posts: 44
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ma questo reset lo manda solo la prima volta dopo aver riavviato il pc o lo fa sempre?
Perchè se lo facesse sempre non mi spiego come mai, dopo aver fatto la procedura "si pianta, CTRL z" (scusate la terminologia, è per cercare di farmi capire), dovrebbe sempre mandare il reset e  sarei sempre al punto di partenza invece fino al riavvio successivo del pc tutto funziona correttamente. Posso aprire la connessione seriale tutte le volte che vohlio senza avere problemi, i dati che arrivano sono sempre perfetti.

Ne approfitto per ringraziare tutti dell'aiuto che mi state dando.
Logged

0
Online Online
Shannon Member
****
Karma: 132
Posts: 10498
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

lo invia non al riavvio del PC, ma ogni volta che apri la porta seriale.

esempio: apri il SerialMonitor? viene inviato un reset. Chiudi il serialMonito e lo riapri? altro reset. Riavvi il PC? non succede nulla. Apri arduino e poi il SerialMonitor? reset!
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Newbie
*
Karma: 0
Posts: 44
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Allora non penso proprio che disabilitare l'autoreset possa risolvere il mio problema...
Mi ci vuole qualcosa che dopo aver riavviato il pc riesca a ristabilire il collegamento seriale con Arduino nella maniera corretta.
Logged

0
Online Online
Shannon Member
****
Karma: 132
Posts: 10498
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ah, ok, ho riletto qualche messaggio, il problema pare della libreria phyton.

Quale usi? hai il link? se è quella che penso io il suo sviluppo è fermo al 2009... non mi stupisco che sia buggata
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Newbie
*
Karma: 0
Posts: 44
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Uso python per fare queste prove perchè è più semplice ma in realtà dovrò leggere la seriale da PHP e il comportamento è il medesimo.
Logged

0
Online Online
Shannon Member
****
Karma: 132
Posts: 10498
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

scusa intendevo quella PHP, però se il problema è anche python... do un occhio allo sketch, arrivo

edit: eccomi, manca il file .ino quindi è impossibile capire se ho ragione però:

1. l'apertura della serial resetta l'arduino
2. per qualche istante c'è il boot-loader in ascolto per lo sketch, se scrivi qualcosa fai casino. Per questo un delay di mezzo secondi, facciamo uno dovrebbe bastare
3. ora però tutte le variabili di arduino sono a 0 finchè lo sketch non effettua la prima lettura

togli il reset e risolvi i due problemi di conseguenza, IMHO.

Oppure verifica il 3. semplicemente richiedendo i dati più volte via phyton o quel che l'è
« Last Edit: April 04, 2013, 01:25:52 pm by lesto » Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Newbie
*
Karma: 0
Posts: 44
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

E' vero, non ho messo lo sketch però è anche vero che lo sketch funziona. Se lo testo dal serial monitor, ma anche da python dopo aver fatto il "si pianta CTRL z" funziona perfettamente...
La prova di mettere una pausa dopo l'apertura della seriale me l'ha suggerita anche il buon MauroTec: il comportamento sembra buono perchè non si pitanta niente ma i dati che mi arrivano dalla seriale sono parziali.
Se leggi il post in questo thread del  "Posted on: April 03, 2013, 09:15:48 AM" potrai vedere tutte le prove che ho già fatto
Logged

0
Online Online
Shannon Member
****
Karma: 132
Posts: 10498
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

non sto mettendo in dubbio che lo sketch funzioni (bhe qui sarebbe da discutere cosa vuol dire "funziona", visto che a quanto pare qualcosa da qualche parte NON funziona), ma che ci metta un pò di tempo ad acquisire i dati dopo che arduino è stato avviato. E che mentre i dati non sono acquisisti stampa sempre 0. E che il reset ovviamente riavvia arduino e quindi i dati sono da re-acquisire.

Però non posso verificare questa teoria a meno che non lo verifichi te, o non mi posti il codice dello sketch.

Quote
Oppure verifica il 3. semplicemente richiedendo i dati più volte via phyton o quel che l'è

quando lo fai da serial monitor, magari iil tempo che ci metti a scrivere il comando + premere invio è sufficiente.

Quando premi CTRL+z è un test che hai fatto quando NON c'era il primo sleep nel codice phyton.

Quando hai messo lo sleep il codice ha funzionato:
infatti tu aprivi la seriale e scrivevi sunti "c1", ma mentre aprivi la seriale arduino si resettava, e visto che impiega qualche istante (< 1 secondo il boot-loader, + tempo del setup fino a Serial.begin(XXX) ), il dato veniva perso. poi pithon si metteva in ascolto di una risposta che non arrivava mai, ed ecco che il programma sembrava bloccato.

Non so perchè il CTRL+z abbia funzionato, non sapendo cosa faccia. posso immaginare che resettasse in modo "soft" il python, senza chiudere la seriale, quindi ritrovandosela già aperta phyton la riutilizzava senza chiuderla e riaprirla (inviando il segnale di reset)

Anzi, cercando "phyton CRTL+z" a quanto pare il CTRL+z DI SOLITO è il carattere "26" della tabella ascii...
Vuoi vedere che lo sketch arduino non vuole un "c1" MA un "c1\n" o un "c1\r", ma questo NON spiegerebbe come mai funziona il resto.

di nuovo, senza vedere lo sketch nulla da dire di certo, solo IPOTESI, e in quanto ipotesi sono campate per aria. posso andare avanti tutta la sera a farne se vuoi, ma preferisco andare a dormire smiley

se vuoi una mano posta codice completo di phyton e di arduino, entrambi così come li usi, se no non ne usciamo vivi.
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Newbie
*
Karma: 0
Posts: 44
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Per quanto riguarda il punto 3 provo più e più volte ma il risultato è sempre lo stesso; senza fare la procedura "si pianta, CTRL z" i dati che arrivano sono incompleti.

Vista la disponibilità per cui ringrazio ancora, posto il codice dello sketch e il programma python. Li ho messi in allegato, spero vada bene...

* rileva.ino (7.66 KB - downloaded 5 times.)
* bottarisposta.py (0.14 KB - downloaded 7 times.)
Logged

0
Online Online
Shannon Member
****
Karma: 132
Posts: 10498
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ma quindi anche col delay ti si impalla finchè non premi CTRL+z? allora che cambia tra con e senza delay??


PROBLEMA DEL "BLOCCO":
se l'arduino si apetta di leggere 'c', perchè tu invii "c1"??
può avvenire per caso che un carattere venga perso, e poichè tu controlli solo il carattere ricevuto nell'index 0, se perdi il primo carattere (c), leggerai sempre '1' che appunto vuol dire fai nulla. Quindi quando premi CTRL+z che invia UN carattere (indipendentemente quale sia, il tuo skecth ritorna "allienato" con il carattere 'c'. Notare che che la trasmissione in realtà in rarissimi casi si può ridisallineare, in particolare che l'availble ti fa uscire dal ciclo mentre hai letto C ma non ancora 1, ma è rarissimo.

PROBLEMA DEI DATI A 0:
come previsto, la funzione "leggiSensori()" viene eseguita solo una volta ogni 5 secondi!!!!
quindi quando apri la seriale E' NORMALE che leggi sempre 0 per quei valori finchè non passano 5 secondi (per via del reset). Fai la prova: trasforma il delay del phyton a 6 secondi e vedrai che finalmente vedi i tuoi valori... oppure metti il condensatore anti-reset (che ti ricordo non è una modifica permanente) e dopo 5 secondi che l'arduino è acceso tutto funzionerà senza problemi.
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

0
Offline Offline
Faraday Member
**
Karma: 31
Posts: 2908
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Penso proprio che lesto ci ha preso, il problema è nella funzione leggi sensori, risolvi passandogli un argomendo "bool now"

Se now è vero non attende 5 secondi. Dal setup chiami leggiSensori(true) e così la prima lettura sensori avviene subito.

In C++, ci sono i parametri di funzione di default, questi li ottieni dichiarando la funzione così:

Code:
void myFunc(boolean now=false);

void myFunc(boolean now)
{
   // your code
}

Ciao.

Logged

AvrDudeQui front end per avrdude https://gitorious.org/avrdudequi/pages/Home

Offline Offline
Newbie
*
Karma: 0
Posts: 44
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
PROBLEMA DEI DATI A 0:
come previsto, la funzione "leggiSensori()" viene eseguita solo una volta ogni 5 secondi!!!!
quindi quando apri la seriale E' NORMALE che leggi sempre 0 per quei valori finchè non passano 5 secondi (per via del reset). Fai la prova: trasforma il delay del phyton a 6 secondi e vedrai che finalmente vedi i tuoi valori... oppure metti il condensatore anti-reset (che ti ricordo non è una modifica permanente) e dopo 5 secondi che l'arduino è acceso tutto funzionerà senza problemi.

Parto a risponderti dalla fine perchè così funziona!!!! Grazie 1000.
Direi anche di aver capito dopo la tua spiegazione (e tu dirai: era ora!!!)
In pratica tutte le volte che apro la seriale lo sketch parte da capo.
Io aspettavo solo due secondi ma allo sketch, per arrivare a leggere i valori che non mi arrivavano,  ne servivano almeno 5 di secondi e col fatto che tutte le volte lo facevo partire da capo, con l'apertura della seriale a quella parte del codice non ci arrivava mai perchè la variabile che gestisce quei 5 secondi veniva sempre azzerata.
Continuo però a non capire come mai una volta che davo il CTRL z il problema spariva; forse la connessione con la seriale rimaneva sempre attiva e quindi non veniva più mandato il reset???

Quote
Ma quindi anche col delay ti si impalla finchè non premi CTRL+z? allora che cambia tra con e senza delay??

Premessa: partiamo sempre da una situazione in cui ho appena riavviato il pc.
Se nel codice python metto il delay il collegamento con la seriale funziona ma non mi venivano restituiti tutti i valori e grazie al tuo aiuto ho capito il perchè.
Se nel codice python non metto il delay si pianta. L'unico modo per sbloccare la situazione è premere CTRL z. Da quel momento il problema del reset non c'è più e come ho scritto sopra forse questo comportamento è dato dal fatto che la seriale rimane sempre aperta...boo

Quote
PROBLEMA DEL "BLOCCO":
se l'arduino si apetta di leggere 'c', perchè tu invii "c1"??
può avvenire per caso che un carattere venga perso, e poichè tu controlli solo il carattere ricevuto nell'index 0, se perdi il primo carattere (c), leggerai sempre '1' che appunto vuol dire fai nulla. Quindi quando premi CTRL+z che invia UN carattere (indipendentemente quale sia, il tuo skecth ritorna "allienato" con il carattere 'c'. Notare che che la trasmissione in realtà in rarissimi casi si può ridisallineare, in particolare che l'availble ti fa uscire dal ciclo mentre hai letto C ma non ancora 1, ma è rarissimo.

Per come ho scritto il codice dello sketch, il solo carattere "c" non basta per entrare nel case.
Per ovviare al problema aggiungo un secondo carattere. Ho messo 1 ma potrebbe essere qualsiasi altro carattere. Se non ho sbagliato qualcosa mi pare comunque che tutti i caratteri inviati alla seriale verso arduino in un modo o nell'altro vengono sempre letti e quindi non lascio la seriale "sporca".

Grazie ancora!!!
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 44
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Penso proprio che lesto ci ha preso, il problema è nella funzione leggi sensori, risolvi passandogli un argomendo "bool now"

Se now è vero non attende 5 secondi. Dal setup chiami leggiSensori(true) e così la prima lettura sensori avviene subito.

In C++, ci sono i parametri di funzione di default, questi li ottieni dichiarando la funzione così:

Code:
void myFunc(boolean now=false);

void myFunc(boolean now)
{
   // your code
}

Ciao.



Il tuo ragionamento mi è chiarissimo ma non ho capito la sintassi.
Per il setup è chiaro, richiamo la funzione impostando a true e questo la farà solo al primo giro.
Non ho capito invece come inserire il resto. Saresti così gentile da indicarmi dove mettere il resto direttamente sul mio codice postato?

Logged

0
Online Online
Shannon Member
****
Karma: 132
Posts: 10498
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Se nel codice python metto il delay il collegamento con la seriale funziona ma non mi venivano restituiti tutti i valori e grazie al tuo aiuto ho capito il perchè.
e fin qui tutto ok

Quote
Se nel codice python non metto il delay si pianta. L'unico modo per sbloccare la situazione è premere CTRL z. Da quel momento il problema del reset non c'è più e come ho scritto sopra forse questo comportamento è dato dal fatto che la seriale rimane sempre aperta...boo
no, avviene per il disallineamento., probabilmente il tempo impiegato all'arduino a resettarsi è esattamente quello usato dal pc per scriver UN carattere...quindi perdi la C iniziale, con tutto il ragionamento di prima.

Quote
Per come ho scritto il codice dello sketch, il solo carattere "c" non basta per entrare nel case.
no, per quello che vedo basta.. ma magari mi sfugge qualcosa. Non è che ti stai scontrando con il problema di prima?
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Pages: 1 [2] 3   Go Up
Jump to: