PDA

Visualizza la versione completa : [VB.NET] Porta Seriale e Problemi IO.IOException: Periodo di timeout scaduto


heroes3
01-08-2008, 10:51
Salve a tutti
ho un problema che mi affligge e mi sfianca da parecchio tempo.
Premetto che non sono un buon programmatore ma per necessitÓ ho dovuto realizzare un software per la lettura di dati tramite seriale virtualizzata.
La macchina in questione Ŕ una bilancia industriale, Ŕ passiva quindi bisogna interrogarla ogni volta per avere il dato/peso.

l'ho strutturato come segue:

ho impostato un timer che ogni 2 secondi interroga la pesa per recuperare il peso, questa Ŕ la SUB



Private Sub TimerPesa1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TimerPesa1.Tick
Dim Request_Pesata1 As String
If Port1.IsOpen = False Then Port1.Open()
Request_Pesata1 = "?#0119" & vbCrLf
Port1.Write(Request_Pesata1)
End Sub


Poi ho creato un altra sub che riceve il dato e lo elabora:


Private Sub port_DataReceived1(ByVal sender As Object, ByVal e As _
System.IO.Ports.SerialDataReceivedEventArgs) Handles Port1.DataReceived
Dim SerialData1 As String
Control.CheckForIllegalCrossThreadCalls = False
If Port1.BytesToRead > 0 Then
SerialData1 = ""
Do
SerialData1 = SerialData1 & Chr(Port1.ReadByte)
If Port1.BytesToRead = 0 Then
Exit Do
End If
Loop
Port1.Close()
....
....
...
In questa parte che non posto continuo, elaborando il dato e salvandolo in un file di log e nel database.


Ora sembrerebbe funzionare tutto correttamente ma ad un certo punto non meglio specificato mi si presenta un errore

System.IO.IOException: Periodo di timeout del semaforo scaduto.

at System.IO.Ports.InternalResources.WinIOError(Int32 errorCode, String str)
at System.IO.Ports.SerialStream..ctor(String portName, Int32 baudRate, Parity parity, Int32 dataBits, StopBits stopBits, Int32 readTimeout, Int32 writeTimeout, Handshake handshake, Boolean dtrEnable, Boolean rtsEnable, Boolean discardNull, Byte parityReplace)
at System.IO.Ports.SerialPort.Open()
at Main.TimerPesa2_Tick(Object sender, EventArgs e)
at System.Windows.Forms.Timer.OnTick(EventArgs e)
at System.Windows.Forms.Timer.TimerNativeWindow.WndPr oc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

Questo errore si verifica da quando ho inserito una seconda pesa su una seconda seriale sempre virtualizzata.

come faccio a fare catch dell'errore e gestiro facendo andare avanti il tutto?

Grazie

heroes3
01-08-2008, 11:07
aggiungo una informazione non banale
Questo Ŕ il software per la virtualizzazione della com

http://www.icpdas.com/products/Software/VxComm/vxcomm.htm

e mi sono accorto di usare una vecchia release 1.x
mentre l'ultima Ŕ la 2.x

quante probabilitÓ ho che il problema sia legato al driver di virtualizzazione?

visto che l'errore sopra indicato non si presenta tutti i giorni?


:ciauz:

heroes3
04-08-2008, 12:48
uppettino :dh˛:

heroes3
06-08-2008, 14:43
riuppettino

nessuno riesce a darmi una mano?

:ciauz:

U235
06-08-2008, 15:35
purtroppo non ho molta esperienza a riguardo, pero' ci provo...
hai come campo Port1 (credo, con vb.net non ho molta confidenza) che usi nella sub, ma su quale porta Ŕ impostato? voglio dire, quando accedi alla porta controlli che sia quella giusta? (tipo com1 o 2 ecc.) oppure ogni volta la reimposti prima di chiamare la sub? e se Ŕ cosi' (la reimposti) non Ŕ che il timer delle due si accavallano in alcuni momenti?

heroes3
06-08-2008, 17:04
Originariamente inviato da U235
purtroppo non ho molta esperienza a riguardo, pero' ci provo...
hai come campo Port1 (credo, con vb.net non ho molta confidenza) che usi nella sub, ma su quale porta Ŕ impostato? voglio dire, quando accedi alla porta controlli che sia quella giusta? (tipo com1 o 2 ecc.) oppure ogni volta la reimposti prima di chiamare la sub? e se Ŕ cosi' (la reimposti) non Ŕ che il timer delle due si accavallano in alcuni momenti?

intanto grazie per averci provato...
aggiusto il tiro e spiego meglio

allora le porte vengono inizializzate all'avvio del programma

port1 corrisponde a com11
port2 corrisponde a com12
etc,etc

ogni porta ha un suo timer distinto e separato timer1,timer2, etc,etc questo perchŔ vengono avviati dopo una procedura di setup della linea di produzione e c'Ŕ la possibilitÓ di stopparli per poi avviarli.

U235
06-08-2008, 17:20
usi dei thread sincronizzati? magari il componente che usi Ŕ progettato per l'accesso a una singola porta e non riesce a gestire l'eventuale altra porta se chiamata in contemporanea :bh˛:

o magari qualcosa che crea conflitto in una porta.

ad esempio una cosa del genere mi era capitata con il bluetooth che quando girava col mio programma era sulla com1 ma se facevo partire il software del pennino dopo il mio mi impostava a com2 (il pennino) e il mio programma la continuava a cercare su com1 (chiaramente era un problema che dovevo risolvere a livello di codice che era scritto male)

heroes3
06-08-2008, 17:39
Originariamente inviato da U235
usi dei thread sincronizzati? magari il componente che usi Ŕ progettato per l'accesso a una singola porta e non riesce a gestire l'eventuale altra porta se chiamata in contemporanea :bh˛:

o magari qualcosa che crea conflitto in una porta.

ad esempio una cosa del genere mi era capitata con il bluetooth che quando girava col mio programma era sulla com1 ma se facevo partire il software del pennino dopo il mio mi impostava a com2 (il pennino) e il mio programma la continuava a cercare su com1 (chiaramente era un problema che dovevo risolvere a livello di codice che era scritto male)

prover˛ a vedere per il momento ho trovato giusto un upgrade firmware del convertitore seriale ethernet e un upgrade del software di virtualizzazione delle porte com
provo su questa strada x il momento anche perchŔ l'errore Ŕ troppo randomico e non meglio identificato tipo ogni un giorno si 3 no poi 4 no poi 2 di fila si insomma un macello e non ho manco l'ambiente di test adeguato visto he lavoro direttamente in produzione con i casini che ne conseguono (produzione ferma etc,etc)

se hai altre dritte fanno sempre comodo

:ciauz:

Loading