2015-08-19 18 views
5

Ho provato tutto quello che riesco a trovare in rete, e nulla mi ha aiutato, quindi devo rivolgermi a voi brave persone per un po 'di illuminazione.Non si ricevono tutti i dati seriali

Sto utilizzando Visual C# 2013, .NET Framework 4.5 (spero ho ottenuto i tag corretti)

Ho scritto il codice embedded per un bel po 'e sono molto bene con esso. Questa roba C# è un animale completamente diverso.

Ho un programma scritto su un microcontrollore ARM che sta parlando in serie con un programma C#. Sono sicuro al 99,9% che il microcontrollore invii tutto correttamente. Ho usato Realterm per esaminare i dati e tutto sembra buono ma non riesco a ottenere il mio programma C# per ricevere tutti i dati nel modo in cui penso che dovrebbe.

Sia il microcontrollore che il programma C# sono impostati sulle stesse impostazioni (57600 baud, 8 bit di dati, nessun handshaking, nessuna parità, un bit di stop) Non è un grosso problema.

Il mio problema è se imposto ReceiveByteThreshold su 1 e il programma riceve un byte e viene inviato all'ISR (non so se ISR è il termine corretto in C# ma è quello che chiamerò). E questo è il modo in cui ho capito che dovrebbe funzionare.

Ho il seguente codice per ottenere i byte.

GlobalVars.data_byte è un array di 100 byte e bytes_to_read è impostato su 100.

serialPort1.Read(GlobalVars.data_byte, 0, bytes_to_read) 

mio problema è se guardo il valore di ritorno della funzione serialPort1.Read, rimbalza tra 5 e 13 byte, ma mando 21 byte dal microcontrollore. Per qualche motivo non li sta facendo tutti.

Ora, se si imposta ReceiveByteThreshold = 13 il valore di ritorno rimbalza tra 13 e 16. Se si imposta ReceiveByteThreshold = 14 (o qualsiasi cosa fino a 21) il valore restituito è un bel 21 costante, come dovrebbe essere.

Mi manca qualcosa? Ho pensato che il modo in cui questo dovrebbe funzionare è se ReceiveByteThreshold = 1 il programma verrà inviato al ISR non appena il primo byte viene letto e

serialPort1.Read(GlobalVars.data_byte, 0, bytes_to_read) 

avrebbe letto tutti i byte fino a quando non vede un bit di stop. Significato dovrebbe leggere tutti i 21 byte.

Non posso semplicemente effettuare ReceiveByteThreshold = 14 perché non tutti i dati che sto inviando sono lunghi 21 byte. A volte sono solo 2 byte e l'ISR non verrebbe mai attivato.

Spero di averlo chiarito abbastanza.

+0

bisogna ciclo in base al risultato di '.Read' (che significa' .Read' più volte –

+0

Non ho idea di come fai quello che stai chiedendo, ma il tuo codice di esempio sembra molto simile ad alcuni dei trucchi per leggere un file da filestream. Fai una ricerca di Jon Skeet e del modo corretto di leggere un file e vedere se quegli stessi metodi ti aiutano. i byte finché non vengono letti tutti. –

+2

La classe porta seriale ha un piccolo buffer in modo da non ottenere tutti i dati in una lettura(). È necessario inserire Read() in un ciclo e chiamare Read() più volte finché non si ricevono 21 byte. – jdweng

risposta

0

Una volta .. Ero quasi nella stessa situazione. Perché, come dicevano i nostri amici, a volte non ottiene tutti i dati contemporaneamente.
Guarda il destinatario. Vi posto il mio codice, spero che aiuta. Chiamata

var End = '\r'; //Last character for searching 
int dataLength = _serialPort.BytesToRead; 
byte[] data = new byte[dataLength]; 
int nbrDataRead = _serialPort.Read(data, 0, dataLength); 

RxString = Encoding.ASCII.GetString(data); 
txtCodProd.AppendText(RxString); 

if (RxString.IndexOf((char)End) > -1) 
{ 
    this.Invoke(new EventHandler(EndMethod)); //After Get all data, DoSomething  
} 

//RxString = _serialPort.ReadExisting(); // doesn't Work for all data  
Problemi correlati