Come leggo singoli byte da seriale?

Dicussioni circa la programmazione di applicazioni desktop.

Come leggo singoli byte da seriale?

Messaggioda uelfox » sab lug 31, 2010 9:39 pm

Ciao a tutti, nn so se il caldo o cosa, ma nn riesco a venirne fuori da questo problema.... mi spiego;
Ho un'interfaccia collegata alla seriale, e dovrei gestire i dati ricevuti da essa, in modo singolo, byte x byte;
Tralasciando la parte del codice per l'apertura della porta con i parametri per la corretta connessione, ho impostato il serialPort1.ReceivedBytesThreshold=1 (default), così sono sicuro che mi viene generato l'evento serialPort1.DataReceived, alla presenza di un byte, e questo è il codice dell'evento:
Codice: Seleziona tutto
void serialPort2_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            string cosaleggo="";
            int ndati = serialPort1.BytesToRead;
            byte dato;
           
            .......

                dato = serialPort1.ReadByte();
            }
        }

Ma noto che appena l'evento viene generato, la mia variabile ndati ha già un valore maggiore di 1!!
Dove sbaglio?
Per caso devo impostare qualche altro parametro di serialPort1?

Grazie.
uelfox
 
Messaggi: 71
Iscritto il: sab set 05, 2009 12:01 am
Località: Varese

Re: Come leggo singoli byte da seriale?

Messaggioda Fad » dom ago 01, 2010 6:03 pm

Nessun errore, se tra quando scatta l'evento DataReceived a quando tu leggi la proprietà BytesToRead arrivano nuovi dati, il sistema te lo indica.
Se leggi solo un singolo byte, gli altri non vanno persi.. rimangono nel buffer di ricezione della seriale.

Ciao!!
Fad
Fad
 
Messaggi: 361
Iscritto il: dom gen 13, 2008 6:55 pm
Località: Brescia

Re: Come leggo singoli byte da seriale?

Messaggioda uelfox » dom ago 01, 2010 7:20 pm

Xò un problema c'è.... il software nn è abbastanza veloce per star dietro ai dati che ricevo;
La connessione è impostata su 115kbps, e nn posso fare meno;
Tra l'evento generato e la lettura, mi trovo già più di 1000 dati in seriale....
Come lo risolvo?
E' possibile che la visualizzazione in un textbox di quello che ricevo, rallenti il tutto??
Se utilizzo ReadLine(), riesco a star dietro ai dati??
uelfox
 
Messaggi: 71
Iscritto il: sab set 05, 2009 12:01 am
Località: Varese

Re: Come leggo singoli byte da seriale?

Messaggioda Sergio79 » mar ago 03, 2010 6:06 am

uelfox ha scritto:E' possibile che la visualizzazione in un textbox di quello che ricevo, rallenti il tutto??

Sì.

uelfox ha scritto:Se utilizzo ReadLine(), riesco a star dietro ai dati??

Intendi dire "Se utilizzo un programma su Console"?
In tal caso, sì, qualcosa ci guadagni.

Fondamentalmente però, il "problema" sta nel fatto che vuoi leggere e creare un processo di output per ogni singolo byte.
Hai 115 mila bit al secondo in ricezione e in un lasso di tempo così breve, non riuscirai mai a starci dietro, nemmeno da Console.
Sergio79
Sergio79
 
Messaggi: 1062
Iscritto il: dom gen 13, 2008 12:52 pm

Re: Come leggo singoli byte da seriale?

Messaggioda uelfox » mar ago 03, 2010 8:11 am

Per farti capire,ho provato ora a leggere ad ogni tick, quello che trovo in seriale, con il comando: serialport.ReadExisting() e questo è quello che mi arriva:

Codice: Seleziona tutto
cosaleggo="2B0 46 0C 00 0A 00 00 00 00 \r\n6C1 10 3A C0 00 37 03 10 1A \r\n2C1 30 00 02 02 00 00 00 00 \r\n6C1 21 00 1B 00 5B 00 66 00 \r\n6C1 22 53 00 5F 00 64 00 6D \r\n6C1 23 00 46 00 4D 00 31 00 \r\n6C1 24 1B 00 5B 00 66 00 53 \r\n6C1 25 00 5F 00 67 00 6D 00 \r\n6C1 26 20 00 20 00 44 00 45 \r\n501 61 00 42 16 01 00 40 01 \r\n6C1 27 00 45 00 4A 00 41 00 \r\n6C1 28 59 00 20 00 00 00 00 \r\n506 16 00 42 16 81 00 02 00 \r\n501 61 00 42 16 01 00 40 01 \r\n46C 41 00 \r\n691 41 00 60 11 02 00 20 08 \r\n"


