private void SearchDevice(string PortName, AsyncOperation asyncOp)
        {
            SerialportChannel port = new SerialportChannel(PortName, 19200, ProtocolType.None);

            port.MinimalTimeout = this.Timeout;

            for (int i = 0; i < this.Protocols.Length && !this.SearchingStopped; i++)
            {
                port.RelkonProtocolType = this.Protocols[i];
                for (int j = 0; j < this.BaudRates.Length && !this.SearchingStopped; j++)
                {
                    port.BaudRate = this.BaudRates[j];
                    try
                    {
                        port.Open();
                        byte[] res = port.SendRequest(this.Request, this.Pattern.Length);
                        port.DiscardInBuffer();

                        if (res != null)
                        {
                            string s = Encoding.ASCII.GetString(res);

                            if (s.ToLower().Contains(this.Pattern.ToLower()) || s.ToLower().Contains(this.BootPattern.ToLower()))
                            {
                                // Устройство обнаружено
                                this.devicePort     = port;
                                this.deviceResponse = res;
                            }
                        }
                    }
                    catch { }
                    finally
                    {
                        port.Close();
                    }
                    this.ChangeProgressMethod(asyncOp);
                }
            }

            lock (this.requestingPorts)
            {
                this.requestingPorts.Remove(PortName);
                if (this.requestingPorts.Count == 0)
                {
                    if (this.devicePort != null)
                    {
                        this.CompletionMethod(this.devicePort, this.deviceResponse, null, false, asyncOp);
                    }
                    else
                    {
                        this.CompletionMethod(null, null, (this.canceled ? null : new Exception("Устройство не найдено")), this.canceled, asyncOp);
                    }
                }
            }
        }
Example #2
0
        private SerialPort _serialPort = null; // обеспечивает рабоу с COM-портом


        public SerialportChannel(SerialportChannel channel)
        {
            _serialPort         = channel.DirectPort;
            _relkonProtocolType = channel.RelkonProtocolType;
        }
 public DeviceSearchCompletedEventArgs(SerialportChannel Port, byte[] DeviceResponse, Exception e, bool canceled)
     : base(e, canceled, null)
 {
     this.Port           = Port;
     this.DeviceResponse = DeviceResponse;
 }
        }                                                   // описывает порт, к которому подключено устройство

        /// <summary>
        /// Создает новый экземпляр класса DeviceSearchCompleetedEventArgs (рекомендуется
        /// использовать при успешном завершении поиска)
        /// </summary>
        /// <param name="Port">Порт, к которому подключено устройство</param>
        /// <param name="DeviceResponse">Ответ устройства</param>
        public DeviceSearchCompletedEventArgs(SerialportChannel Port, byte[] DeviceResponse)
            : base(null, false, null)
        {
            this.Port           = Port;
            this.DeviceResponse = DeviceResponse;
        }
        /// <summary>
        /// Запускает поиск устройства
        /// </summary>
        public void StartSearch()
        {
            lock (this.requestingPorts)
            {
                if (this.requestingPorts.Count != 0)
                {
                    throw new Exception("Поиск устройства уже запущен, необходимо дождаться завершения");
                }
            }

            this.deviceResponse = null;
            this.canceled       = false;

            if (devicePort != null)
            {
                byte[] res = { };
                try
                {
                    devicePort.Open();
                    res = devicePort.SendRequest(this.Request, this.Pattern.Length);
                    if (res != null && (Encoding.ASCII.GetString(res).ToLower().Contains(this.Pattern.ToLower()) ||
                                        Encoding.ASCII.GetString(res).ToLower().Contains(this.BootPattern.ToLower())))
                    {
                        this.deviceResponse = res;
                    }
                }
                catch { }
                finally
                {
                    devicePort.Close();
                }
            }

            if (deviceResponse != null)
            {
                DeviceSearchCompletedEventArgs e = new DeviceSearchCompletedEventArgs(this.devicePort, this.deviceResponse, null, canceled);
                if (this.DeviceSearchCompleted != null)
                {
                    this.DeviceSearchCompleted(this, e);
                }
            }
            else
            {
                this.devicePort = null;
                this.progress   = 0;
                this.portsCount = 0;

                string[] portNames = SerialPort.GetPortNames();
                this.portsCount = portNames.Length;
                foreach (string portName in portNames)
                {
                    if (!this.requestingPorts.Keys.Contains(portName))
                    {
                        WorkerEventHandler workerDelegate = new WorkerEventHandler(this.SearchDevice);
                        AsyncOperation     asyncOp        = AsyncOperationManager.CreateOperation(portName);
                        this.requestingPorts.Add(portName, asyncOp);
                        workerDelegate.BeginInvoke(portName, asyncOp, null, null);
                    }
                }
            }
        }
        private void CompletionMethod(SerialportChannel port, byte[] response, Exception exception, bool canceled, AsyncOperation asyncOp)
        {
            DeviceSearchCompletedEventArgs e = new DeviceSearchCompletedEventArgs(port, response, exception, canceled);

            asyncOp.PostOperationCompleted(onCompletedDelegate, e);
        }