/// <summary> ///Блокирует порт на передачу, очищает очередь /// </summary> public void LockSerialTx() { tx_queue.Clear(); serial_locked = true; command_send_status = CommandSendStatusType.Idle; }
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; } }