0

次のコードはエラーなしでビルドされていますが、プログラムを実行すると、受信したデータが出力に表示されません。ブレークポイントを設定すると、次のmyReceivedLines = port.ReadExisting();ようになります。

System.InvalidOperationException

プログラム自体では、コンピュータを再起動した後、次のように表示されます。

Access to COM5 is denied

これを修正するにはどうすればよいですか?

コード:

//Fields
SerialPort port;
string myReceivedLines;

   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;


    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 += this.portdatareceived;


    if (gcode == null)
    {
        AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Specify a valid GCode");
        return;
    }

    if (connecttodevice == true)
    {
        DA.SetDataList(0, myReceivedLines);
    }

        if (sendtoprint == true)
        {
            foreach (String s in gcode)
            {
                port.WriteLine(s);
            }
        }

              }


    //subscriber method for the port.DataReceived Event
    private void portdatareceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {
            myReceivedLines = port.ReadExisting();
    }
4

1 に答える 1

1

SerialPortのDataReceivedイベントは、UIスレッドとは異なるスレッドで動作します。DataReceivedイベントのMSDNページが示唆するようなことをする必要があります。アクセス拒否エラーが発生する理由は、ポートがまだ開いているためです。コンピュータを再起動して、プログラムを正しく再起動するだけでは不十分です。

すなわち上記のリンクから

private static void DataReceivedHandler( object sender, SerialDataReceivedEventArgs e)
{
    SerialPort sp = (SerialPort)sender;
    string indata = sp.ReadExisting();
}
于 2012-10-07T01:58:31.263 に答える