2012-10-14 92 views
4

我試圖通過port.Write("g28");行將gcode g28發送到我的RepRap 3D打印機。將正確的Gcode字符串發送到串行端口?

我的程序連接到正確的串行端口,但是當我嘗試發送信息作爲字符串訪問com端口被拒絕。 這很奇怪,因爲在將Gcode發送給它之前,串口是打開的。它甚至發回了一些數據。那裏有什麼問題,我如何解決它?

以下是我正在使用的代碼行。 gcode命令列表可在此page上獲得。

我曾嘗試在字符串的末尾添加"\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"); 
     } 

    } 
+0

*「時,它以前是不可能的COM端口訪問被拒絕。」 * - 之前是什麼?你有沒有試過*資本*(又名大寫)「G」? – sawdust

+0

@sawdust在將Gcode發送到串行端口之前,我剛更新了這個問題。非常感謝你。 –

+1

*「port.Write(」g28「)」* - 「g28」甚至未被列爲有效操作;你想要做什麼手術? 「G」或「M」必須大寫,並且您需要用「\ n」來終止該行。 *「它甚至發回了一些數據。」* - 那個消息是什麼? – sawdust

回答

3

通常,當我創建一個Com Port時,它是一個Class級別的對象,我在啓動時初始化一次。我會將您的初始化代碼從您的方法中移出,並移入構造函數或您可以在啓動期間調用一次的方法。這應該可以防止您嘗試多次打開它,並仍然可以響應收到的數據。


我不知道你的架構看起來你可能計劃有多個端口,但是 回答在評論你的問題,你正在做創建一個串口一切。至少SerialPort的聲明應該是一個Class Level變量。然後你可以檢查它是否是無用的,並且第一次創建它。

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第二個選項嘗試是這樣的:

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

} 
+0

非常感謝,你會在上面的代碼中包含'Initialization Code'嗎? –

+0

對不起,如果我從SolveInstance中取出所有'if'語句,我將如何從我的程序中訪問它們,因爲SolveInstance()方法是我可以將數據分配給它的地方?非常感謝。 –

+0

@ ArthurMamou-Mani看到第二個選項,最主要的是避免創建多個SerialPorts。 –

相關問題