Aiuto Arduino e Visual Studio

Ciao ragazzi :slight_smile: , vorrei chiedere il vostro aiuto riguardo ad un pezzo di codice che proprio non riesco a realizzare con visual studio. Diciamo che ho 5 porte COM ed arduino è collegato al COM3, come posso verificare con visual che arduino è collegato proprio a quella porta ? Mi dareste una grandissima mano se riuscite a risolvermi questo problema, in una settimana che provo non sono riuscito a combinare niente. Grazie mille in anticipo !!

Secondo me l'unica è inviare una stringa di interrogazione e vedere se e come risponde Arduino.

Naturalmente Arduino deve essere programmato per rispondere a questa interrogazione.

cyberhs:
Secondo me l'unica è inviare una stringa di interrogazione e vedere se e come risponde Arduino.

Naturalmente Arduino deve essere programmato per rispondere a questa interrogazione.

Eh lo so, ma è proprio questo il problema. Non riesco a realizzare il codice :frowning:

Io ho trovato due soluzioni: una sfrutta una stringa identificativa, l'altra il registry.

La prima soluzione funziona più o meno così: l'Arduino emette una particolare stringa una volta al secondo sulla seriale, e rimane in quello stato finché non riceve un comando di acknowledge dal PC. Il programma sul PC si mette in ascolto a turno su tutte le porte seriali (in VB.net puoi usare my.computer.ports o qualcosa del genere), ed attende la stringa. Se dopo un certo tempo (ad esempio 2 secondi) non arriva nulla o arriva qualcosa di diverso da quanto atteso, marca quella porta come non valida e passa alla successiva. Se invece riceve la stringa attesa, manda l'ack e inizia la comunicazione su quella porta.

L'altra soluzione va a leggere il registry di windows alla ricerca di prote seriali con un identificativo particolare... La chiave mi pare sia HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM, e le porte "generate" da Arduino contengono la stringa VCP. Ogni secondo vado a leggere l'elenco delle porte sotto quella chiave, e se mi accorgo che ne è comparsa una che contiene VCP nel nome, decido che quello è l'arduino.

Le due tecniche si possono ovviamente combinare: identifciazione di una nuova porta seriale che con ogni probabilità è associata ad un arduino + attesa della stringa identificativa proprio da quella porta.

tuxduino:
Io ho trovato due soluzioni: una sfrutta una stringa identificativa, l'altra il registry.

@Tuxduino grazie mille, mi hai dato delle ottime informazioni. Ora proverò a trovare una soluzione :smiley:

tuxduino:
e le porte "generate" da Arduino contengono la stringa VCP

Attenzione che non solo le porte 'generate' da arduino contengono la stringa VCP !!

niki77:

tuxduino:
e le porte "generate" da Arduino contengono la stringa VCP

Attenzione che non solo le porte 'generate' da arduino contengono la stringa VCP !!

Sì, credo che la stringa sia legata al tipo di chip "usb-to-serial" utilizzato. Probabilmente tra una Leonardo, una UNO e una 2009 ci sono differenze.
La soluzione è osservare con il registry editor l'elenco delle porte prima e dopo l'inserimento del cavo usb nella scheda.
Chiaro che se avessi un convertitore usb/seriale che usa lo stesso chip di Arduino ma non è un arduino, avrei problemi.
Ma lo stesso si può dire di un arduino con caricato un programma diverso da quello atteso. Ecco perché credo sia opportuno utilizzare la tecnica del registry solo per rilevare il collegamento della scheda e/o limitare il numero di porte da testare, mentre per una definitiva identificazione del dispositivo è meglio usare la tecnica della stringa univoca.

tuxduino:

niki77:

tuxduino:
e le porte "generate" da Arduino contengono la stringa VCP

Attenzione che non solo le porte 'generate' da arduino contengono la stringa VCP !!

