private async Task ReadDataAsync(SerialPort serialPort) { var buffer = new byte[4096]; Task <int> readStringTask = serialPort.BaseStream.ReadAsync(buffer, 0, 4096); var bytesRead = await readStringTask; _rawData += Encoding.ASCII.GetString(buffer, 0, bytesRead); // Check if a newline has received, indicating that a complete message should have read var lastIndexOfPrintln = _rawData.LastIndexOf("\r\n", StringComparison.Ordinal); if (lastIndexOfPrintln == -1) { return; } var completeMessages = _rawData.Substring(0, lastIndexOfPrintln); _rawData = _rawData.Remove(0, lastIndexOfPrintln); // Split message if more than one have been received var messages = completeMessages.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries); foreach (var message in messages) { _nrf24State.CountOfReceivedMessages++; SendRawMessage(message); // Every message has three parts splitted by a space // - record length & message type // - serial header // - packet data var parts = message.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries); if (parts.Count() != 3) { continue; } var nrf24Structure = new NRF24Structure { DateTime = DateTime.Now, TypeAndLength = parts[0], Header = parts[1], Data = parts[2] }; // Create the NRF24Header part nrf24Structure.NRF24Header = NRF24Hub.CreateNRF24Header(nrf24Structure); // Create the NRF24Data part nrf24Structure.NRF24Data = CreateNRF24Data(nrf24Structure); SendObject(nrf24Structure); } }
public NRF24Controller( IConnectionManager connectionManager, IOptions<GeneralSettings> generalSettings, NRF24State nrf24State, VeraSettings veraSettings) { // Make sure the serial capture process is only running once if (nrf24State.Started) return; nrf24State.Started = true; var hub = new NRF24Hub(connectionManager, generalSettings.Value, nrf24State, veraSettings); new Thread(() => { Thread.CurrentThread.IsBackground = true; hub.StartSerialClient(); }).Start(); }