How can I improve this unsatisfactory, horrible Serial Port code?

I have an ugly piece of Serial Port code that is very unstable.

void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    Thread.Sleep(100);
    while (port.BytesToRead > 0)
    {
        var count = port.BytesToRead;

        byte[] buffer = new byte[count];

        var read = port.Read(buffer, 0, count);

        if (DataEncapsulator != null)
            buffer = DataEncapsulator.UnWrap(buffer);


       var response = dataCollector.Collect(buffer);

       if (response != null)
       {
           this.OnDataReceived(response);
       }

       Thread.Sleep(100);
    }    
}

If I delete calls to Thread.Sleep (100), the code stops working.

Of course, it really slows down, and if there are a lot of data streams, it stops working if I do not make the dream even bigger. (The stop works like a dead end)

Please note that DataEncapsulator and DataCollector are components provided by MEF, but their performance is not bad.

The class has a Listen () method that starts a background worker to receive data.

public void Listen(IDataCollector dataCollector)
{
    this.dataCollector = dataCollector;
    BackgroundWorker worker = new BackgroundWorker();

    worker.DoWork += new DoWorkEventHandler(worker_DoWork);
    worker.RunWorkerAsync();
}

void worker_DoWork(object sender, DoWorkEventArgs e)
{
    port = new SerialPort();

    //Event handlers
    port.ReceivedBytesThreshold = 15;
    port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);

    ..... remainder of code ...

Suggestions are welcome!

Update: * , IDataCollector. , . , , DataColllector, true, . , , crc . . *

2: , , - :

void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
        var count = port.BytesToRead;

        byte[] buffer = new byte[count];

        var read = port.Read(buffer, 0, count);

        if (DataEncapsulator != null)
            buffer = DataEncapsulator.UnWrap(buffer);

        var response = dataCollector.Collect(buffer);

        if (response != null)
        {
            this.OnDataReceived(response);
        }     
}

, . OnDataReceived , . ( . MSDN). , , .

, , , , .

, while, ?

+3
3

- . "" , .NET , , , . .

, , , , 8K, , . ?

private byte[] buffer = new byte[8192];

void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    Thread.Sleep(100);
    while (port.BytesToRead > 0)
    {
        var count = port.BytesToRead;

        var read = port.Read(buffer, 0, count);

        // ... more code   
    }
}

, , . :

  • 1: 100 ; 100
  • 2: 75 ; 75 .

, 100 , Loop Iteration 1, 75 , Loop Iteration 2. 100- 75 . ( , , .)

, DataReceived . , MEF, , . , - , MEF ? , DataReceived . , , , . , , , , MEF . , .

+2

...

DataReceived, , , Sleep(), , - ( MemoryStream),

Thread (BgWorker) () serialPort1.Read(...), .

Edit:

, , : Dowork(). , , () , ReadBufferSize.

Edit2, Update2:

while BgWorker, . :

byte[] buffer = new byte[128];  // 128 = (average) size of a record
while(port.IsOpen && ! worker.CancelationPending)
{
   int count = port.Read(buffer, 0, 128);
   // proccess count bytes

}

, , , 126 . , ReadTimeOut. , port.ReadByte(). ReadBuffer, .

+1

, , . , , , . , . , , . , , , .

private byte[] buffer = new byte[8192]; 
var index = 0;
void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{    
    index += port.Read(buffer, index, port.BytesToRead);
} 

void WriteDataToFile()
{
    binaryWriter.Write(buffer, 0, index); 
    index = 0;
}
0

Source: https://habr.com/ru/post/1714421/


All Articles