Подключение к последовательному порту — работает только с точками останова

#c# #serial-port

#c# #последовательный порт

Вопрос:

Проблема

У меня есть подключение к последовательному порту, используемое для управления лампой.

Проблема, с которой я сталкиваюсь, заключается в том, что, похоже, она работает так часто, но работает стабильно в режиме отладки, когда я запускаю точки останова.

Что я пробовал

Я попытался добавить задержки, чтобы разрешить подключение после инициализации порта

 await Task.Delay(model.TimeIntervel);
 

Код

  public async Task<ActionResult> RunExperiment(ExperimentViewModel model)
    {

        if (model.Intensity > 250)
        {
            TempData["BadMsg"] = "Intensity value is out of range. Please try again with a value between 0 W/m2 and 250 W/m2";
            return RedirectToAction("Index");

        }
        if (model.TimeIntervel <= 0)
        {
            TempData["BadMsg"] = "Time interval value is out of range. Please try again with a value >0 in ms";
            return RedirectToAction("Index");

        }

        if (model.TimeIntervel <= 0 amp;amp; model.Intensity > 250)
        {
            TempData["BadMsg"] = "Time interval value is out of range. Please try again with a value >0 in ms. Intensity value is out of range. Please try again with a value between 0 W/m2 and 250 W/m2";
            return RedirectToAction("Index");

        }
        #region Port Set Up
        //Set up the port 
        SerialPort port = new SerialPort("COM3", 57600, (Parity)0, 8, (StopBits)1);
        //Set Flow Control to none
        port.Handshake = Handshake.None;
        //Open Port
        port.Open();
        #endregion

        if (model.AllLamps == true)
        {

            //Set Logic From Form
            port.Write("gintensity "   model.Intensity   " r");
            port.Write("genable r");

            //Set Time Delay
            await Task.Delay(model.TimeIntervel);

            //Turn Off Lamp/Lamps
            port.Write("gdisable r");
        }
        else {

            //Set Logic From Form for individual lamp
            port.Write("w " model.LampID "m1 "   model.Intensity   " r");
            port.Write("w " model.LampID "m1 enable r");

            //Set Time Delay
            await Task.Delay(model.TimeIntervel);

            //Turn Off all Lamp/Lamps
            port.Write("gdisable r");

        }

      

        //Close Port
        port.Close();

        //Successful Experiment Message
        TempData["GoodMsg"] = "Experiment Ran Successfully";

        //Return to Form
        return RedirectToAction("Index");
    }
 

Комментарии:

1. Где вам нужно поставить точку останова, чтобы она работала? Как вызывается этот метод, т.Е. Что происходит после этого?

2. «кажется, работает» — итак, я прочитал это как «делает то, что он должен делать». Но что он должен делать? Что вы ожидаете от этого кода, который вы видите или не видите?

3. Добавление задержек в код последовательного порта не имеет смысла. Это создает больше проблем. Вы всегда должны использовать Asyn Read для последовательного порта, потому что библиотека окон имеет ненадежные таймеры. Многие люди пытаются добавить таймеры и использовать метод синхронного чтения, но я никогда не находил, что это работает на 100%.

4. @Fildor извиняюсь, я впервые использую последовательное соединение, поэтому мне не хватает знаний. Я хочу ввести данные пользователя для интенсивности лампы и временного интервала, а затем записать команды на лампу через последовательный порт, чтобы лампа включалась с такой интенсивностью в течение этого периода времени.

5. Вы опубликовали только код клиента. Как выглядит серверный код?