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その引数の1つをIEnumberableに変換してみてください。コードは漠然と次のようになります。

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

ここにブレークポイントを追加して、に何が含まれているかを調べe、それに応じてコードを修正できます。

于 2012-10-06T15:45:57.623 に答える
1

サブスクライバーメソッドの行変数をフィールドにして、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 に答える