Rilevare porta seriale

Ho provato adesso, con la mia UNO R1. Se scollego la USB e alimento la scheda solo tramite jack, il led si spenge e non si riaccende dopo 2 secondi.

  1. che versione dell'IDE usi?
  2. che versione di Arduino UNO hai?

staffani:
Niente da fare :frowning:

Per forza, non esiste nessun modo su Arduino, ad esclusione della Leonardo, per sapere se è fisicamente collegato ad una seriale, è una questione hardware e non software, puoi solo verificare se il buffer della seriale contiene dei caratteri e di conseguenza dedurne che c'è una connessione seriale attiva.
Fare una if (serial) serve solo per sapere se c'è la seriale, non se è collegata, solo sulla Leonardo if(serial) dice se è aperta o meno la seriale USB, ma in questo caso c'è il modo per saperlo visto che è legato all'enumerazione USB.

astrobeed:

staffani:
Niente da fare :frowning:

Per forza, non esiste nessun modo su Arduino, ad esclusione della Leonardo....
if(Serial) - Arduino Reference

Allora perchè viene riportata anche la sintassi relativa alla MEGA?
Non ha senso, dato che non funziona.

Per leo72:
1.0.1
UNO R2 (quella con chip 8U2 al posto dell'FTDI)

astrobeed:

staffani:
Niente da fare :frowning:

Per forza, non esiste nessun modo su Arduino, ad esclusione della Leonardo, per sapere se è fisicamente collegato ad una seriale, è una questione hardware e non software, puoi solo verificare se il buffer della seriale contiene dei caratteri e di conseguenza dedurne che c'è una connessione seriale attiva.
Fare una if (serial) serve solo per sapere se c'è la seriale, non se è collegata, solo sulla Leonardo if(serial) dice se è aperta o meno la seriale USB, ma in questo caso c'è il modo per saperlo visto che è legato all'enumerazione USB.

if(Serial) - Arduino Reference

scusa ma a leo72 funziona con la UNO, com'è possibile?

Non voglio fare il pedante, però almeno leggetela la reference.

Description
Indicates if the specified Serial port is ready.
On the Leonardo, if (Serial) indicates wether or not the USB CDC serial connection is open. For all other instances, including if (Serial1) on the Leonardo, this will always returns true.
This was introduced in Arduino 1.0.1.

Returns
boolean : returns true if the specified serial port is available. This will only return false if querying the Leonardo's USB CDC serial connection before it is ready.

Da notare che la variabile Serial è stata introdotta specificamente per la Leonardo, il suo uso primario è sapere se c'è una connessione USB CDC attiva.

Definizione di "Serial" nel core.

Serial_::operator bool() {
	bool result = false;
	if (_usbLineInfo.lineState > 0) 
		result = true;
	delay(10);
	return result;
}

Serial_ Serial;

Astro, tu hai ragione ed anch'io mi baso sul reference. Però il reference dice proprio che if(Serial) restituisce se la seriale è "pronta" (ready). Ma staccando il connettore USB, il led si spenge, quindi io interpreto come seriale non pronta. Che generalizzando si può anche pensare come un "connessione seriale assente". Se l'interfaccia seriale non trova la linea, darà una risposta di non pronto. O c'è qualcosa di più profondo che non ho capito?

leo72:
Astro, tu hai ragione ed anch'io mi baso sul reference. Però il reference dice proprio che if(Serial) restituisce se la seriale è "pronta" (ready).

Ready è inteso nel senso di UART inizializzata, e per estensione presente, del resto mi dovresti spiegare come fa l'UART del ATMEGA328 a capire se è collegata a o meno ad un device esterno, ovvero quale registro mi darebbe questa informazione ?

Sei nel giusto.
Però allora cos'è che fa lo sketch che ho scritto? Perché agganciando il cavo USB si accende il led? Forse che l'8U2 spedisce qualche segnale di acknowlegde al 328 e la sua USART, rispondendo "presente", si attiva e if(Serial) dice che essa è "pronta"?

Leo,
nella tua scheda UNO hai già l'8U2 come convertitore usb/seriale o ancora l'FTDI?

L'FTDI c'è solo fino alla 2009, su tutte le UNO c'è il nuovo chippino Atmega8U2/16U2 (a seconda delle versioni).

leo72:
Però allora cos'è che fa lo sketch che ho scritto?

Non so perché da te il tuo sketch apparentemente funziona, però l'ho appena provato su una UNO R1, su una UNO R3, su una MEGA2560 R1, su una Luigino 328 (con FTDI) ottenendo sempre lo stesso risultato, alimentando solo da batteria il led rimane sempre acceso, collegando/scollegando il cavo USB il led rimane sempre acceso.
Ribadisco il concetto, l'ATMEGA328 non ha alcun modo per accorgersi se c'è o meno collegato un device all'UART, non esiste nessun registro che fornisce questa informazione e senza usare i bit aggiuntivi per l'handshake hardware, quelli usati dalla RS232, è impossibile ottenere tale informazione.
Solo sulla Leonardo è possibile sapere se è realmente collegata ad un pc la seriale, esclusivamente tramite USB, per via di come funziona la USB e perché è integrata nel micro stesso.

astrobeed:
Non so perché da te il tuo sketch apparentemente funziona, però l'ho appena provato su una UNO R1,

Dipenderà dal sistema operativo?
Il mio sketch sulla Leonardo non funziona, nel senso che il led è sempre spento. Però ho notato una cosa con questa scheda: nel momento in cui connetto il cavettino USB, il led RX fa 1 lampeggio. Forse c'è uno scambio di dati che l'8U2 rileva ed usa per aprire la seriale verso il 328?

leo72:
Dipenderà dal sistema operativo?

Leo non so più come dirtelo, la questione è puramente hardware non ha niente a che vedere con il S.O., l'ATMEGA328, ma anche l'ATMEGA2560, non hanno nessun modo per rilevare la connessione di un dispositivo sulla seriale se non c'è un traffico dati, la if(serial) è stata introdotta specificatamente per la Leonardo perché ti permette di sapere se sei connesso tramite USB al pc, in tutti gli altri casi torna sempre true.

Però ho notato una cosa con questa scheda: nel momento in cui connetto il cavettino USB, il led RX fa 1 lampeggio. Forse c'è uno scambio di dati che l'8U2 rileva ed usa per aprire la seriale verso il 328?

Se stiamo parlando della Leonardo, che non ho, sopra non c'è l'ATMEGA328, c'è l'ATMEGA32u4 che ha la USB onboard,

Sul reference c'è scritto:

On the Leonardo, if (Serial) indicates wether or not the USB CDC serial connection is open. For all other instances, including if (Serial1) on the Leonardo, this will always returns true.

Traduco per quelli che hanno problemi con l'inglese:

Sulla Leonardo if(serial) indica se una connessione seriale USB CDC è aperta o no.
Per tutti gli altri casi, incluso if(serial1) sulla Leonardo, viene restituito sempre true.

Ritengo che questo chiude definitivamente il discorso :slight_smile:
Tra parentesi sul reference c'è pure errore ortografico, wether (montone) al posto di whether (se) :smiley:

astrobeed:
Leo non so più come dirtelo, la questione è puramente hardware non ha niente a che vedere con il S.O., l'ATMEGA328, ma anche l'ATMEGA2560, non hanno nessun modo per rilevare la connessione di un dispositivo sulla seriale se non c'è un traffico dati, la if(serial) è stata introdotta specificatamente per la Leonardo perché ti permette di sapere se sei connesso tramite USB al pc, in tutti gli altri casi torna sempre true.

Astro, lo capisco benissimo. Solo che avevo un comportamento differente dal vostro.... dico "avevo" perché ho capito il motivo per cui sembrava che lo sketch funzionasse! :sweat_smile:
Ho usato un alimentatore.... guasto.... ]:smiley:
Quando ho usato quell'alimentatore non ho fatto caso al fatto che anche il led ON fosse spento :sweat_smile: :sweat_smile:
Sorry.... il fatto è che avevo sull'Arduino uno shield che mi copriva la visuale quindi guardavo solo il led "LED"...
Quindi il led si accendeva e spengeva quando collegavo l'USB perché.... l'Arduino riceveva alimentazione :sweat_smile:
Stamani provando con la Leonardo, senza shield, al 2° o 3° tentativo (dopo che avevo pubblicato il mio precedente post) ho notato che scollegando il cavettino USB il len ON si spengeva.... figurimm.......

Se stiamo parlando della Leonardo, che non ho, sopra non c'è l'ATMEGA328, c'è l'ATMEGA32u4 che ha la USB onboard,

Svista mia.

leo72:
Ho usato un alimentatore.... guasto.... ]:smiley:

Murphy non perdona :grin:
L'importante è avere capito perché a te apparentemente funzionava, mistero risolto possiamo archiviare il topic.

Astrobed ti faccio i miei complimenti perché non solo sei un luminare in elettronica, ma hai anche una cultura decisamente al di sopra della media!

Non è facile trovare persone del tuo stampo.

cyberhs:
Astrobed ti faccio i miei complimenti perché non solo sei un luminare in elettronica, ma hai anche una cultura decisamente al di sopra della media!

Non è facile trovare persone del tuo stampo.

Fa parte della Santissima Trinità©: Astrobeed, Michele e Uwe (in ordine alfabetico). Senza di loro.... perderemmo un bel po' di sapere :wink:

PS:
cyberhs, anche tu comunque vedo che sei molto preparato, sei un altro buon acquisto per il forum :wink:

leo72:
Ho usato un alimentatore.... guasto.... ]:smiley:
Svista mia.

Succede , e serve da lezione, sicuramente un altra volta non ti capiterà più la stessa svista.