C # чтение данных последовательного порта после завершения сообщения - PullRequest
0 голосов
/ 01 июля 2018

Я хочу прочитать сообщение, отправленное химическим анализатором через последовательный порт. Я написал следующий код. Он читает полученные байты, но есть случаи, когда некоторые байты объединяются, и неожиданный набор байтов принимается на полпути сообщения. Можно ли как-нибудь подождать до конца сообщения и получить все байты?

SerialPort com = new SerialPort();
List<byte> thisMessage = new List<byte>();
string status = "";


private void btnOpen_Click_1(object sender, EventArgs e){
    btnOpen.Enabled = false;
    btnClose.Enabled = true;
    try
    {
        com.PortName = cmbPort.Text;
        com.BaudRate = Int32.Parse(txtBaudRate.Text);
        com.DataBits = Int32.Parse(txtBitLength.Text);
        com.ReadBufferSize = 100000;
        com.StopBits = StopBits.One;
        com.DtrEnable = true;
        com.RtsEnable = true;
        com.Open();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, "Message", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }

    com.DataReceived += new SerialDataReceivedEventHandler(com_DataReceived);
}




private void com_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    int bytes = com.BytesToRead;
    byte[] buffer = new byte[bytes];
    com.Read(buffer, 0, bytes);
        if (ContainEnd(buffer))
        {
           status += DateTime.Now.ToString("dd MMM yyyy hh:mm:ss tt") + " Message Received From Analyzer." + Environment.NewLine;
            thisMessage.AddRange(buffer);
            String ts = "";
            foreach (byte b in thisMessage)
            {
                ts += b + " ";
            }
            status += ts + Environment.NewLine;
            thisMessage = new List<byte>();
            status += "End of a Message " + Environment.NewLine;
        }
        else
        {
            thisMessage.AddRange(buffer);
            String ts = "";
            foreach (byte b in buffer)
            {
                ts += b + " ";
            }
            status += DateTime.Now.ToString("dd MMM yyyy hh:mm:ss tt") + " Part of a Message " + ts + Environment.NewLine;
        }

    this.Invoke(new EventHandler(DisplayText));

}

Когда я запускаю этот код, я получаю байты, такие как 5 2 2 194 77 181 48 105 94 Здесь байты 2 не ожидаются в этой части сообщения. Не может быть байтов, таких как 194 или 181. Поэтому я думаю, что есть неправильное чтение байтов.

Как я могу получить правильные байты из последовательного порта?

...