public static void Read() { byte[] buffer = new byte[16]; Action kickoffRead = null; Action reconnect = null; Action next = kickoffRead; reconnect = delegate { // if (_serialPort == null || !_serialPort.IsOpen) { Debug.Log("Attempting to reconnect to port " + "COM8"); // faking the reconnection status indication. _serialPortStatus = SerialPortStatus.Reconnecting; Thread.Sleep(400); if (Connect("COM8")) { Debug.Log("We decided we are connected?"); next = kickoffRead; } else { Thread.Sleep(2600); next = reconnect; } // } if (_alive) { next(); } }; kickoffRead = delegate { _serialPort.BaseStream.BeginRead(buffer, 0, buffer.Length, delegate(IAsyncResult ar) { try { int actualLength = _serialPort.BaseStream.EndRead(ar); byte[] received = new byte[actualLength]; Buffer.BlockCopy(buffer, 0, received, 0, actualLength); splitter.OnIncomingBinaryBlock(received); next = kickoffRead; } catch (IOException exc) { Debug.Log("Serial read fail: " + exc.ToString()); next = reconnect; } catch (InvalidOperationException exc) { Debug.Log("Serial read fail: " + exc.ToString()); next = reconnect; } if (_alive) { next(); } }, null); }; reconnect(); }
/// <summary> /// Called when any data bytes are received over the serial port. /// </summary> /// <remarks> /// This method calls the message parser class, which will call the /// MessageReceived delegate in this class. /// </remarks> /// <param name="sender"></param> /// <param name="e"></param> void DataReceived(object sender, SerialDataReceivedEventArgs e) { int dataLength = _serialPort.BytesToRead; byte[] data = new byte[dataLength]; int nbrDataRead = _serialPort.Read(data, 0, dataLength); if (nbrDataRead != 0) { lineSplitter.OnIncomingBinaryBlock(data); } }
public void DetectorTestTwoLinesArrivingTogether() { // Create a list to hold data packets. List <byte[]> result_lines = new List <byte[]>(); // Create a line splitter object. LineSplitter lineSplitter = new LineSplitter(); // When a new data packet is received, add it to the list of data packets. lineSplitter.LineReceived += result_lines.Add; // Send an array of bytes into the splitter. lineSplitter.OnIncomingBinaryBlock(new byte[] { 0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x72, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x21, 0x0D, 0x0A, 0x53, 0x70, 0x61, 0x72, 0x78, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x65, 0x73, 0x74, 0x2E, 0x0D, 0x0A }); // Check that the line splitter correctly found two lines. Assert.AreEqual(2, result_lines.Count); }