private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) { SerialPort sp = (SerialPort)sender; Byte[] inData = new Byte[sp.BytesToRead]; // read all available bytes from serial port in one chunk try { sp.Read(inData, 0, sp.BytesToRead); } catch (Exception ex) { WriteTxtLog($"Serial port read failed: {ex}"); return; } // DEBUG: display bytes read Console.WriteLine("<= RX ({0}) [{1}]", inData.Length, ByteArrayToHexString(inData)); // parse all bytes read through BGLib parser for (int i = 0; i < inData.Length; i++) { bglib.Parse(inData[i]); } }
private void OnDataReceived(object sender, SerialDataReceivedEventArgs e) { var sp = (SerialPort)sender; var inData = new byte[sp.BytesToRead]; sp.Read(inData, 0, sp.BytesToRead); foreach (var t in inData) { _bglib.Parse(t); } }
private void Run() { var buffer = new byte[128]; // The serial port normally only yields 1 byte at a time while (!_stopThread && _serialPort != null && _serialPort.IsOpen) { var readBytes = _serialPort.Read(buffer, 0, buffer.Length); for (var i = 0; i < readBytes; i++) { _bgLib.Parse(buffer[i]); } } }
private void StartSerialRxConsumerTask() { _serialRxConsumerTaskCTS = new CancellationTokenSource(); var cancelToken = _serialRxConsumerTaskCTS.Token; _serialRxConsumerTask = Task.Factory.StartNew(() => { while (true) { cancelToken.ThrowIfCancellationRequested(); if (_serialRxQueue.IsCompleted) { throw new Exception("SerialRxQueue has been completed"); } if (IsDisposed) { return; } byte[] chunk; var success = _serialRxQueue.TryTake(out chunk, 5, cancelToken); if (success) { foreach (var b in chunk) { _bglib.Parse(b); } } } }, cancelToken, // Recommendation via Stephen (Async man) // TaskCreationOptions.RunContinuationsAsynchronously // | TaskCreationOptions.HideScheduler // | TaskCreationOptions.DenyChildAttach TaskCreationOptions.LongRunning, TaskScheduler.Default ); }