Ejemplo n.º 1
0
 /// <summary>
 ///Блокирует порт на передачу, очищает очередь
 /// </summary>
 public void LockSerialTx()
 {
     tx_queue.Clear();
     serial_locked       = true;
     command_send_status = CommandSendStatusType.Idle;
 }
Ejemplo n.º 2
0
        void DoWork(object sender, DoWorkEventArgs e)        //бесконечный цикл - связан с автоматической отправкой команд
        {
            long time_from_data_send = 0;
            long time_command_send   = 0;   //время отправки команды
            int  request_cnt         = 0;   //количество попыток

            try
            {
                while (workAllowed)
                {
                    //сюда попадает, когда принят ответ или истек таймаут
                    if (slow_mode == false)
                    {
                    }
                    else
                    {
                        System.Threading.Thread.Sleep(300);                        //slow mode - delay
                    }

                    if (tx_queue.Count > 0)                       //есть ли данные в очереди
                    {
                        request_cnt = 0;                          //количество попыток
                        string queueElement = tx_queue.Dequeue(); //извлекаем из очереди
                        command_send_status = CommandSendStatusType.Prosessing;

                        if (String.IsNullOrEmpty(queueElement))                   //в очередь попал пустой элемент
                        {
                            request_cnt     = max_repeat + 1;                     //попыток передачи не будет
                            answer_received = -1;                                 //ниже выставиться CommandSendStatusType.ErrorReceived;
                        }
                        else                                                      //можно передавать команду
                        {
                            while (request_cnt <= (max_repeat - 1))               //0 тоже считется
                            {
                                int send_res = send_data_to_serial(queueElement); //физически отправляем данные в порт
                                if (send_res == -1)                               //при ошибке произошла ошибка
                                {
                                    var copy = SerialFailSignal;
                                    if (copy != null)
                                    {
                                        copy(false);                                                 //вызываем callback SerialFailSignal
                                    }
                                }

                                time_command_send   = (DateTime.Now.Ticks / 10000);
                                time_from_data_send = 0;

                                while ((answer_received == 0) && (time_from_data_send < command_timeout) && (serial_locked == false))                                // ожидаем приема данных или таймаута
                                {
                                    System.Threading.Thread.Sleep(20);
                                    time_from_data_send = (DateTime.Now.Ticks / 10000) - time_command_send;                                    //столько времени прошло от последней отправки команды
                                }

                                if (serial_locked == true)
                                {
                                    request_cnt = max_repeat + 1;
                                }                                                                                       //повторных попыток не будет
                                else if (answer_received == 1)
                                {
                                    request_cnt = max_repeat + 1;
                                }                                                                                           //повторных попыток не будет

                                request_cnt++;
                            }                            //while - request_cnt
                        }

                        //попытки запроса закончились - определяем окончательный результат выполнения
                        if (serial_locked == true)
                        {
                            command_send_status = CommandSendStatusType.Idle;
                        }
                        else if (time_from_data_send >= command_timeout)
                        {
                            command_send_status = CommandSendStatusType.Timeout;
                        }
                        else if (answer_received < 0)
                        {
                            command_send_status = CommandSendStatusType.ErrorReceived;
                        }
                        else
                        {
                            command_send_status = CommandSendStatusType.CommandOK;
                        }
                    }            //end if
                }                //while(true)
            }
            catch (Exception ex)
            {
                e.Result = ex.Message;
                return;

                throw;
            }
        }