Porta Seriale VB.Net 2005

lunedì 23 luglio 2007 - 10.36

lanfra Profilo | Senior Member

Ciao, devo creare un'applicazione in VB.net che mi permette di leggere
il peso di una bilancia industriale che comunica tramite porta
seriale.

La stessa applicazione l'avevo fatta in VB6, dove utilizzavo il
componente MSComm. Impostavo la velocità di comunicazione e
quant'altro, aprivo la porta facevo tutti i controlli a me necessari e
riuscivo a leggere i dati da seriale.

Ora con VB.Net non ho la minima idea di come fare. Leggo, da forum,
che bisogna utilizzare classi esterne, bisogna importate la
System.IO.Port (smentito da altri siti)... insomma ho un po' di
confusione a riguardo. Qualcuno sa indicarmi la strada giusta e
semplice da eseguire per leggere i dati di una bilancia, dove questi
valori mi arrivano da seriale? Naturalmente il record di lettura della
bilancia lo gestisco io, ma ho problemi (o meglio non capisco) come
gestire l'apertura ed il settaggio della porta seriale da programma.

Grazie Lanfra
Lanfra

alextyx Profilo | Expert

L'argomento è stato trattato diverse volte. Dai un'occhaiata qui:

http://www.dotnethell.it/forum/messages.aspx?ThreadID=16513

lanfra Profilo | Senior Member

Grazie, come al solito indispensabili...
Lanfra

alextyx Profilo | Expert

Figurati....quando si può!

lanfra Profilo | Senior Member

OK, ho letto e sviluppato secondo l'esempio che mi hai postato...
Però ho difficoltà a leggere i dati che mi arrivano da seriale, ho fatto la sub che gestisce l'evento di ricezione dati DataReceived, ho creato il Delegate per un controllo Label.

Ma i caratteri che leggo da seriale sono altri rispetto a quelli che invio. Per intenderci stò facendo le prove con Hyper Terminal con 2 PC colegati tramite cavo seriale. Digito "123" leggo "???"....

Consigli?

Ciao e grazie in anticipo
Lanfra

bule Profilo | Junior Member

Non so se ti sia di aiuto ma quando io ho letto da seriale i ??? corrispondono al fatto che il reader dello stream dati usa un encoding che non riesce a decodificare i byte ricevuti... strano però che questo accada con i caratteri 123 che appartengono all'ASCI normale

lanfra Profilo | Senior Member

All'apertura della porta seriale ho impostato la proprietà

.Encoding = System.Text.Encoding.Unicode

ma non cambia nulla.

Ti posto il codice inerente alla gestione della porta seriale, magari sbaglio qualcosa

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub GetSerialPortNames()

With MSConnSerialPort
.PortName = gPortaCOM
.BaudRate = gVelCOM
.Parity = IO.Ports.Parity.None
.DataBits = 8
.StopBits = IO.Ports.StopBits.One
.Encoding = System.Text.Encoding.Unicode
End With
MSConnSerialPort.Open()

End Sub

Private Sub DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles MSConnSerialPort.DataReceived

UDCPESO.Invoke(New myDelegate(AddressOf aggiornaPesoUDC), New Object() {})

End Sub

Public Delegate Sub myDelegate()

Public Sub aggiornaPesoUDC()

UDCPESO.Text = MSConnSerialPort.ReadExisting

End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Ciao ciao
Lanfra

alextyx Profilo | Expert

Sì, in genere il problema viene con lettere accentate ed altre cosette simili.
Ovviamente avrai controllato più volte parità, baudrate, ecc...
Resta il dubbio sui livelli hardware. Prova ad usare Hyper Terminal su entrambi i PC e guarda se ti riceve le cose giuste.
Poi puoi sostituire Hyper Terminal (uno dei due) con il tuo software. A me ha funzionato subito tutto bene. Se non arrivi a niente, puoi postarmi il codice che hai scritto e lo provo qui.

Cross Posting: vedo che hai postato del codice. Se ti servisse un test, devi postare anche le dichiarazioni e le inizializzazioni dei valori, così controlliamo tutto.

