VB2005: gestione della seriale

lunedì 04 dicembre 2006 - 11.58

EYSRG Profilo | Newbie

Ho fatto un'applicazione in VB2005 che DOVREBBE aprire la porta seriale e
iniziare a ricevere dati da una seriale, gestita tramite un controllo
SerialPort chiamato com0new. Però fallisce con un errore:
"UnauthorizedAccessException non è stata gestita. Accesso alla porta COM1
negato."
Questa è la funzione che genera quell'errore:

Function ReceiveSerialData() As String ' Receive strings from a serial port. Dim returnStr As String = "" Using com0new As IO.Ports.SerialPort = _ My.Computer.Ports.OpenSerialPort(frmMain.com0new.PortName) 'NON MI DA' L'AUTORIZZAZIONE Do Dim Incoming As String = com0new.ReadLine() If Incoming Is Nothing Then Exit Do Else returnStr &= Incoming & vbCrLf End If Loop com0new.Close() End Using Return returnStr End Function

Mi è stato detto che per farla funzionare devo impostare i permessi, ma non
mi è stato detto come fare per impostarli. Qualcuno che lo sa, può per
favore dirmi come si fa?
Ringrazio in anticipo.

filippo.monti Profilo | Junior Member

Forse dipende dai permessi che l'utente windows ha sul sitema. Io non ho mai avuto problemi ad aprire una connessione seriale e normalmente faccio così:

Dichiaro....
Private WithEvents m_seriale As Ports.SerialPort
Private m_portaCom As String ' Porta di comunicazione
Private m_parity As IO.Ports.Parity ' Bit parità
Private m_baudRate As Integer ' Velocità comunicazione (baud rate)
Private m_dataBits As Integer ' Data bits
Private m_stopBits As IO.Ports.StopBits ' Stop bits

' Apertura della porta seriale
Public Function apriSeriale() As Boolean
m_seriale = New IO.Ports.SerialPort
With m_seriale
.PortName = m_portaCom
.Parity = m_parity
.BaudRate = m_baudRate
.DataBits = m_dataBits
.StopBits = m_stopBits
Try
.Open()
Return True
Catch ex As Exception
MessageBox.Show(ex.Message, "apriSeriale")
Return False
End Try
End With
End Function

Dichiaro delle variabili per la seriale in quanto vengono letti/scritti su un file di configurazione.

Ciao

Filippo

EYSRG Profilo | Newbie

Ho fatto un po' di controlli e mi sono ricordato che, prima di attivare quella funzione, aprivo la seriale con frmMain.com0new.Open() e non mi dava errori. Ho fatto la prova stupida di togliere l'istruzione Using e sostituirla con un semplice frmMain.com0new.Open(). Come pensavo, mi ha detto che la porta era già aperta. Allora ho tolto anche quello e ho rilanciato il programma. Mi sono trovato con un nuovo problema, ossia che il programma si blocca quando arriva alla linea
Dim Incoming As String = frmMain.com0new.ReadLine()

Ho inserito un breakpoint all'inizio del ciclo per essere sicuro: premendo F8 posso vedere che si posiziona su quella linea, ma premendo F8 una seconda volta non viene più eseguita alcun'istruzione: semplicemente il programma resta bloccato.
Facendo la prova di commentare l'istruzione ReadLine (così la variabile Incoming non viene inizializzata) il programma non si blocca (cioè è QUELL'istruzione che blocca il programma). Allora devo usare qualcos'altro al posto del ReadLine?

filippo.monti Profilo | Junior Member

Non puoi semplicemente leggere i dati dalla seriale ma devi gestire l'evento "DataReceived" della seriale perchè in quel modo pianti il programma in attesa che arrivi un dato dalla seriale...
All'interno della gestione dell'evento DataReceived allora puoi richiamere i metodi Read o ReadLine

Ciao
Filippo

EYSRG Profilo | Newbie

Ora ho tolto la funzione ReceiveSerialData (in realtà l'ho commentata per poterla recuperare se dovesse servire) e ho iniziato a fare una funzione DataReceived, messa nel form in cui c'è il controllo com0new e basata su quella che c'è in questa pagina (che parla della porta seriale in VB2005): http://www.devx.com/dotnet/Article/31001/0/page/2 (ma con la parte Handles cambiata in Handles com0new.DataReceived)
Però questa funzione causa un errore strano:

Errore 6 Il metodo "Public Function Data_Received(sender As Object, e As System.IO.Ports.SerialDataReceivedEventArgs) As Object" non può gestire l'evento "Public Event DataReceived(sender As Object, e As System.IO.Ports.SerialDataReceivedEventArgs)" perché
non hanno la stessa firma.

Cosa sto sbagliando?

EDIT:
Mah... non capisco, ho tolto la funzione fatta prima e l'ho sostituita con quella che si trova a http://msdn2.microsoft.com/en-us/library/ms364066(vs.80).aspx, con i nomi a posto per la mia applicazione, e ora l'errore di firma diversa è scomparso... misteri di VB2005

filippo.monti Profilo | Junior Member

Io ho imparato una cosa con Microsoft in questi anni: non chiederti perché l'importante è che funzioni...
Ciao
Filippo
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5