示例#1
0
///////////////////////////////////////////////////////////////////////////////////////////////////////////
        //private void port_DataReceived_1(object sender, SerialDataReceivedEventArgs e)
        //{

        //    //if (!ComPort.IsOpen) return;
        //    // int bytes = ComPort.BytesToRead;
        //    int bytes_rs = ComPort.ReadByte();


        //    //InputData = ComPort.ReadExisting();
        //    //if (bytes_rs != null)
        //    //{
        //    this.BeginInvoke(new SetTextCallback(SetText), new object[] { bytes_rs });
        //    //}
        //}
        //private void SetText(int buffer)
        //{

        //    string s2 = buffer.ToString();


        //    //rtbIncoming.Clear();
        //    rtbIncoming.AppendText(s2);
        //    rtbIncoming.AppendText("-");

        //    //    //this.rtbIncoming.Text += text;
        //    //    byte[] uart_data_byte = Encoding.UTF8.GetBytes(text);
        //    //    BitArray b = new BitArray(uart_data_byte);


        //    //    var sb = new StringBuilder();

        //    //    for (int i = 0; i < b.Count; i++)
        //    //    {
        //    //        char c = b[i] ? '1' : '0';
        //    //        sb.Append(c);
        //    //    }

        //    //    string s2 = sb.ToString();

        //    //    rtbIncoming.Clear();
        //    //    rtbIncoming.AppendText(s2);
        //}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////
        //private void port_DataReceived_1(object sender, SerialDataReceivedEventArgs e)
        //{
        //    InputData = ComPort.ReadExisting();
        //    if (InputData != String.Empty)
        //    {
        //        this.BeginInvoke(new SetTextCallback(SetText), new object[] { InputData });
        //    }
        //}
        //private void SetText(string text)
        //{
        //    byte[] uart_data_byte = Encoding.UTF8.GetBytes(text);

        //    BitArray b = new BitArray(uart_data_byte);


        //    var sb = new StringBuilder();

        //    for (int i = 0; i < b.Count; i++)
        //    {
        //        char c = b[i] ? '1' : '0';
        //        sb.Append(c);
        //    }

        //    string s2 = sb.ToString();

        //    rtbIncoming.Clear();
        //    rtbIncoming.AppendText(s2);
        //}

        internal void PinChanged(object sender, SerialPinChangedEventArgs e)
        {
            SerialPinChange SerialPinChange1 = 0;
            bool            signalState      = false;

            SerialPinChange1 = e.EventType;
            switch (SerialPinChange1)
            {
            case SerialPinChange.Break:
                //MessageBox.Show("Break is Set");
                break;

            case SerialPinChange.CDChanged:
                signalState = ComPort.CtsHolding;
                //  MessageBox.Show("CD = " + signalState.ToString());
                break;

            case SerialPinChange.CtsChanged:
                signalState = ComPort.CDHolding;
                //MessageBox.Show("CTS = " + signalState.ToString());
                break;

            case SerialPinChange.DsrChanged:
                signalState = ComPort.DsrHolding;
                // MessageBox.Show("DSR = " + signalState.ToString());
                break;

            case SerialPinChange.Ring:
                //MessageBox.Show("Ring Detected");
                break;
            }
        }
        private static SerialPinChange SignalsToPinChanges(Signals signals)
        {
            SerialPinChange pinChanges = default;

            if (signals.HasFlag(Signals.SignalCts))
            {
                pinChanges |= SerialPinChange.CtsChanged;
            }

            if (signals.HasFlag(Signals.SignalDsr))
            {
                pinChanges |= SerialPinChange.DsrChanged;
            }

            if (signals.HasFlag(Signals.SignalDcd))
            {
                pinChanges |= SerialPinChange.CDChanged;
            }

            if (signals.HasFlag(Signals.SignalRng))
            {
                pinChanges |= SerialPinChange.Ring;
            }

            return(pinChanges);
        }
