0

我正在尝试读取从设备接收到的数据,但出现以下错误DA.SetDataList(0, port.DataReceived);

The best overloaded method match for Grasshopper.Kernel.IGH_DataAccess.SetDataList(int,System.Collections.IEnumerable) has some valid arguments.

SetDataList(int32, IEnumerable) 是 Grasshopper 内核的一部分。port.DataReceived是一个事件,因此不是有效的 IEnumerable 参数,它在 GH_Component.SolveInstance() 期间将数据列表存储在输出参数中。我已经设置了一个订阅者方法 portdatareceived 它给了我字符串。如何从此方法获得 IEnumerable?

  SerialPort port;

   protected override void SolveInstance(IGH_DataAccess DA)
    {
    string gcode = default(string);
    DA.GetData(0, ref gcode);

    port = new SerialPort(selectedportname, selectedbaudrate, Parity.None, 8, StopBits.One); 
    port.DtrEnable = true;   
    port.Open();            
    port.DataReceived += this.portdatareceived;

    if (gcode == null)
    {
        AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Specify a valid GCode");
        return;
    }
    else
    {
        DA.SetDataList(0, port.DataReceived);
    }    
    }

  private void portdatareceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {
       string line = port.ReadExisting();
    }
4

3 回答 3

1

使用此代码:

port.DataReceived += this.portdatareceived;

似乎port.DataReceived是一个事件,而您的方法需要IEnumerable

IGH_DataAccess.SetDataList(int,System.Collections.IEnumerable)

为了解决这个问题,你需要portdatareceived通过从事件参数中获取正确的数据来调用这个方法。

于 2012-10-06T15:15:05.380 回答
1

我对 GrassHopper 一无所知,所以这可能是完全错误的。

因为port.DataReceived是一个事件,我不认为你真的想要它作为一个 IEnumerable。相反,您想要的是等待事件被引发,然后可能传递给此事件的参数将包含您的数据列表的数据。

因此,找到的定义this.portdatareceived并尝试将其参数之一转换为 IEnumberable。代码可能看起来有点像:

private void DataReceived(object sender, EventArgs e)
{
    IEnumerable hopefullyThisIsYourData = (IEnumerable)e;
    DA.SetDataList(0, hopefullyThisIsYourData);  
}

您可以在此处添加断点以找出其中的内容e,并相应地修复代码。

于 2012-10-06T15:45:57.623 回答
1

使订阅者方法中的 line 变量成为字段并从 SetDataList 方法访问它是有效的:

SerialPort port;
string myReceivedLines;

   protected override void SolveInstance(IGH_DataAccess DA)
  {

    string gcode = default(string);
    DA.GetData(0, ref gcode);

    port = new SerialPort(selectedportname, selectedbaudrate, Parity.None, 8, StopBits.One);
    port.DtrEnable = true;   
    port.Open();            
    port.DataReceived += this.portdatareceived;

    if (gcode == null)
    {
        AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Specify a valid GCode");
        return;
    }
    else
    {
        DA.SetDataList(0,  myReceivedLines);
        port.WriteLine(gcode);
    }    
              }

    private void portdatareceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {
        myReceivedLines = port.ReadExisting();
    } 
于 2012-10-06T16:44:19.190 回答