Событие DataReceived возникает в момент опроса порта (которое вероятно происходит каждый тик), если в буфере есть данные. Данные же в буфер пишутся асинхронно (по мере поступления).
Поэтому, когда возникает событие DataReceived, в буфер могут ещё не успеть записаться все байты, для решения этой проблемы я делал так:
Класс "ComPort" http://pastie.org/10814442private void ComPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
byte[] inBuf = new byte[256];
int rxCount = _comPort.Read(ref inBuf, 2); //Максимальное время между байтами одной посылки
if (rxCount < 5) return; //Не наше
//Обрабатываем массив inBuf
}
private ComPort _comPort = new ComPort();
private void LoadPortSettings() //Повесить на загрузку формы
{
_comPort.DataReceived += ComPort_DataReceived;
cmbPort.Items.Clear();
cmbPort.Items.AddRange(_comPort.PortNames());
cmbBaudRate.Items.Clear();
cmbBaudRate.Items.AddRange(_comPort.BaudRates());
cmbPort.SelectedItem = Properties.Settings.Default.Port;
cmbBaudRate.SelectedItem = Properties.Settings.Default.BaudRate;
}
private void UpdatePortSettings() //Повесить на изменение комбобоксов cmbPort и cmbBaudRate
{
int cpi = cmbPort.SelectedIndex;
int bri = cmbBaudRate.SelectedIndex;
if (cpi >= 0 && bri >= 0)
{
string port = cmbPort.Items[cpi].ToString();
string baudRate = cmbBaudRate.Items[bri].ToString();
if (!string.IsNullOrWhiteSpace(port) && !string.IsNullOrWhiteSpace(baudRate)
&& _comPort.isPortChange(port,baudRate))
{
_comPort.Open(port, baudRate);
}
}
}