示例#3
0
 /// <summary>
 /// Respond to a pin change detection on the port.
 /// </summary>
 /// <param name="change">The pin that changed.</param>
 private void PortPinChanged(SerialPinChange change)
 {
     if (this.port.IsOpen && this.PinChanged != null)
     {
         this.PinChanged(change);
     }
 }
示例#4
0
        private void OnPortPinChanged(object sender, SerialPinChange pinChange)
        // ReSharper restore UnusedParameter.Local
        {
            switch (pinChange)
            {
            case SerialPinChange.Break:
                Log.Info("break received! => might be ZAE reset");
                break;

            case SerialPinChange.CDChanged:
                Log.Info("CDChanged received!");
                break;

            case SerialPinChange.CtsChanged:
                Log.Info("CtsChanged received!");
                break;

            case SerialPinChange.DsrChanged:
                // ignore
                // log.Info("DsrChanged received!");
                break;

            case SerialPinChange.Ring:
#if DEBUG
                // Ring Indicator (RI), pin 9, is not connected for the Transliner
                // Ringbus cable
                // ==> no need to track or to display
                Log.Info("Ring received!");
#endif
                break;
            } // switch
        }     // OnPortPinChanged()
示例#5
0
        private void PinChangeThread()
        {
            while (m_MonitorPins)
            {
                if (m_StopRunning.WaitOne(0))
                {
                    m_MonitorPins = false;
                    continue;
                }

                if (Log.SerialTrace(System.Diagnostics.TraceEventType.Verbose))
                {
                    Log.Serial.TraceEvent(System.Diagnostics.TraceEventType.Verbose, 0,
                                          "{0}: PinChangeThread: Waiting", m_Name);
                }
                WaitForModemEvent mevent = m_Dll.serial_waitformodemevent(m_Handle, c_ModemEvents);
                if (mevent == WaitForModemEvent.Error)
                {
                    if (Log.SerialTrace(System.Diagnostics.TraceEventType.Error))
                    {
                        Log.Serial.TraceEvent(System.Diagnostics.TraceEventType.Error, 0,
                                              "{0}: PinChangeThread: Error aborting event; errno={1}; description={2}",
                                              m_Name, m_Dll.errno, m_Dll.serial_error(m_Handle));
                    }
                    m_MonitorPins = false;
                    return;
                }

                if (mevent != WaitForModemEvent.None)
                {
                    SerialPinChange pins = SerialPinChange.NoChange;
                    if ((mevent & WaitForModemEvent.ClearToSend) != 0)
                    {
                        pins |= SerialPinChange.CtsChanged;
                    }
                    if ((mevent & WaitForModemEvent.DataCarrierDetect) != 0)
                    {
                        pins |= SerialPinChange.CDChanged;
                    }
                    if ((mevent & WaitForModemEvent.DataSetReady) != 0)
                    {
                        pins |= SerialPinChange.DsrChanged;
                    }
                    if ((mevent & WaitForModemEvent.RingIndicator) != 0)
                    {
                        pins |= SerialPinChange.Ring;
                    }
                    // TODO: Break not implemented

                    if (Log.SerialTrace(System.Diagnostics.TraceEventType.Verbose))
                    {
                        Log.Serial.TraceEvent(System.Diagnostics.TraceEventType.Verbose, 0,
                                              "{0}: PinChangeThread: Event Received: {1}", m_Name, mevent);
                    }
                    OnPinChanged(this, new SerialPinChangedEventArgs(pins));
                }
            }
        }
 private void RaisePinChanged(SerialPinChange pinChanged)
 {
     if (_pinChanged != null)
     {
         ThreadPool.QueueUserWorkItem(s => {
             var thisRef = (SerialStream)s;
             thisRef._pinChanged?.Invoke(thisRef, new SerialPinChangedEventArgs(pinChanged));
         }, this);
     }
 }
示例#7
0
        private void CommOverlappedIo_CommEvent(object sender, CommEventArgs e)
        {
            SerialData dataFlags = (SerialData)(e.EventType & c_DataFlags);

            if (dataFlags != 0)
            {
                OnDataReceived(this, new SerialDataReceivedEventArgs(dataFlags));
            }

            SerialPinChange pinFlags = (SerialPinChange)(e.EventType & c_PinFlags);

            if (pinFlags != 0)
            {
                OnPinChanged(this, new SerialPinChangedEventArgs(pinFlags));
            }
        }
