Oppure

Loading
31/07/10 20:45
uelfox
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:
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.
aaa
01/08/10 8:55
nessuno
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à.
01/08/10 10:15
uelfox
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?
aaa
01/08/10 10:34
nessuno
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à.
01/08/10 10:41
uelfox
Velocità 115k, intercettazione dati da canbus.
Devo isolare alcuni dati, che hanno come ID del messaggio, ad esempio "6C1"....
aaa
01/08/10 11:04
nessuno
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 01/08/10 11: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à.
02/08/10 13:58
uelfox
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 02/08/10 14:00
aaa
02/08/10 14:15
nessuno
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à.