SerialPort.ReadExisting Метод не отображает полученные данные

Следующий код создается без ошибок, но когда я запускаю программу, полученные данные не отображаются в выводе. Когда я ставлю точку останова на myReceivedLines = port.ReadExisting(); Я получил:

System.InvalidOperationException,

В самой программе после перезагрузки компьютера написано:

Access to COM5 is denied

Что я могу сделать, чтобы это исправить?

Код:

//Fields
SerialPort port;
string myReceivedLines;

   protected override void SolveInstance(IGH_DataAccess DA)
  {

    List<string> gcode = new List<string>();
    DA.GetDataList(0, gcode);
    string selectedportname = default(string);
    DA.GetData(1, ref selectedportname);
    int selectedbaudrate = default(int);
    DA.GetData(2, ref selectedbaudrate);
    bool connecttodevice=default(bool);
    DA.GetData(3, ref connecttodevice);
    bool sendtoprint= default(bool);
    DA.GetData(4, ref sendtoprint);


    if (!DA.GetDataList(0, gcode)) return;
    if (!DA.GetData(1, ref selectedportname)) return;
    if (!DA.GetData(2, ref selectedbaudrate)) return;
    if (!DA.GetData(3, ref connecttodevice)) return;
    if (!DA.GetData(4, ref sendtoprint)) return;


    port = new SerialPort(selectedportname, selectedbaudrate, Parity.None, 8, StopBits.One); //Create the serial port
    port.DtrEnable = true;   //enables the Data Terminal Ready (DTR) signal during serial communication (Handshaking)
    port.Open();             //Open the port
    port.DataReceived += this.portdatareceived;


    if (gcode == null)
    {
        AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Specify a valid GCode");
        return;
    }

    if (connecttodevice == true)
    {
        DA.SetDataList(0, myReceivedLines);
    }

        if (sendtoprint == true)
        {
            foreach (String s in gcode)
            {
                port.WriteLine(s);
            }
        }

              }


    //subscriber method for the port.DataReceived Event
    private void portdatareceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {
            myReceivedLines = port.ReadExisting();
    }

1 ответ

Решение

Событие DataReceived в SerialPort работает в потоке, отличном от потока пользовательского интерфейса. Вам нужно будет сделать что-то похожее на страницу MSDN для события DataReceived. Причина, по которой вы получаете ошибку "Отказано в доступе", заключается в том, что порт все еще открыт, перезагрузите компьютер, чтобы корректно перезапустить программу.

т.е. сверху ссылка

private static void DataReceivedHandler( object sender, SerialDataReceivedEventArgs e)
{
    SerialPort sp = (SerialPort)sender;
    string indata = sp.ReadExisting();
}
Другие вопросы по тегам