Ricerca delle porte COM disponibili (in VO) [Risolto]

Forum dedicato ai programmatori di X# in lingua italiana – Italian language forum

Moderator: wriedmann

Post Reply
User avatar
claudiocarletta
Posts: 101
Joined: Sat Sep 05, 2020 8:56 am

Ricerca delle porte COM disponibili (in VO) [Risolto]

Post by claudiocarletta »

Salve a tutti,
sto sviluppando una piccola applicazione in VO in cui ho la necessità di far comunicare il PC con un microcontrollore (tipo Arduino) tramite seriale. Ogni volta che collego il microcontrollore all'USB del PC quest'ultimo potrebbe assegnare all'USB una COM diversa (COM1, COM2, COM3, ...).
L'applicazione deve quindi cercare la porta corretta prima di iniziare le comunicazioni.
Se conosco la porta di comunicazione (COM3) tutto funziona correttamente, vedi esempio:

Code: Select all

    SELF:oSerial := SerialPort{"COM3", 9600, Parity.None, 8, StopBits.One}
    SELF:oSerial:Handshake := Handshake.None
    SELF:oSerial:ReadTimeout := 500
    SELF:oSerial:WriteTimeout := 500
    SELF:oSerial:Open()
    IF SELF:oSerial:IsOpen
        SELF:oSerial:WriteLine("Ciao mondo crudele")
        SELF:oDCFt:TextValue := SELF:oSerial:ReadLine()
        SELF:oSerial:Close()
    ELSE
        SELF:Owner:StatusBar:SetMessage("Nessuna porta Com utilizzata", MESSAGEMENU)
    ENDIF
Se invece voglio cercare la porta disponibile mi dà errore, vedi esempio:

Code: Select all

METHOD CercaCom( )
    LOCAL i  AS INT
    LOCAL Com AS STRING

    FOR i := 1 UPTO 20
        Com := "COM" + NTrim(i)
        SELF:oSerial := SerialPort{Com, 9600, Parity.None, 8, StopBits.One}
        SELF:oSerial:Handshake := Handshake.None
        SELF:oSerial:ReadTimeout := 500
        SELF:oSerial:WriteTimeout := 500
        SELF:oSerial:Open() 					// ERRORE se la COM non c'è
        IF oSerial:IsOpen
            SELF:Owner:StatusBar:SetMessage("Porta Com trovata: " + Com, MESSAGEPERMANENT)
            oSerial:WriteLine("Ciao mondo crudele\n")
            SELF:oDCFt:TextValue := oSerial:ReadLine()
            SELF:oSerial:Close()
            EXIT
        ENDIF
        Com := ""
    NEXT

    IF Com == ""
        SELF:Owner:StatusBar:SetMessage("Nessuna porta Com trovata: ", MESSAGEPERMANENT)
    ENDIF
RETURN NIL
Sarà semplice ma non riesco a trovare un modo per controllare la presenza delle porte COM prima di aprirle

Qualcuno può aiutarmi?
Grazie a tutti
Last edited by claudiocarletta on Thu Jan 04, 2024 7:47 pm, edited 1 time in total.
User avatar
wriedmann
Posts: 3754
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

Re: Ricerca delle porte COM disponibili (in VO)

Post by wriedmann »

Ciao Claudio,
l'unica possibilità che vedo è di mettere il tutto in tra begin e end sequence.
Così nel recover puoi verificare che qualcosa è andato storto e puoi reagire.
Leggere quali porte COM sono disponibili lo vedo abbastanza problematico con le possibilità che abbiamo in VO.
Wolfgang
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
User avatar
claudiocarletta
Posts: 101
Joined: Sat Sep 05, 2020 8:56 am

Re: Ricerca delle porte COM disponibili (in VO)

Post by claudiocarletta »

Grazie Wolfgang,
ho paura che non avendo mai utilizzato la struttura di controllo BEGIN SEQUENCE

Code: Select all

BEGIN SEQUENCE

 <Statements>...

[BREAK [<uValue>]]

 <Statements>... 

[RECOVER [USING <idVar>]]

 <Statements>...

END [SEQUENCE]

non saprei da dove cominciare.

Puoi aiutarmi mettendoci dentro il mio codice?

Ciao grazie
User avatar
wriedmann
Posts: 3754
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

Re: Ricerca delle porte COM disponibili (in VO)

Post by wriedmann »

Ciao Claudio,
basicamente potrebbe funzionare così:

Code: Select all

begin sequence
SELF:oSerial := SerialPort{"COM3", 9600, Parity.None, 8, StopBits.One}
SELF:oSerial:Handshake := Handshake.None
SELF:oSerial:ReadTimeout := 500
SELF:oSerial:WriteTimeout := 500
SELF:oSerial:Open()
IF SELF:oSerial:IsOpen
     SELF:oSerial:WriteLine("Ciao mondo crudele")
     SELF:oDCFt:TextValue := SELF:oSerial:ReadLine()
     SELF:oSerial:Close()
ELSE
     SELF:Owner:StatusBar:SetMessage("Nessuna porta Com utilizzata", MESSAGEMENU)
ENDIF
recover
self:Owner:StatusBar:SetMessage( "Errore aprendo la seriale")
end sequence
Se succede qualcosa, ti viene mostrato un messaggio di errore, ma il programma non termina.
We invece non vuoi il messaggio di errore standard, prova questo:

Code: Select all

local oOldErrBlock as CodeBlock
oOldErrorBlock := ErrorBlock( {|uPar| _Break( uPar ) } )
begin sequence
SELF:oSerial := SerialPort{"COM3", 9600, Parity.None, 8, StopBits.One}
SELF:oSerial:Handshake := Handshake.None
SELF:oSerial:ReadTimeout := 500
SELF:oSerial:WriteTimeout := 500
SELF:oSerial:Open()
IF SELF:oSerial:IsOpen
     SELF:oSerial:WriteLine("Ciao mondo crudele")
     SELF:oDCFt:TextValue := SELF:oSerial:ReadLine()
     SELF:oSerial:Close()
ELSE
     SELF:Owner:StatusBar:SetMessage("Nessuna porta Com utilizzata", MESSAGEMENU)
ENDIF
recover
self:Owner:StatusBar:SetMessage( "Errore aprendo la seriale")
end sequence
ErrorBlock( oOldErrorBlock )
Saluti
Wolfgang
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
User avatar
claudiocarletta
Posts: 101
Joined: Sat Sep 05, 2020 8:56 am

Re: Ricerca delle porte COM disponibili (in VO) [Risolto]

Post by claudiocarletta »

Ciao Wolfgang,
funziona perfettamente, ho messo un array di COM disponibili e poi scelgo se sono più di una

Grazie e ...
Buon Natale a tutti
Post Reply