Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Come leggo un byte alla volta da serialPort?
Forum - C# / VB.NET - Come leggo un byte alla volta da serialPort?

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
uelfox (Normal User)
Rookie


Messaggi: 32
Iscritto: 25/01/2010

Segnala al moderatore
Postato alle 22:45
Sabato, 31/07/2010
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 sorgente - presumibilmente C#

  1. void serialPort2_DataReceived(object sender, SerialDataReceivedEventArgs e)
  2.         {
  3.             string cosaleggo="";
  4.             int ndati = serialPort1.BytesToRead;
  5.             byte dato;
  6.            
  7.             .......
  8.  
  9.                 dato = serialPort1.ReadByte();
  10.             }
  11.         }


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.

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5640
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 10:55
Domenica, 01/08/2010
La proprietà ReceivedBytesThreshold impostata ad 1 non ti assicura che l'evento verrà generato quando viene ricevuto 1 byte ma quando viene ricevuto "almeno" 1 byte.

Dovrai gestire tu la ricezione di più byte, analizzando il buffer all'interno dell'evento di ricezione.

Ma poi, che differenza fa ricevere uno o più byte?


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
uelfox (Normal User)
Rookie


Messaggi: 32
Iscritto: 25/01/2010

Segnala al moderatore
Postato alle 12:15
Domenica, 01/08/2010
Testo quotato

Ma poi, che differenza fa ricevere uno o più byte?  



Pensavo nessuna, ma ho problemi di velocità...nel senso che anche la semplice visualizzazione di quello che arriva sulla seriale, nn è in tempo reale, rimane in ritardo
di parecchi secondi.
Pensavo che gestendo l'evento ad ogni byte, risolvevo la cosa.
Quindi tu mi consigli di gestire all'interno dell'evento, ad esempio con un ciclo "while(ndati>0)", i dati che mi trovo nel buffer, giusto?

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5640
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 12:34
Domenica, 01/08/2010
Come mai questi problemi? Di che si tratta? A quale velocità comunichi? Che tipo di progett è? Che problemi hai esattamente?


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
uelfox (Normal User)
Rookie


Messaggi: 32
Iscritto: 25/01/2010

Segnala al moderatore
Postato alle 12:41
Domenica, 01/08/2010
Velocità 115k, intercettazione dati da canbus.
Devo isolare alcuni dati, che hanno come ID del messaggio, ad esempio "6C1"....

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5640
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 13:04
Domenica, 01/08/2010
La velocità è abbastanza elevata per il VB. Puoi avere molti errori di ricezione a quella velocità.

Visto che i dati ti arrivano in continuazione e in numero non predeterminabile, dovrai esaminare l'intero contenuto del buffer in arrivo (all'interno dell'evento) byte per byte.

E se cerchi una "precisa sequenza", dovrai tenerne conto nel codice, in base alla lunghezza di tale sequenza.

Ultima modifica effettuata da nessuno il 01/08/2010 alle 13:04


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
uelfox (Normal User)
Rookie


Messaggi: 32
Iscritto: 25/01/2010

Segnala al moderatore
Postato alle 15:58
Lunedì, 02/08/2010
Più che errori di ricezione, ho il buffer che schizza subito pieno....
Ho provato a gestire la lettura, senza generare l'evento DataReceive, creando un timer, con timer1.interval=1, e ad ogni tick, leggo con serialport.readchar, ma mi sembra che neanche così lo risolvo!!!
Cosa provo ora?
Sicuramente se scarico il buffer con serialport.readExisting, forse dovrei stagli dietro, ma il problema è che nella funzione che esamino il flusso, nn è che li perdo ancora del tempo?
Cosa potrei usare?

Ultima modifica effettuata da uelfox il 02/08/2010 alle 16:00
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5640
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 16:15
Lunedì, 02/08/2010
L'intervallo è espresso in millisecondi(non tick) e quindi 1 dovrebbe essere 1 millisecondo.

Ma Windows non è un sistema operativo realtime e quindi non rispetterà mai quell'intervallo di tempo; di fatto, non avrai un timer (normale) più rapido di 10 o 15 millisecondi.

Il buffer si riempie proprio perché la velocità è elevata e sicuramente quando esamini i valori ricevuti impieghi del tempo.

Probabilmente il VB.NET non è il linguaggio più adatto a questo tipo di problemi; dovresti provare in C/C++. E probabilmente dovresti (anche) limitare la velocità.


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
uelfox (Normal User)
Rookie


Messaggi: 32
Iscritto: 25/01/2010

Segnala al moderatore
Postato alle 16:45
Lunedì, 02/08/2010
Ma la velocità nn posso diminuirla!!! Devo restare alla velocità di 115.2, perchè i dati dietro all'interfaccia viaggiano a 95kbps.

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo