public void Open() { port.Open(); foreach (var thread in threads) { thread.Start(); } started = true; }
static void Main(string[] args) { if (args.Length < 1) { Console.WriteLine("Write the portName as argument."); return; } Console.WriteLine("Starting on port " + args[0]); var serialPort = new RJCP.IO.Ports.SerialPortStream(args[0]) { BaudRate = 19200, DataBits = 8, StopBits = StopBits.One, Parity = Parity.None, ReadTimeout = 1000, WriteTimeout = 500, Handshake = Handshake.None }; if (!serialPort.IsOpen) { Console.WriteLine("Opening port."); serialPort.Open(); } Console.WriteLine("Press ESCAPE to read a line."); Console.WriteLine("Otherwise, type and perss enter to send a message."); Console.WriteLine("Type exit to quit."); var buffer = new StringBuilder(); do { var key = Console.ReadKey(); if (key.Key == ConsoleKey.Escape) { string read = null; try { read = serialPort.ReadLine(); } catch (TimeoutException) { read = "TIMEOUT"; } Console.WriteLine("R> " + read); } else if (key.Key == ConsoleKey.Enter) { var final = buffer.ToString(); if (final.ToUpper() == "EXIT") { break; } serialPort.WriteLine(final); Console.WriteLine(""); buffer.Clear(); } else { buffer.Append(key.KeyChar); } } while (true); serialPort.Close(); Console.WriteLine("Ending"); }
private static IObservable <T> CreateListener <T>(string portName, BaudRate baudRate, Parity parity, int dataBits, StopBits stopBits, Encoding encoding, int bufferSize, Func <RJCPIO.SerialPortStream, T[], Task <int> > readFromPort) { if (string.IsNullOrEmpty(portName)) { throw new ArgumentNullException("portName"); } if (encoding == null) { throw new ArgumentNullException("encoding"); } if (bufferSize < 1) { throw new ArgumentOutOfRangeException("bufferSize", bufferSize, string.Empty); } var buffer = new T[bufferSize]; return(Observable.Using( () => { RJCPIO.Parity rjcpParity; switch (parity) { case Parity.Even: rjcpParity = RJCPIO.Parity.Even; break; case Parity.Mark: rjcpParity = RJCPIO.Parity.Mark; break; case Parity.None: rjcpParity = RJCPIO.Parity.None; break; case Parity.Odd: rjcpParity = RJCPIO.Parity.Odd; break; case Parity.Space: rjcpParity = RJCPIO.Parity.Space; break; default: throw new NotSupportedException(string.Format("'{0}' is not supported.", parity)); } RJCPIO.StopBits rjcpStopBits; switch (stopBits) { case StopBits.One: rjcpStopBits = RJCPIO.StopBits.One; break; case StopBits.OnePointFive: rjcpStopBits = RJCPIO.StopBits.One5; break; case StopBits.Two: rjcpStopBits = RJCPIO.StopBits.Two; break; default: throw new NotSupportedException(string.Format("'{0}' is not supported.", stopBits)); } var port = new RJCPIO.SerialPortStream(portName, (int)baudRate, dataBits, rjcpParity, rjcpStopBits) { NewLine = "\r\n", Encoding = encoding }; port.Open(); return port; }, port => { int?count = null; return Observable.While(() => port.IsOpen && (count == null || count > 0), Observable.Defer( async() => { try { count = await readFromPort(port, buffer).ConfigureAwait(false); if (count <= 0) { return Notification.CreateOnCompleted <T>().ToObservable(); } else { var received = new T[count.Value]; Array.Copy(buffer, 0, received, 0, count.Value); return received.ToObservable(); } } catch (Exception ex) { return Notification.CreateOnError <T>(ex).ToObservable(); } })); })); }
private bool DeviceAction(Action<SerialPortStream, CancellationToken> action) { CancellationToken token = new CancellationToken(); DateTime start = DateTime.Now; var task = Task.Factory.StartNew(() => { try { if (serialPort == null || !serialPort.IsOpen) { if (serialPort != null && serialPort.IsOpen) { performClose(); } serialPort = new SerialPortStream(this.portName); serialPort.Open(); Start(serialPort); } // discard the input buffer after if (serialPort.ReadBufferSize > 0) { try { serialPort.DiscardInBuffer(); } catch (Exception exp) { logger.Warn(exp, "Failed to clear in buffer for NTI XL2 on port {0}", portName); } } if (serialPort.WriteBufferSize > 0) { try { serialPort.DiscardOutBuffer(); } catch (Exception exp) { logger.Warn(exp, "Failed to clear in buffer for NTI XL2 on port {0}", portName); } } action(serialPort, token); OnConnectionStatus(true); } catch (Exception exp) { OnConnectionStatus(false); logger.Error(exp, "Failed to execute NTI XL2 action on port {0}.", portName); performClose(); return false; } return true; }, token); if (!task.Wait(this.TimeToTimeOut, token)) { timeouts++; logger.Error("NTI XL2 device communication timed out after {0} ms.", (DateTime.Now - start).TotalMilliseconds); OnConnectionStatus(false); token = new CancellationToken(); if (timeouts >= 2) { timeouts = 0; var closeTask = Task.Factory.StartNew(() => { performClose(true); }, token); if (!closeTask.Wait(this.TimeToTimeOut, token)) { logger.Trace("Time out trying to close the connection after a time out."); } } return false; } return task.Result; }