Sì, credo che la stringa sia legata al tipo di chip "usb-to-serial" utilizzato. Probabilmente tra una Leonardo, una UNO e una 2009 ci sono differenze.
La soluzione è osservare con il registry editor l'elenco delle porte prima e dopo l'inserimento del cavo usb nella scheda.
Chiaro che se avessi un convertitore usb/seriale che usa lo stesso chip di Arduino ma non è un arduino, avrei problemi.
Ma lo stesso si può dire di un arduino con caricato un programma diverso da quello atteso. Ecco perché credo sia opportuno utilizzare la tecnica del registry solo per rilevare il collegamento della scheda e/o limitare il numero di porte da testare, mentre per una definitiva identificazione del dispositivo è meglio usare la tecnica della stringa univoca.

Quindi mi consigli un mix tra le due tecniche. Ma se non oso troppo vorrei chiederti se conosci qualche esempio che mi indichi almeno la via per inizare il codice (quello per visual o per arduino è indifferente, solo per avere uno spunto), perchè il programma che sto realizzando è funzionante ma vorrei solo aggiungere questo controllo sulle porte che sarebbe davvero molto utile.

Il codice specifico che ho scritto è da qualche parte in un vecchio progetto, che tra l'altro non posso divulgare perché non è opensource.

Comunque per quanto riguarda Arduino, metti un timer (es. SimpleTimer o similari) che emetta una determinata stringa ogni secondo o mezzo secondo.
Poi codifichi la ricezione seriale in modo che quando viene letta la stringa di ack dal PC il timer viene disabilitato e il programma continua.

Sul lato VB.net devi mettere in campo diverse componenti: lettura di una chiave del registry, ricezione seriale, timer. In questo momento non ho tempo di scrivere oltre... fai qualche prova poi posta codice e domande :slight_smile:

MI sembra che hai dimenticato di indicare in quale linguaggio .NET vorresti l'esempio.

Comunque penso che di esempi sulla programmazione Seriale con NET su internet ne troverai a milioni.
Arduino comunica su COMxx seriale (USB o RS232 che sia) con i comandi per un monitoriaggio usando la libreria Serial
Anche NET framework dispone di una libreria per comunicazione su seriale.
Esempio: http://community.visual-basic.it/dadebertolino/archive/2012/01/18/Porte-Seriali-e-VB-NET.aspx

tuxduino:
Il codice specifico che ho scritto è da qualche parte in un vecchio progetto, che tra l'altro non posso divulgare perché non è opensource.

Comunque per quanto riguarda Arduino, metti un timer (es. SimpleTimer o similari) che emetta una determinata stringa ogni secondo o mezzo secondo.
Poi codifichi la ricezione seriale in modo che quando viene letta la stringa di ack dal PC il timer viene disabilitato e il programma continua.

Sul lato VB.net devi mettere in campo diverse componenti: lettura di una chiave del registry, ricezione seriale, timer. In questo momento non ho tempo di scrivere oltre... fai qualche prova poi posta codice e domande :slight_smile:

Appena posso proverò come dici.
Comunque ho caricato le immagini di quello che ho provato a fare e ora ti spiego nel dettaglio:

  • Come puoi vedere nel codice di arduino quello che ho fatto è dirgli che se riceve il carattere R arduino scrive nel seriale 82
  • Poi nel codice di visual ho definito come SerialPort1.PortName il nome della porta che scelgo, invio il carattere R al seriale, arduino mi restituisce il valore 82 e visualizzo la scritta "connected to arduino".
    E tutto funziona corretamente solo se al momento della scelta della COM scelgo quella a cui è collegato arduino. Nel caso scelgo una porta diversa il programma va in crash, e non riesco prorpio a capire il perchè !!!

Cattura3.JPG

Cattura2.JPG

Beh, ma l'apertura della porta DEVE essere controllata.
E' come se aprissi in lettura un file che non esiste.
La open deve essere messa in un Try...Catch

:wink: