Rilevare il collegamento con la porta seriale

Buongiorno a tutti, domanda semplice dovrei rilevare se Arduino è collegato ad una porta seriale, esiste un comando che possa rilevarlo (io non sono riuscito a trovarlo)?

Grazie
Enrico

Dipende dal Arduino che usi ... se parliamo di Arduino UNO, NO, non è previsto dal firmware dell'interfaccia seriale il fornire tale indicazione. Sulla Leonardo, e su altre schede che hanno la USB nativa, esiste la forma "if (Serial) { .... }" per verificare se la seriale è veramente collegata o meno.

Guglielmo

Userei una nano; in pratica alcune azioni si dovrebbero svolgere solo se la scheda è collegata ad un computer.

Scusa la domanda cosa è una USB nativa?

Saluti
Enrico

La nano è basata su ATmega328P che NON ha una USB nativa (si usa la seriale e la si collega ad un convertitore seriale<-->USB), se invece guardi il datasheet del ATmega32U4 (quello che sta sulla Leonardo o sulla Micro) vedrai che ha dei pin dicati alla porta USB ovvero è prevista già all'interno della MCU (da qui il termine USB nativa).

Guglielmo

Grazie per la spiegazione.

Dovrò inventarmi qualcosa per aggirare l'intoppo: in pratica vorrei che se il progetto, se collegato, mi aggiorni un RTC in modo automatico.

Saluti

La cosa più semplice è da un lato l'invio periodico di un carattere, dall'altro il rilevare tale carattere ...
... se chi va collegato ad Arduino può comunque inviare periodicamente un carattere, da codice Arduino tu poi puoi ciclicamente vedere se c'è un carattere sulla seriale ed allora agire di conseguenza.

Guglielmo

Ancora grazie, probabilmente seguirò il consiglio .... inutile complicare cose che possono essere semplici..

Enrico

Due domande:

Aprire la seriale non provoca il reset di arduino?

Serve di disattivare questa cosa dissaldando e saldando qualcosa, ora non ricordo

Ma se prendo in mano il saldatore allora collego anche DTR con un ingresso e lo so se la seriale è attiva....

... certo, però devi manomettere la board ed usare il segnale che: su Arduno UNO esce dal pin 13 (PD7) del ATmega16U2, su Arduino Nano esce dal pin 2 del FT232RL, e che è il segnale che va a generare il reset quando di apre la seriale.

Ma non credo che enrico24 voglia mettersi a tagliuzzare piste ed a fare saldature sui piedini di chip SMD o comunque su piazzole di dimensioni microscopiche, quando ... risolve banalmente via software :wink:

Guglielmo

Ma rimane la domanda 1

Quando apre la comunicazione seriale arduino si resetta....

I la mano non ha il circuito di reset?

Standardoil:
Quando apre la comunicazione seriale arduino si resetta....

... a beh, si, questo è vero, ma magari lui vuole distinguere se è un "reset" dato dall'apertura della seriale, o un "reset" dato dalla pressione del tasto di "reset" o dal BOD :smiley: :smiley: :smiley:

Per questa cosa ce le deve chiarire lui le idee ...

Guglielmo

A maggior chiarimento di quanto chiesto cerco di descrivere meglio i miei intendimenti:

  • trattasi di un orologio basato sullo RTC 1302. Mi sono accorto che, rispetto all'orologio interno del PC ed a quello basato su 3231, ritarda giornalmente di alcuni secondi.
  • devo quindi agire sul programma per "allineare" i tempi, ricaricare, ri-bloccare la scrittura sullo RTC e ri-salvare; questo per evitare che con i reset dovuti al cambio batterie/aggiornamento programma o altro l'orologio si "sfasi".

Volevo quindi cercare di ottenere un aggiornamento "automatico" (se possibile) all'orologio interno del PC con un "if", ma solo se il Nano risultasse collegato ad un PC.

Saluti
Enrico

Intanto parliamo quindi della USB, non della "vera" seriale, esatto? PErché i discorsi sono molto diversi.

Ma non fai quindi prima a leggere se arriva qualcosa dalla seriale, ed in caso affermativo leggere da lì l'ora (e quindi salvarla nell'RTC), senza cambiare nulla, tantomeno ri-salvare il programma? Sul PC ti basta fare un programmino che quando lo lanci manda sulla seriale l'ora con un piccolo protocollino semplice-semplice, tipo:

