Domanda

I dati ricevuti nella mia C # applicazione è perdersi a causa del campo di collettori essere troppo scritto, piuttosto che aggiunto.

  char[] pUartData_c;

  private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
  {
     try
     {
        pUartData_c = serialPort1.ReadExisting().ToCharArray();
        bUartDataReady_c = true;
     }
     catch ( System.Exception ex )
     {
        MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
     }
  }

In questo esempio pUartData_c viene sovrascritto ogni volta che nuovi dati viene ricevuto. In alcuni sistemi questo non è un problema perché i dati provengono in modo sufficientemente rapido. Tuttavia, altri dati sistemi nel buffer di ricezione non è completa. Come posso accodamento ricevuto i dati per pUartData_c, piuttosto che scriva sopra di esso. Sto usando Microsoft Visual C # 2008 Express Edition. Grazie.

È stato utile?

Soluzione

private SerialPort sp;
private List<byte> byte_buffer = new List<byte>();    

private void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
   byte_buffer.Clear();

   while (sp.BytesToRead > 0)
   {
      byte_buffer.Add((byte)sp.ReadByte());
   }
}

Altri suggerimenti

Se pUartData era un List<char> si potrebbe aggiungere i caratteri in arrivo alla lista con .AddRange().

Ho dovuto leggere questa domanda 2-3 volte prima di sapere che questo è solo Array problema di accodamento in C #. (Inizialmente ho pensato che questo era un grave errore di comunicazione seriale ... lol)

Ok,

Si potrebbe usare un List<> o ArrayList classe per mantenere i dati dinamici. cioè aggiungere rimuovere etc. così ogni volta che ricevete i dati da seriale, basta aggiungere alla lista.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top