示例#8
0
        public SyncFotoManager(SerialPort syncPort, SerialPinChange inputPin)
        {
            try
            {
                this.inputPin             = inputPin;
                this.syncPort             = syncPort;
                this.syncPort.PinChanged += new SerialPinChangedEventHandler(PlcMacchinaInputChanged);

                syncInpuntTimer          = new System.Timers.Timer();
                syncInpuntTimer.Interval = 10;
                syncInpuntTimer.Elapsed += new System.Timers.ElapsedEventHandler(syncInpuntTimer_Tick);
            }
            catch (Exception)
            {
                throw;
            }
        }
示例#9
0
        internal void PinChanged(object sender, SerialPinChangedEventArgs e)
        {
            SerialPinChange SerialPinChange1 = 0;
            bool            signalState      = false;

            SerialPinChange1         = e.EventType;
            lblCTSStatus.BackColor   = Color.Green;
            lblDSRStatus.BackColor   = Color.Green;
            lblRIStatus.BackColor    = Color.Green;
            lblBreakStatus.BackColor = Color.Green;
            switch (SerialPinChange1)
            {
            case SerialPinChange.Break:
                lblBreakStatus.BackColor = Color.Red;
                MessageBox.Show("Break is Set");
                break;

            case SerialPinChange.CDChanged:
                signalState = ComPort.CtsHolding;
                MessageBox.Show("CD = " + signalState.ToString());
                break;

            case SerialPinChange.CtsChanged:
                signalState            = ComPort.CDHolding;
                lblCTSStatus.BackColor = Color.Red;
                MessageBox.Show("CTS = " + signalState.ToString());
                break;

            case SerialPinChange.DsrChanged:
                signalState            = ComPort.DsrHolding;
                lblDSRStatus.BackColor = Color.Red;
                MessageBox.Show("DSR = " + signalState.ToString());
                break;

            case SerialPinChange.Ring:
                lblRIStatus.BackColor = Color.Red;
                MessageBox.Show("Ring Detected");
                break;
            }
        }
示例#10
0
        // Since we can not garantee the order or the exact time that the event handler is called
        // We will look for an event that was fired that matches the type and that bytesToRead
        // is greater then the parameter
        public bool Validate(SerialPinChange eventType, int bytesToRead)
        {
            bool retValue = false;

            lock (this)
            {
                for (int i = 0; i < EventType.Count; i++)
                {
                    if (eventType == (SerialPinChange)EventType[i] && bytesToRead <= (int)BytesToRead[i] && (SerialPort)Source[i] == _com)
                    {
                        EventType.RemoveAt(i);
                        BytesToRead.RemoveAt(i);
                        Source.RemoveAt(i);

                        NumEventsHandled--;
                        retValue = true;

                        break;
                    }
                }
            }

            return(retValue);
        }
 internal SerialPinChangedEventArgs(SerialPinChange eventType)
 {
     this.eventType = eventType;
 }
