xsharp.eu • Ricerca delle porte COM disponibili (in VO) [Risolto]
Page 1 of 1

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

Posted: Wed Dec 20, 2023 8:20 am
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

Re: Ricerca delle porte COM disponibili (in VO)

Posted: Wed Dec 20, 2023 8:45 am
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

Re: Ricerca delle porte COM disponibili (in VO)

Posted: Wed Dec 20, 2023 9:51 am
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

Re: Ricerca delle porte COM disponibili (in VO)

Posted: Wed Dec 20, 2023 9:59 am
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

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

Posted: Wed Dec 20, 2023 11:07 am
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