Così facendo il buffer nn si carica eccessivamente, ma ora ho un'altro problema!

Della stringa sopra riportata, dovrei estrarre, una o più sottostringhe che iniziano con i caratteri "6C1" e continuare fino al \r\n. So però che questa sottostringa è sempre della stessa lunghezza 32 caratteri, compresi 6C1 e \r\n.
Come potrei fare?
uelfox
 
Messaggi: 71
Iscritto il: sab set 05, 2009 12:01 am
Località: Varese

Re: Come leggo singoli byte da seriale?

Messaggioda Sergio79 » mar ago 03, 2010 9:02 am

Con il metodo String.SubStringce la puoi fare.
Sergio79
Sergio79
 
Messaggi: 1062
Iscritto il: dom gen 13, 2008 12:52 pm

Re: Come leggo singoli byte da seriale?

Messaggioda uelfox » mar ago 03, 2010 2:36 pm

Eeeeeee, forse mi sono spiegato male....
Il metodo che mi hai consigliato tu, nn va bene, perchè io devo passagli l'indice di inizio e fine, della stringa sorgente, per estrarmi una sottostringa, ma io nn posso conoscere questi due valori, xchè è sempre diversa la posizione di dove trovo i dati di mio interesse;
Io l'unica cosa che so è che nella mia stringa cosaleggo ho al suo interno i dati di mio interesse che iniziano con 6C1 e finiscono alla prima ricorrenza di \r\n.

Questo è quello che dovrei ottenere:

string []pippo=cosaleggo.metodo("6C1");

Nell'array pippo mi troverò:
[0]="6C1 10 3A C0 00 37 03 10 1A \r\n"
[1]="6C1 21 00 1B 00 5B 00 66 00 \r\n"
[2]="6C1 22 53 00 5F 00 64 00 6D \r\n"
[3]="6C1 23 00 46 00 4D 00 31 00 \r\n"
[4]="6C1 24 1B 00 5B 00 66 00 53 \r\n"
[5]="6C1 25 00 5F 00 67 00 6D 00 \r\n"
[6]="6C1 26 20 00 20 00 44 00 45 \r\n"
[7]="6C1 27 00 45 00 4A 00 41 00 \r\n"
[8]="6C1 28 59 00 20 00 00 00 00 \r\n"
......

Nn esiste un metodo che fa questo?
Io nn l'ho trovato.....
uelfox
 
Messaggi: 71
Iscritto il: sab set 05, 2009 12:01 am
Località: Varese

Re: Come leggo singoli byte da seriale?

Messaggioda Sergio79 » mar ago 03, 2010 3:34 pm

Sì, il codice ;)

Oppure, come ti ho già detto, puoi sempre usare il metodo Substring unito al metodo IndexOf.
Sergio79
Sergio79
 
Messaggi: 1062
Iscritto il: dom gen 13, 2008 12:52 pm

Re: Come leggo singoli byte da seriale?

Messaggioda uelfox » mar ago 03, 2010 3:56 pm

Quindi ho fatto così:

Codice: Seleziona tutto
int a=cosaleggo.IndexOf("6C1 ");
string pippo=cosaleggo.Substring(a,30);


e così posso leggere la prima corrispondenza, ma come faccio per proseguire nella stringa?
Cancello quello che ho letto, e ripeto il codice sopra, oppure, posso impostare un puntatore sulla stringa sorgente.
uelfox
 
Messaggi: 71
Iscritto il: sab set 05, 2009 12:01 am
Località: Varese

Re: Come leggo singoli byte da seriale?

Messaggioda Sergio79 » mar ago 03, 2010 5:01 pm

Puoi farlo in modo ricorsivo passando come stringa una nuova stringa che partirà da a + 30.
Sergio79
Sergio79
 
Messaggi: 1062
Iscritto il: dom gen 13, 2008 12:52 pm


Torna a Windows Forms e WPF

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite