Search code examples
c#serial-port

Can I set the cycle that DataReceived event occurs from SerialPort?


I have a program that reads and writes a hexadecimal byte[] from SerialPort.

My program only use 5 bytes(five hexadecimal) in one communication.

The problem is that the DataReceived occurence cycle is random. So, sometimes it reads 5 bytes, sometimes it reads 4 bits.

enter image description here

I always want DataReceived to read 5 bytes. Is it possible?

Below code is the logic of program that I wrote.

serialPort.Write(sendData, 0, sendData.Length);
serialPort.DataReceived += (sender, e) =>
{
    var receiveSize = serialPort.BytesToRead;
    var buffer = new byte[receiveSize];

    serialPort.Read(buffer, 0, buffer.Length);
    this.Invoke(() =>
    {
        readRichTextBox.AppendText($"{string.Join(" ", Encoding.UTF8.GetString(buffer))}\n");
    });
};

Solution

  • I solved it after creating a empty List<byte>. Is there a better way?

    private List<byte> bytes = new List<byte>();
    
    serialPort.DataReceived += (sender, e) =>
    {
        var receiveSize = serialPort.BytesToRead;
        var buffer = new byte[receiveSize];
    
        serialPort.Read(buffer, 0, buffer.Length);
    
        this.Invoke(() =>
        {
            foreach (var b in buffer)
            {
                bytes.Add(b);
            }
    
            if (bytes.Count == 10)
            {
                readRichTextBox.AppendText($"{string.Join(" ", Encoding.UTF8.GetString(bytes.ToArray()))}\n");
                bytes.Clear();
            }
        });
    };