uelfox (Normal User)
Rookie
Messaggi: 33
Iscritto: 25/01/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# |
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.
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6402
Iscritto: 03/01/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 ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
uelfox (Normal User)
Rookie
Messaggi: 33
Iscritto: 25/01/2010
|
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?
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6402
Iscritto: 03/01/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 ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
uelfox (Normal User)
Rookie
Messaggi: 33
Iscritto: 25/01/2010
|
Velocità 115k, intercettazione dati da canbus.
Devo isolare alcuni dati, che hanno come ID del messaggio, ad esempio "6C1"....
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6402
Iscritto: 03/01/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 ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
uelfox (Normal User)
Rookie
Messaggi: 33
Iscritto: 25/01/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 |
|
nessuno (Normal User)
Guru^2
Messaggi: 6402
Iscritto: 03/01/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 ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
uelfox (Normal User)
Rookie
Messaggi: 33
Iscritto: 25/01/2010
|
Ma la velocità nn posso diminuirla!!! Devo restare alla velocità di 115.2, perchè i dati dietro all'interfaccia viaggiano a 95kbps.
|
|