4

回線を介してgcodeg28をRepRap3Dプリンターに送信しようとしていますport.Write("g28");

私のプログラムは正しいシリアルポートに接続しますが、文字列として情報を送信しようとすると、comポートへのアクセスが拒否されます。Gcodeを送信する前にシリアルポートが開いていたため、これは奇妙なことです。それはいくつかのデータさえ送り返しました。そこでの問題は何ですか?どうすれば修正できますか?

以下は、私が使用しているコード行です。gcodeコマンドのリストは、このページで入手できます。

文字列の最後にを追加しようとし"\n"ましたが、機能しませんでした。

    //Fields
    List<string> myReceivedLines = new List<string>();


    //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)
    {

        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 homeall = default(bool);
        DA.GetData(5, ref homeall);

        SerialPort port = new SerialPort(selectedportname, selectedbaudrate, Parity.None, 8, StopBits.One); 

        port.DtrEnable = true;   
        port.Open();             

        if (connecttodevice == true)
        {
            port.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
            DA.SetDataList(0, myReceivedLines);
        }

        if (homeall == true)
        {
            port.Write("g28");
        }

    }
4

1 に答える 1

3

通常、Comポートを作成するとき、それは起動時に一度初期化するクラスレベルのオブジェクトです。初期化コードをメソッドからコンストラクターまたはスタートアップ時に一度呼び出すことができるメソッドに移動します。これにより、複数回開こうとするのを防ぎ、受信データに応答できるようにしたままにする必要があります。


複数のポートを計画しているように見えるアーキテクチャはわかりませんが、コメントで質問に答えるために、SerialPortを作成するために行っているすべてのことを行います。最低限、SerialPortの宣言はクラスレベル変数である必要があります。次に、それが何もないかどうかを確認して、初めて作成することができます。

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); 

SerialPort port = new SerialPort(selectedportname, selectedbaudrate, Parity.None, 8, StopBits.One);   
port.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);

DA.SetDataList(0, myReceivedLines);   

port.Open();  // optional  I usually open it at the time that I initialize it. you can check `port.IsOpen()`
              // and Open it if it is false.

クラスレベルのSerialPortを使用した2番目のオプション次のようにしてみてください。

protected override void SolveInstance(IGH_DataAccess DA)
{
    if(port == null)
    {
        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);
        port = new SerialPort(selectedportname, selectedbaudrate, Parity.None, 8, StopBits.One);
        if (connecttodevice == true)
        {
            port.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
            DA.SetDataList(0, myReceivedLines);
        }

        port.DtrEnable = true;
        port.Open();
    }


    bool homeall = default(bool);
    DA.GetData(5, ref homeall);

    if (homeall == true)
    {
        port.Write("g28");
    }

}   
于 2012-10-15T00:15:24.733 に答える