IOException для последовательного порта: доступ запрещен - PullRequest
0 голосов
/ 06 октября 2019

У меня есть панель пользовательского интерфейса с некоторыми раскрывающимися списками для выбора значений для последовательного порта (имя порта, скорость передачи и т. Д.). Когда я нажимаю «Подключить», запускается следующий код, эти значения используются для инициализации изатем откройте последовательный порт. Первый раз нажимаю «Подключить» все хорошо, ошибок нет. Когда я открываю панель и снова нажимаю «Подключиться», я получаю ошибку IOException: доступ запрещен. Ошибка в этой строке:

if (sp.IsOpen == false) sp.Open ();

Я уверен, что я не пытаюсь открыть порт, который уже открыт.

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

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

Попытка закрытия всех портов перед вызовом этого метода.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using TMPro;
using System.IO;
using System.IO.Ports;

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;

    public SerialPort sp;

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

        sp = new SerialPort();

        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;

        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;
        }

        // Next open the port and activate the data recieved event handler

        Debug.Log("made it to ReaddatafromBHI");
        Debug.Log(sp.PortName);
        Debug.Log(sp.BaudRate);
        Debug.Log(sp.DataBits);
        Debug.Log(sp.StopBits);
        Debug.Log(sp.Parity);
        Debug.Log(spName + sp.IsOpen);

        sp.DataReceived += new SerialDataReceivedEventHandler(DataIn);
        if (sp.IsOpen==false) sp.Open();
    ````}

1 Ответ

0 голосов
/ 06 октября 2019

Я не уверен на 100%, так как раньше я не работал с последовательными портами, но у меня есть внутреннее чувство, что, поскольку каждый раз, когда вы создаете новый экземпляр SerialPort, он помечается как закрытый, что означает, что вы будетевсегда принимайте IsOpen как false.

Затем, когда вы пытаетесь открыть его, он уже открыт, и вы получаете эту ошибку, которая выглядит в MSDN:

The current process, or another process on the system, already has the specified COM port open either by a SerialPort instance or in unmanaged code.

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

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

...