The code below builds with no errors, the connection to the device seems to work too although I do not get any feedback from the device.
on V.S., I have placed a break point at the linemyReceivedLines = sp.ReadExisting();
and the variable myReceivedLines
comes back null.
On another similar program connecting to the same device, couple lines of feedback appear (see below), why is this variable null in my case?
Lines that appear on other program:
Connecting...
start
Printer is now online.
echo:Marlin: 1.0.0 RC2
echo: Last Updated: 2012-05-22-1 | Author: eMAKER
...etc...
Code:
//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);
}
}
}
if (connecttodevice == true)
{
DA.SetDataList(0, myReceivedLines);
}
SerialPort.ReadExisting() cannot return null, at worst you'll get an empty string. The simple explanation is that you are using myReceivedLines before any data was received. Which is very likely in this case, you are using it right after you open the port. The odds that DataReceived will fire before you use myReceivedLines are vanishing small. The code is pretty inscrutable, you'll need to substantially revise it. Just keep in mind that the serial port will receive data at an entirely unpredictable moment in time. You'll need to have your DataReceived event handler push progress.