首页 > 解决方案 > CancelInvoke 实际上并没有取消任何东西

问题描述

我有一个函数ReadDataFromBHI()可以初始化一个串行端口然后打开它,然后用于每隔一段时间InvokeRepeating读取数据。3 sec

它工作正常,问题是它不会停止。

我有一个断开连接按钮,单击时会调用ClosePorts()。正如您所看到的,ClosePorts()应该有一个设置为 false 的布尔标志,这也不起作用。继续读取数据并打印到控制台窗口。CancelInvokeReadDataContinuouslyReadDataContinuously

有什么帮助让它停止吗?谢谢

我尝试在该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")or 布尔标志可以阻止串行端口读取数据,但两者都不起作用。

标签: c#unity3d

解决方案


推荐阅读