C # di comunicazione seriale - Ricevuto dati persi
-
03-10-2019 - |
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.
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.