У меня есть функция 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")
или логический флаг, чтобы остановить последовательный порт от чтения данных, тоже не работает.