CancelInvoke на самом деле ничего не отменяет - PullRequest
0 голосов
/ 07 октября 2019

У меня есть функция ReadDataFromBHI(), которая инициализирует последовательный порт, затем открывает его, а затем использует InvokeRepeating для чтения данных с интервалами 3 sec.

Работает нормально, проблема в том, что не остановится.

У меня есть кнопка отключения, которая вызывает ClosePorts() при нажатии. Как вы можете видеть, ClosePorts() должен CancelInvoke ReadDataContinuously и имеет логический флаг со значением false, это тоже не работает. ReadDataContinuously продолжает считывать данные и печатать в окне консоли.

Любая помощь, чтобы остановить это? Спасибо

Я попытался добавить логический флаг к методу ClosePorts() и установить для него значение false. Это не останавливает это.

Также пытались CancelInvoke() без соответствующей строки.

public class ReadPortData : MonoBehaviour       // Comes here when 'connect' is clicked, to start reading serial port data
{
    public TMP_Dropdown portName;
    public TMP_Dropdown baudRate;
    public TMP_Dropdown dataBits;
    public TMP_Dropdown stopBits;
    public TMP_Dropdown parity;

    private string spName;
    private int baud;
    private int dB;
    private int sB;
    private string pRity;
    private static bool connected;

    public SerialPort sp = new SerialPort();


    private void ReadDataFromBHI()
    {
        //   First get the values that were selected on the pnlComms dropdowns

        ClosePorts();

        spName = portName.options[portName.value].text;
        baud = int.Parse(baudRate.options[baudRate.value].text);
        dB = int.Parse(dataBits.options[dataBits.value].text);
        sB = int.Parse(stopBits.options[stopBits.value].text);
        pRity = parity.options[parity.value].text;


        sp.PortName = spName;
        sp.BaudRate = baud;
        sp.DataBits = dB;
        sp.DtrEnable = true;

        switch (sB)
        {
            case 0: sp.StopBits = StopBits.None; break;
            case 1: sp.StopBits = StopBits.One; break;
            case 2: sp.StopBits = StopBits.Two; break;
        }

        switch (pRity)
        {
            case "None": sp.Parity = Parity.None; break;
            case "Odd": sp.Parity = Parity.Odd; break;
            case "Even": sp.Parity = Parity.Even; break;
        }


        sp.Open();

        Debug.Log(spName + sp.IsOpen);

        connected = true;

        InvokeRepeating("ReadDataContinuously", 3f, 3f);
    }


    public void ClosePorts()        // Closes all the open ports
    {
        CancelInvoke("ReadDataContinuously");

        connected = false;

        string[] ports = SerialPort.GetPortNames();

        foreach (string s in ports)
        {
            if (sp.IsOpen)
            {
                sp.Close();
                Debug.Log(s + " is now closed");
            }
            else
            {
                Debug.Log(s + " is already closed");
            }
        }
    }

    public void ReadDataContinuously()
    {
        Debug.Log(connected);

        if (connected)
        {
            string buf = "";
            string s;
            string witsItem;
            string witsData;

            buf += sp.ReadExisting();

            Debug.Log(buf);
        }
    }
}

Я ожидаю, что CancelInvoke("string") или логический флаг, чтобы остановить последовательный порт от чтения данных, тоже не работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...