CSharp - Serial Handling Notes

From PeformIQ Upgrade
Jump to navigation Jump to search

Use the data received event to fill a buffer:

    private void dataReceived(object sender, SerialDataReceivedEventArgs e) {
        while (port.BytesToRead > 0){
            byte[] newBytes = new byte[port.BytesToRead];
            int LengthRead = port.Read(newBytes, 0, newBytes.Length);
            Array.Resize(ref newBytes, LengthRead);
            System.Buffer.BlockCopy(newBytes, 0, buffer, positionInBuffer, newBytes.Length);
            positionInBuffer += newBytes.Length;
        }
    }

Looping for an expected number of bytes, in this case causing the TimeoutException:

    while (port.BytesToRead < expectedSize)
    {
        System.Threading.Thread.Sleep(10);
        waitingLoop++;
        if (waitingLoop > TimeOut)             // wait for a 1s timeout
            throw new TimeoutException();
    }

    newBytes = new byte[expectedSize];
    LengthRead = port.Read(newBytes, 0, newBytes.Length);
    if (LengthRead != newBytes.Length)
        throw new TimeoutException(); // or any exception, doesn't matter...