bule Profilo | Junior Member

mi risulta un po difficile leggere il VB , uso c# però prova a mettere encoding.ascii a me l'unicode aveva dato problemi in quanto usa 16 bit e non 8 come l'ascii per un carattere..

non mi sembra ci sia qualcosa di errato nel codice..

lanfra Profilo | Senior Member

Il software che stò facendo è per la lettura del peso di una bilancia d'impianto.
La bilancia comunica il valore tramite seriale, perciò stò testando l'invio e la ricezione di numeri. Fatto stà che mi sono messo a giocare con Hyper Terminal ed ho capito di non aver configurato bene le proprietà ASCII....

Una volta fatto riesco a leggere i caratteri in modo corretto. Ora devo solo gestire il buffer size ed eventualmente l'inizio e fine comunicazione.....

Grazier e scusate il disturbo......

; >
Lanfra

alextyx Profilo | Expert

Nessun disturbo. Se leggi bene la discussione cui ti avevo diretto, c'è anche un suggerimento per rilevare la fine della ricezione mediante timeout. Più o meno la cosa è questa:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Come vedi imposto un timeout ragionevole (10ms) e in pratica ignoro l'errore, ma quando si verifica esco dal loop di ricezione. Potresti filtrare l'errore per ignorare solo quello di timeout e segnalare gli altri, ma questo lo lascio decidere a te!

lanfra Profilo | Senior Member

Per leggere la fine della stringa proveniente da seriale uso la .ReadTo...

Questo è quello che ho partorito. Leggo 2 seriali, una per la bilancia ed una per la "pistola" del codice a barre. Naturalmente tutto è appoggiato ad un file di INI che mi inizializza le variabili principali:

''''''''''''''''''''''''''''
Sub PortaSerialeBilancia()

With ConnSerialPortBil
.PortName = gPortaCOM
.BaudRate = gVelCOM
.Parity = IO.Ports.Parity.None
.DataBits = 8
.StopBits = IO.Ports.StopBits.One
End With
If Not ConnSerialPortBil.IsOpen Then ConnSerialPortBil.Open()

End Sub

Private Sub DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles ConnSerialPortBil.DataReceived, _
ConnSerialPortBarCode.DataReceived

On Error Resume Next

Select Case sender.portname
Case gPortaCOM
UDCPESO.Invoke(New myDelegate(AddressOf aggiornaPesoUDC), New Object() {})
Case gPortaCOMPistola
IDE_UDCDEST.Invoke(New myDelegate(AddressOf leggiBarCode), New Object() {})
End Select

End Sub

Public Delegate Sub myDelegate()

Public Sub aggiornaPesoUDC()

Dim sTxtBilancia As String

sTxtBilancia = ConnSerialPortBil.ReadTo(gFineCarBilancia)
UDCPESO.Text = GlmTxtInNumero(0, sTxtBilancia)

End Sub

Sub PortaSerialeBarCode()

With ConnSerialPortBarCode
.PortName = gPortaCOMPistola
.BaudRate = gVelCOM
.Parity = IO.Ports.Parity.None
.DataBits = 8
.StopBits = IO.Ports.StopBits.One
End With
If Not ConnSerialPortBarCode.IsOpen Then ConnSerialPortBarCode.Open()

End Sub

Public Sub leggiBarCode()

Dim sTxtBarCode As String

sTxtBarCode = ConnSerialPortBarCode.ReadTo(gFineCarPistola)

If Len(sTxtBarCode) <> 10 Then Exit Sub

If Mid(UCase(sTxtBarCode), 1, 1) = "P" Then
IDE_PALLET.Text = sTxtBarCode
IDE_PALLET.Select()
ElseIf Mid(UCase(sTxtBarCode), 1, 1) = "F" Then
IDE_UDCDEST.Text = sTxtBarCode
IDE_UDCDEST.Select()
End If

End Sub
''''''''''''''''''''''''''''

Ciao e grazie a tutti.....
Lanfra
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5