Newsgroup: it.comp.lang.visual-basic
Titolo: Popolare datagridview da rs232

Ciao,
devo sviluppare una raccolta dati da bilancia in visual studio 2017.
Se lo trovo ancora dovrei avere il codice per aprire e chiudere la porta COM poi mi servirebbe popolare un datagridview composta da 2 colonne:
nella prima metterei un numero progressivo da 1 a n
nella seconda il dato numerico a 2 cifre proveniente dalla bilancia
alla fine devo esportare tutto in un nuovo file Excel e qui dovrei cavarmela...
come popolo il datagridview? la COM deve essere sempre aperta, è la bilancia a passare il dato, il software lo prenderebbe in automatico
grazie
Marco
 


Se cerci 'c# rs232' vien fuori una marea di roba
 


ho già cercato e provato e qualcosa sono riuscito a fare ma mi popola il datagridview in un modo un po' strano e non riesco ad inserire il contatore nella prima colonna... continuo a cercare

 
 
Allora il problema e' diverso, e circoscrivibile al popolamento della 
griglia
Posta il codice che non funziona come desideri e magari c'e' qualcuno 
che riesce ad aiutarti
Oppure, se hai gia' cercato ma con esito negativo, e hai fretta e 
necessita' di realizzare esattamente quanto richiesto prova a pubblicare 
annuncio, anche qua dentro, di ricerca programmatore disponibile a fare 
questo e quest'altro


dopo l'apertura della porta COM ho messo questo:
 
DgvDati.Select() 'Seleziono il DataGridView
            With DgvDati
                '.Rows(.Rows.Count - 1).Cells(0).Value = DgvDati.Rows.IndexOf(CounterSample.ToString)
                .Rows(.Rows.Count - 1).Cells(1).Value = SerialPort.ReadLine
                .Rows.Add()
            End With
 
nella prima riga ho tentato di inserire un contatore
nella seconda leggo il dato ma non va a capo e sembra bloccarsi quando invio altri dati dalla bilancia...
grazie

 dalla bilancia... grazie
 
Io metterei i dati in una list of MIA CLASSE, che popolerai quando arrivano
dati dalla COM.
Poi la griglia visualizza questa lista.
 
A quel punto mettere una colonna con un numero, e una con il testo è molto
semplice.


grazie, domani e venerdì sono in smart working e non posso connettermi alla bilancia per eseguire test. Lo proverò martedì e ti faccio sapere
Marco


Ci sono dei programmi che puoi usare per creare una porta com virtuale
Tu ci scrivi con un emulatore terminale e la porta virtuale e' connessa 
alla porta com fisica
Il pc vede i dati arrivare sulla com della bilancia
Eltima e' la prima che mi viene in mente ma anche su sourgeforce c'e' 
roba utile per questo
 


L'azienda non concede l'installazione di programmi esterni anche free comunque mi sono lasciato tutti gli aspetti grafici per lo smart working poi mercoledì tornerò a concentrarmi sul test dei dati.
detto ciò sono riuscito a far funzionare l'acquisizione dati mettendo questo codice sotto timer. il problema è che ricevo i pesi ma si blocca tutto il resto del form ad esempio il pulsante di uscita e quello di disconnessione!
 
Private Sub TimerRicevi_Tick(sender As Object, e As EventArgs) Handles TimerRicevi.Tick
 
        DgvDati.Rows.Add(DgvDati.CurrentRow.Index + 1.ToString, SerialPort.ReadLine)
        DgvDati(0, DgvDati.NewRowIndex).Selected = True
 
    End Sub

 del form ad esempio il pulsante di uscita e quello di disconnessione!
 
Probabilmente puoi provare a gestire la ricezione su un thread separato, ma
a questo punto non puoi usare i controlli grafici, ma usare un sistema
diverso non proprio banale.


Ciao, 
com'e' fatto il protocollo della bilancia? Sei sicuro che la stringa di peso sia terminata con un carattere di NewLine? 
Se guardi la documentazione dice che la Readline legge fino a quando non incontra un carattere di NewLine. 
Può essere che alla prima lettura il readline resti appeso e ti blocchi la UI del programma, in attesa del terminatore NewLine che non arriva.
 
 
https://docs.microsoft.com/it-it/dotnet/api/system.io.ports.serialport.readline?view=netframework-4.8
 
 
Qui trovi un esempio che mi sembra abbastanza corretto, in particolare il metodo 2 citato, ma dovresti cambiare approccio, usando gli eventi del SerialPort:
https://stackoverflow.com/questions/21688818/net-serialport-readline-vs-datareceived-event-handler/21689420
 
 
Ps: Attenzione che gli eventi arrivano su un thread diverso da quello della UI,
cerca come va usato il metodo InvokeRequired.


ho provato così (SerialPortBil è il nome della mia seriale):
 
Public Sub StartListener()
 
        Try
 
            '_SerialPort = New Ports.SerialPort
            SerialPortBil = New Ports.SerialPort
 
            With SerialPortBil
                .PortName = CbSerialPort.Text
                .BaudRate = 9600
                .DataBits = 8
                .Parity = Ports.Parity.None
                .StopBits = Ports.StopBits.One
                .Handshake = Ports.Handshake.None
                AddHandler .DataReceived, AddressOf SerialPortBil_DataReceived  'DataReceivedHandler
            End With
 
            SerialPortBil.Open()
            '_SerialPort.Open()
 
        Catch ex As Exception
 
        End Try
    End Sub
 
    Private Shared buffer As String = ""
 
    Private Sub SerialPortBil_DataReceived(sender As Object, e As Ports.SerialDataReceivedEventArgs) Handles SerialPortBil.DataReceived
 
        DgvDati.Rows.Add(DgvDati.CurrentRow.Index + 1.ToString, SerialPort.ReadLine)
 
    End Sub
 
