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
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
Qualcuno può aiutarmi?
Grazie a tutti