|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Oct 2008
Messaggi: 365
|
[VB.NET] Comunicazioni seriali
Ho un problema con la mia solita e noiosissima
![]() Ma veniamo al dunque, devo connettere il 5° strumento che è diverso dagli altri: richiede l'invio di un byte (HEX05) per iniziare la trasmissione. Ho scaricato questo esempio e il codice funziona: http://www.dreamincode.net/forums/showtopic37361.htm Il codice da me redatto invece non funziona (ometto la sub che inizializza la serialPort): Sub che gestisce la pressione del bottone "Send" Codice:
Private Sub ButtonSend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonSend.Click Try SerialPort.Open() RadioButton1.Checked = True Dim msg(0) As Byte msg(0) = 5 SerialPort.Write(msg, 0, 1) Catch ex As Exception MsgBox("Errore!", MsgBoxStyle.Information) If SerialPort.IsOpen Then RadioButton1.Checked = True Else RadioButton1.Checked = False End If End Try End Sub Codice:
Private Sub SerialPort_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort.DataReceived Dim stringaRicevuta As String = SerialPort.ReadLine() InTextBox.text = stringaRicevuta End Sub Ora, il programma il cui sorgente ho scaricato da internet fa seguire all'invio di Hex05 la ricezione di 8 bit dallo strumento e li visualizza in formato esadecimale. Il mio invece invia ma non riceve, qualcuno sa spiegarmi dove sbaglio (perchè SICURAMENTE sbaglio!)?
__________________
Firma in sciopero! |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Oct 2008
Messaggi: 365
|
Aggiornamento:
Ho modificato il codice della prima routine come segue: Codice:
If Not SerialPort1.IsOpen Then SerialPort1.Open() RadioButton1.Checked = True ButtonSend.Enabled = True End If Codice:
Dim segnale As String = "05" SerialPort1.Write(Chr(segnale)) Codice:
If SerialPort1.IsOpen Then SerialPort1.Close() RadioButton1.Checked = False ButtonSend.Enabled = False End If Codice:
InTextBox.Text = SerialPort1.ReadLine() Ho provato a lanciare il programma, aprire la porta ed inviare il segnale allo strumento (non succede nulla) e poi chiudere il programma: il debugger mi ha dato un'eccezione del tipo IOException con questo stacktrace: Codice:
" in System.IO.Ports.InternalResources.WinIOError(Int32 errorCode, String str) in System.IO.Ports.SerialStream.EndRead(IAsyncResult asyncResult) in System.IO.Ports.SerialStream.Read(Byte[] array, Int32 offset, Int32 count, Int32 timeout) in System.IO.Ports.SerialStream.Read(Byte[] array, Int32 offset, Int32 count) in System.IO.Ports.SerialPort.InternalRead(Char[] buffer, Int32 offset, Int32 count, Int32 timeout, Boolean countMultiByteCharsAsOne) in System.IO.Ports.SerialPort.ReadTo(String value) in System.IO.Ports.SerialPort.ReadLine() in WindowsApplication1.Form1.SerialPort1_DataReceived(Object sender, SerialDataReceivedEventArgs e) in C:\Documents and Settings\luca\Documenti\Visual Studio 2008\Projects\Analizzatore porte seriali\Analizzatore porte seriali\Form1.vb:riga 35 in System.IO.Ports.SerialPort.CatchReceivedEvents(Object src, SerialDataReceivedEventArgs e) in System.IO.Ports.SerialStream.EventLoopRunner.CallReceiveEvents(Object state) in System.Threading._ThreadPoolWaitCallback.WaitCallback_Context(Object state) in System.Threading.ExecutionContext.runTryCode(Object userData) in System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData) in System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state) in System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) in System.Threading._ThreadPoolWaitCallback.PerformWaitCallbackInternal(_ThreadPoolWaitCallback tpWaitCallBack) in System.Threading._ThreadPoolWaitCallback.PerformWaitCallback(Object state)" Il motivo può essere che la comunicazione avviene praticamente in contemporanea?
__________________
Firma in sciopero! |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
E' un po' difficile aiutarti su questo. Se avessi qui io lo stesso dispositivo che usi potrei fare prove. L'unico suggerimento che mi sento di darti adesso è di provare con un polling, ossia un Timer che ripete ogni tot ( tipo 200 msec. o giù di lì ) ad eseguire la trasmissione/ricezione : quando ce la fa, esce dal ciclo del Timer, quindi va usato Try Catch.
A quel punto dovrebbe essere abbastanza chiaro se è solo un fatto di "tempi" oppure è proprio una tecnica non applicabile... oppure il dispositivo è malfunzionante... |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Oct 2008
Messaggi: 365
|
Mah, il fatto che l'altro codice funzioni bene mi fa pensare che il problema sia a livello del mio programma: la difficoltà è che il programmatore utilizza dei costrutti che non conosco (e che secondo me derivano da vecchie versioni di VB.NET), ad esempio cos'è PCComm?
__________________
Firma in sciopero! |
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
Ma lo puoi sapere subito facendo un "vai a definizione" o anche semplicemente sostando con il mouse sul nome della classe. Sono le basi dell'intellisense... Comunque se stai facendo un classico copia/incolla/riadatta da codice scritto da altri, questi problemi sono tipici. Difficile aiutarti a distanza su questo. Se il codice originale era un VB.NET ( 2001 ) potrebbero esserci differenze notevoli, e anche importandolo in VB 2008 con il wizard possono verificarsi non pochi errori di conversione. |
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Oct 2008
Messaggi: 365
|
Pur non capendo bene ho l'impressione che in questo link ci sia una possibile soluzione al mio problema, solo che proprio non capisco di cosa stiano parlando, soprattutto quando parlano di GUI Thread e ThreadPool Thread. Inoltre è anche C# quindi...
Qualcuno saprebbe spiegarmi di cosa si parla ed eventualmente darmi un suggerimento?
__________________
Firma in sciopero! |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Oct 2008
Messaggi: 365
|
Bingo!!!!
La chiave è qui: Codice:
Me.Invoke(New EventHandler(AddressOf RoutineLeggi))
__________________
Firma in sciopero! |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Oct 2008
Messaggi: 365
|
Riesumo il topic...
Da un paio di mesi oramai lavoro giornalmente con il mio programma ed ogni santo giorno mi chiedo come abbia fatto senza per circa 10 anni. Ora vorrei riprendere in mano il codice per migliorarlo, visto che soprattutto sulla bilancia ho ancora alcuni problemi (mi spiego se la terminologia utilizzata non è quella corretta): lo strumento emette un segnale di 8 byte: 0: segno (+ o -) 1-4: cifre prima della virgola 5: virgola 6-7: cifre dopo la virgola Il segnale viene emesso in continuo con frequenza pari alla frequenza di aggiornamento del display della bilancia. Ora, in tutte le parti del programma in cui è necessaria l'acquisizione, la stesse avviene mediante la pressione di un pulsante che scatena l'evento readLine sulla serialPort. Questo purtroppo fa si che spesso si verifichino degli errori (gestiti, ma pur sempre errori) per i quali non so darmi una spiegazione ma solo fare due ipotesi: a) la richiesta di lettura avviene "a metà" della stringa trasmessa b) il buffer di ricezione dopo un po' si riempie e genera qualche problema I miei dubbi sono due: le ipotesi fatte sono plausibili? Eventuali soluzioni? Attualmente propendo più per il problema B perchè ho notato che gli errori sono molto più probabili dopo un po' di tempo che utilizzo il programma e se chiudo e riapro la form per un po' non si verificano, ma non ne sono certo...
__________________
Firma in sciopero! |
![]() |
![]() |
![]() |
#9 | ||||||
Member
Iscritto dal: May 2009
Messaggi: 186
|
Quote:
Quote:
Quote:
Quote:
Quote:
Quote:
HTH, |
||||||
![]() |
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: Oct 2008
Messaggi: 365
|
Quote:
__________________
Firma in sciopero! |
|
![]() |
![]() |
![]() |
#11 | |
Member
Iscritto dal: May 2009
Messaggi: 186
|
Quote:
Nel tuo caso il thread si occuperebbe di leggere continuamente la seriale, interpretare il protocollo e restituire il dato a chi lo richiede. Ripeto, se ne può anche fare a meno, ma mi sembra un caso tipico per utilizzarlo. |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 14:13.