PC: manda sulla seriale un byte convenzionale di "START" (es. 0x00) ogni secondo
Arduino: vede il carattere "START" e risponde con un carattere ACK (ex.0x01)
PC: quando riceve l'ACK manda sotto forma di stringa l'orario, terminata con '\n', e smette di mandare START.
Arduino: legge l'ora facendo il parse della stringa ed aggiorna l'RTC.

docdoc:
Ma non fai quindi prima a leggere se arriva qualcosa dalla seriale ...

... ovvero quanto già detto al post #5 :grin: :grin: :grin:

Guglielmo

gpb01:
... ovvero quanto già detto al post #5

Certo, infatti confermavo la cosa, ma gli ho anche abbozzato il "protocollino" di sincronizzazione dell'ora.. :grin:

Buongiorno a tutti,

Intanto parliamo quindi della USB, non della "vera" seriale, esatto?

Vero.

Sul PC ti basta fare un programmino che quando lo lanci manda sulla seriale l'ora con un piccolo protocollino semplice-semplice

Questo significa sopravvalutare le mie competenze! OK potrei fare un programma .bat in DOS, ma poi come "entrerei" nella seriale? etc.,etc. Ricordate che sono un chimico!

Inoltre ciò non è quello che pensavo di ottenere, e cioè:

  • "spina" (USB) dentro --> è un PC --> aggiorna!

A questa stregua mi sembra più alla mia portata:

  • apri un qualsiasi programma in C++ --> collegati con la seriale --> premi un tasto --> aggiorna!

Grazie comunque per i suggerimenti che, anche se non applicati, sono sempre interessanti e mi permettono di "crescere" nella comprensione di questo veramente interessante "mondo" di Arduino!

Enrico

enrico24:
A questa stregua mi sembra più alla mia portata:

  • apri un qualsiasi programma in C++ --> collegati con la seriale --> premi un tasto --> aggiorna!

Che intendi con "un qualsiasi programma in C++"? Non può essere un "qualsiasi" programma, perché per dialogare con Arduino deve "sapere" come dialogarci, il che a sua volta dipende da come scrivi lo sketch su Arduino, e non essendoci alcuno "standard" devi necessariamente scrivere "qualcosa" sul PC (oltre che su Arduino), che sia in C++, Visual Basic, C#, Java, Python non importa. Tu scrivilo con il linguaggio che preferisci, ti basta che tu possa aprire una porta seriale e leggere e scriverci caratteri/byte.

Buongiorno,

Che intendi con "un qualsiasi programma in C++"?

Chiedo venia per non aver specificato meglio:
Apro Arduino (anche uno sketch vuoto)--> seleziono la porta seriale (magari anche il tipo di Arduino collegato ma NON carico niente)--> premo un tasto ---> .....

Attenzione: non ho ancora provato, per cui effettivamente non so se possa funzionare; è ancora una modifica "in pectore"!!!

Saluti
Enrico

A parte che non si è ancora affrontato il problema 1

Ovvero come evitare che la seriale resetti Arduino

A parte che la soluzione del problema 1 permette anche di risolvere il problema di riconoscere la seriale attiva, come ho scritto nel mio primo intervento

Ma rimane che il vero problema è far sì che il pc trasmetta l'ora; perché poi farla ricevere e interpretare da Arduino è banale

Quindi la Domanda (quella sulla vita l'universo e tutto quanto) diventa:

Ma lo OP sa far fare questa cosa al suo PC?

Ma lo OP sa far fare questa cosa al suo PC?

Certo! Nella mia (beata) ignoranza .. ASSOLUTAMENTE NO! ; ma pensavo di aggirare il problema con un'istruzione del tipo:

DateTime(DATE, TIME)
Da mettere sotto in if.... che la attivi se riceve qualcosa dalla seriale. Se non dovesse/potesse funzionare dovrò studiare il DOS o che altro mi permetta di farlo!

come evitare che la seriale resetti Arduino

Non vedo il problema già adesso l'orologio è funzionante (ovviamente senza aggiunta della parte del programma di correzione "automatica" dell'orario) e non ho notato "problemi" se resetto lo stesso.

Saluti
Enrico