Почему принимаются данные из последовательного порта в ноль?
Приведенный ниже код создается без ошибок, подключение к устройству, кажется, тоже работает, хотя я не получаю никаких отзывов от устройства.
на VS я поставил точку останова на линииmyReceivedLines = sp.ReadExisting();
и переменная myReceivedLines
возвращается ноль.
В другой аналогичной программе, подключающейся к тому же устройству, появляется пара строк обратной связи (см. Ниже), почему эта переменная равна нулю в моем случае?
Строки, которые появляются в другой программе:
Connecting...
start
Printer is now online.
echo:Marlin: 1.0.0 RC2
echo: Last Updated: 2012-05-22-1 | Author: eMAKER
...etc...
Код:
//Fields
string myReceivedLines;
//subscriber method for the port.DataReceived Event
private void DataReceivedHandler(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
myReceivedLines = sp.ReadExisting();
}
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;
SerialPort 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 += new SerialDataReceivedEventHandler(DataReceivedHandler);
if (gcode == null)
{
AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Specify a valid GCode");
return;
}
if (connecttodevice == true)
{
DA.SetDataList(0, myReceivedLines);
}
else
{
port.Close();
}
if (sendtoprint == true)
{
foreach (String s in gcode)
{
port.WriteLine(s);
}
}
}
1 ответ
if (connecttodevice == true)
{
DA.SetDataList(0, myReceivedLines);
}
SerialPort.ReadExisting() не может вернуть ноль, в худшем случае вы получите пустую строку. Простое объяснение состоит в том, что вы используете myReceivedLines до получения каких-либо данных. Что очень вероятно в этом случае, вы используете его сразу после открытия порта. Шансы на то, что DataReceived сработает до того, как вы используете myReceivedLines, становятся ничтожно малыми. Код довольно непостижим, вам нужно существенно его пересмотреть. Просто имейте в виду, что последовательный порт будет получать данные в совершенно непредсказуемый момент времени. Вам нужно, чтобы ваш обработчик событий DataReceived выдвигал ход выполнения.