附加订阅者方法中收到的字符串?



在下面的代码中,myReceivedLines中收到的字符串在连接我的串行端口时出现(当connecttodevice为真时)。但是,当我启动另一个命令时(当homeall为真时),它们会消失。

我在类中添加了名为myReceivedLines的字段,以便我可以将该方法String.Add()到收到的所有反馈和发送的命令(就像程序中的控制台一样)。

为什么发送命令时反馈会消失,如何确保所有字符串都保留在变量myReceivedLines中?字符串是否会因为发生在订阅者方法中而myReceivedLine消失?我该如何解决这个问题?

注意:GH_DataAccess.SetDataList(Int32,IEnumerable)是内核中的一种方法,称为Grasshopper的软件,用于为输出分配值(它必须在GH_Component.SolveInstance()方法中使用,该方法也来自这个内核),我正在使用它来可视化myReceivedLines。

法典:

public class SendToPrintComponent : GH_Component
{
//Fields
List<string> myReceivedLines = new List<string>();
SerialPort port;
//subscriber method for the port.DataReceived Event
private void DataReceivedHandler(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
while (sp.BytesToRead > 0)
{
try
{
myReceivedLines.Add(sp.ReadLine());
}
catch (TimeoutException)
{
break;
}
}
}
protected override void SolveInstance(IGH_DataAccess DA)
{
//Opening the port
if (port == null)
{
string selectedportname = default(string);
DA.GetData(1, ref selectedportname);
int selectedbaudrate = default(int);
DA.GetData(2, ref selectedbaudrate);

//Assigning an object to the field within the SolveInstance method()
port = new SerialPort(selectedportname, selectedbaudrate, Parity.None, 8, StopBits.One);
//Enables the data terminal ready (dtr) signal during serial communication (handshaking)
port.DtrEnable = true;
port.WriteTimeout = 500;
port.ReadTimeout = 500;
}
//Event Handling Method
bool connecttodevice = default(bool);
DA.GetData(3, ref connecttodevice);
**if (connecttodevice == true)**
{
if (!port.IsOpen)
{
port.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
DA.SetDataList(0, myReceivedLines);
port.Open();
}
}
else
if (port.IsOpen)
{
port.DataReceived -= new SerialDataReceivedEventHandler(DataReceivedHandler);
port.Close();
}

if (port.IsOpen)
{
DA.SetData(1, "Port Open");
}
//If the port is open do all the rest
if (port.IsOpen)
{
bool homeall = default(bool);
DA.GetData(5, ref homeall);

//Home all sends all the axis to the origin
**if (homeall == true)**
{
port.Write("G28" + "n");
myReceivedLines.Add("G28" + "n");
DA.SetDataList(2, myReceivedLines);
}
}
else
{
DA.SetData(1, "Port Closed");
}
}
}

如果你试图附加到一个字符串,我会推荐一个StringBuilder对象。

或者不太干净的分辨率,使用 += 运算符,

string s = "abcd";
s+="efgh";
Console.WriteLine(s); //s prints abcdefgh

首先,你的变量(myReceivedLines和port)不是静态的。我不确定您是否希望它们是静态的,因为我看不到您如何使用 SendToPrintComponent 类。 你能解释一下DA吗?SetDataList(0, myReceivedLines);或者更好的是包含代码,因为问题可能在那里......

相关内容

  • 没有找到相关文章

最新更新