示例#12
0
 /// <summary>
 /// Event on serial port "pin was changed"
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="pinsStatesChange"></param>    
 static void port_PinChanged(object sender, SerialPinChange pinsStatesChange)
 {
示例#13
0
        private void IOLoop()
        {
            bool eofReceived = false;
            // we do not care about bytes we got before - only about changes
            // loop just got started which means we just got request
            bool lastIsIdle           = false;
            int  ticksWhenIdleStarted = 0;

            Signals lastSignals = _pinChanged != null?Interop.Termios.TermiosGetAllSignals(_handle) : Signals.Error;

            bool IsNoEventRegistered() => _dataReceived == null && _pinChanged == null;

            while (IsOpen && !eofReceived && !_ioLoopFinished)
            {
                bool hasPendingReads  = !_readQueue.IsEmpty;
                bool hasPendingWrites = !_writeQueue.IsEmpty;

                bool hasPendingIO = hasPendingReads || hasPendingWrites;
                bool isIdle       = IsNoEventRegistered() && !hasPendingIO;

                if (!hasPendingIO)
                {
                    if (isIdle)
                    {
                        if (!lastIsIdle)
                        {
                            // we've just started idling
                            ticksWhenIdleStarted = Environment.TickCount;
                        }
                        else if (Environment.TickCount - ticksWhenIdleStarted > IOLoopIdleTimeout)
                        {
                            // we are already idling for a while
                            // let's stop the loop until there is some work to do

                            lock (_ioLoopLock)
                            {
                                // double check we are done under lock
                                if (IsNoEventRegistered() && _readQueue.IsEmpty && _writeQueue.IsEmpty)
                                {
                                    _ioLoop = null;
                                    break;
                                }
                                else
                                {
                                    // to make sure timer restarts
                                    lastIsIdle = false;
                                    continue;
                                }
                            }
                        }
                    }

                    Thread.Sleep(1);
                }
                else
                {
                    Interop.PollEvents events = PollEvents(1,
                                                           pollReadEvents: hasPendingReads,
                                                           pollWriteEvents: hasPendingWrites,
                                                           out Interop.ErrorInfo? error);

                    if (error.HasValue)
                    {
                        FinishPendingIORequests(error);
                        break;
                    }

                    if (events.HasFlag(Interop.PollEvents.POLLNVAL) ||
                        events.HasFlag(Interop.PollEvents.POLLERR))
                    {
                        // bad descriptor or some other error we can't handle
                        FinishPendingIORequests();
                        break;
                    }

                    if (events.HasFlag(Interop.PollEvents.POLLIN))
                    {
                        int bytesRead = DoIORequest(_readQueue, _processReadDelegate);
                        _totalBytesRead += bytesRead;
                    }

                    if (events.HasFlag(Interop.PollEvents.POLLOUT))
                    {
                        DoIORequest(_writeQueue, _processWriteDelegate);
                    }
                }

                // check if there is any new data (either already read or in the driver input)
                // this event is private and handled inside of SerialPort
                // which then throttles it with the threshold
                long totalBytesAvailable = TotalBytesAvailable;
                if (totalBytesAvailable > _lastTotalBytesAvailable)
                {
                    _lastTotalBytesAvailable = totalBytesAvailable;
                    RaiseDataReceivedChars();
                }

                if (_pinChanged != null)
                {
                    // Checking for changes could technically speaking be done by waiting with ioctl+TIOCMIWAIT
                    // This would require spinning new thread and also would potentially trigger events when
                    // user didn't have time to respond.
                    // Diffing seems like a better solution.
                    Signals current = Interop.Termios.TermiosGetAllSignals(_handle);

                    // There is no really good action we can take when this errors so just ignore
                    // a sinle event.
                    if (current != Signals.Error && lastSignals != Signals.Error)
                    {
                        Signals changed = current ^ lastSignals;
                        if (changed != Signals.None)
                        {
                            SerialPinChange pinChanged = SignalsToPinChanges(changed);
                            RaisePinChanged(pinChanged);
                        }
                    }

                    lastSignals = current;
                }

                lastIsIdle = isIdle;
            }
        }
示例#14
0
 internal SerialPinChangedEventArgs(SerialPinChange eventCode)
 {
     mPinChanged = eventCode;
 }
		internal SerialPinChangedEventArgs(SerialPinChange eventCode){
			mPinChanged = eventCode;
		}
示例#16
0
 internal SerialPinChangedEventArgs(SerialPinChange eventCode)
 {
     EventType = eventCode;
 }
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="eventType">Event that occurred</param>
 public SerialPinChangedEventArgs(SerialPinChange eventType)
 {
     m_EventType = eventType;
 }
		internal SerialPinChangedEventArgs (SerialPinChange eventType)
		{
			this.eventType = eventType;
		}
示例#19
0
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="eventType">Event that occurred</param>
 public SerialPinChangedEventArgs(SerialPinChange eventType)
 {
     m_EventType = eventType;
 }