sul pulsante di apertura COM ho messo
SerialPortBil.Open() 
 
non vedo arrivare alcun dato...
provando con un hyperterminal vedo che la bilancia invia il dato poi va a capo...
 


Dovresti provare con altro programma un po' piu' flessibile, tipo 
RealTerm o simili
Ti possono far vedere i dati anche in binario o esadecimale
Cosi' vedi esattamente cosa manda a fine riga, se un car 13, un 10, 
l'accoppiata dei due o altro
E da quello che spara fuori la bilancia poi dipende il software che 
riceve cosa deve attendersi per chiudere una riga in lettura
 
 


io ho a disposizione Hyperterminal Putty non so se può fare le stesse cose... L'azienda non mi permette l'uso di software anche free che si installano sui PC, se ce n'è uno che non va installato ma lanciato direttamente posso provare... in ogni caso io i dati li ricevo, credo sia solo una questione di modificare il codice che li riceve, ora uso un timer, magari sbaglio lì

 
 
Puoi provare il programmino che trovi qui: 
https://www.ennepisoft.it/test/testConn.7z
 
è fatto in C++. Nello zip trovi anche un include e una classe per 
facilitare l'uso della dll (che è il vero motore).
 
La dll è possibile utilizzarla anche in vb6.
In 
https://www.ennepisoft.it/test/commsample.7z
 trovi un esempio, 
trovato in rete, poi convertito per usare la mia dll.
Il form non fa altro che preparare i dati per la connessione (primo 
pulsante), poi aprirla, inviare la stringa 'READ' e aspettare i dati di 
ritorno (era giusto una prova per un amico).
Nel tuo caso potresti mettere la routine in un timer e verificare se ci 
sono dati col comando 'cGetAvail' che ne ritorna il numero di disponibili.
Saluti
 


credo di esserci....
 
Private Sub SerialPortBil_DataReceived(sender As Object, e As Ports.SerialDataReceivedEventArgs) Handles SerialPortBil.DataReceived
 
        Try
            If SerialPortBil.IsOpen Then
                spDrLine = spDrLine & SerialPortBil.ReadExisting()
 
                If InStr(1, spDrLine, vbCr) > 0 Or InStr(1, spDrLine, vbLf) > 0 Then
                    spBuffer = spDrLine
                    spDrLine = ""
                    Me.Invoke(New EventHandler(AddressOf DoProcess))
                Else
                    Exit Sub
 
                End If
            End If
        Catch ex As Exception
 
        End Try
 
    End Sub
 
Private Sub DoProcess()
 
        Dim f As Integer
 
        f = DgvDati.Rows.Count
 
        Dim n As Integer = DgvDati.Rows.Add()
        DgvDati.Rows.Item(n).Cells(0).Value = f '+ 1
        DgvDati.Rows.Item(n).Cells(1).Value = spBuffer 
 
End Sub
 
Spero che così funzioni tutto, per ora sembra andare
 
l'unica cosa è che ora ricevo il dato tipo 8.75 g mentre vorrei ricevere 8,75 senza la g
ci lavoro un po' e vedo se riesco così quando esporto in Excel i dati sono in formato numerico


L'azienda qui e l'azienda la, oiii ma siamo schrezando???
Se c'e' una cosa che ti serve per finire il lavoro, te la fai prendere
Ed in fretta anche
Cerca di tirar giu' qualche santo ogni tanto
 


dovrei fare richiesta ed attendere che mi facciano sapere, ci vogliono diversi giorni... 
ora ricevo tutto ed ho messo anche la , al posto del . nel valore
devo solo capire come togliere la g finale e dovrei esserci prima di avere una risposta sul programmino


Cos'e', non sai come tirare via " g" da una stringa?
 
https://www.youtube.com/watch?v=53iRWY6kf6o
 


Fatto, l'ho tirata via ed ho sistemato tutto

 avere una risposta sul programmino
 
Leggo solo ora la discussione: io ho POCA esperienza con .net ma
molta con la seriale, il problema mi sembra che leggi i dati come
STRINGA e quindi "lasci" alla com di "indovinare" la conversione da
applicare, su VB6 leggevo le bilance come binario e poi il mio
codice le traduceva in stringa; mi pare di ricordare che se leggevo
come stringa spesso il sistema andava in vacca se (ad esempio) la
pesata era negativa (tipo quando togli il contenitore "tara") o
quando c'erano 3 cifre dopo lo zero al posto di 2 o quando il
numero dopo la virgola sembrava un "escape" (chr 27).
 
insomma ci bestemmiai un paio di giorni poi passai al metodo
binary per dumpare le letture in un file e capire cosa c'era di
sbagliato e scoprire che in binary erano letture perfette e che
era la conversione della seriale ad andare spesso in vacca.


io al momento sto leggendo tutto senza problemi e il datagridview è popolato correttamente. Sostituisco il . con la , così in Excel vede i dati come numerici. Ora vedo di aggiungere una TextBox dove calcolare la media in tempo reale.

Scriveva Marco75 giovedì, 04/06/2020:

ottimo.


hai per caso il codice per il calcolo della deviazione standard? così metto anche quello oltre alla media che dovrebbe essere più semplice...
il calcolo va fatto in tempo reale sui dati della seconda colonna del datagridview
grazie
Marco