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