2013-02-13 4 views
2

각 포트를 열어서 <mccon>을 연속적으로 보내려고합니다.이 경우 내 마이크로 컨트롤러는 <connected>\n에 응답하고 그 후에 C# 코드는 각 루프마다 종료해야합니다.C#의 Arduino 포트 감지

serialPort.PortName = str; 줄에 문제가 있습니다. 두 번 반복 한 후에는 더 이상 계속되지 않습니다.

수동으로 시도해 보았습니다. 나는 드롭 다운을 만들고 하나씩 포트를 선택했다. 두 번째 포트 이후에는 직렬 포트를 변경할 수 없습니다. 하지만 두 번 시도를 선택하면 문제가 없습니다.

나는 C++에서 OOP를 알고있다. 하지만 저는 C#에 익숙하지 않습니다. 루프가 실패하는 이유를 모르겠습니다.

public Form1() 
{ 
    InitializeComponent(); 
    send_button.Enabled = false; 

    //Availabe COM ports 
    SerialPort tmp; 
    foreach(string str in SerialPort.GetPortNames()) 
    { 
     tmp = new SerialPort(str); 
     if (tmp.IsOpen == false) 
     { 
      serialPort.PortName = str; 

      try 
      { 
       //Open serial port 
       serialPort.Open(); 
       serialPort.BaudRate = 9600; 
       serialPort.WriteTimeout = 10; 
       serialPort.ReadTimeout = 10; 
       serialPort.Write("<mccon>"); 
       readtxt.Text = serialPort.ReadTo("\n"); 
       if (readtxt.Text == "<connected>") 
       { 
        send_button.Enabled = true; 
        port_combobox.Enabled = false; 
        break; 
       } 
       else 
       { 
        serialPort.Close(); 
       } 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error); 
      } 
     } 
    } 
} 
+0

'serialPort'과 같이 어떤 정의를? 'tmp'를 의미합니까? 멤버 변수입니까? –

+0

@DavidHope'serialPort'는 Form1.Designer.cs에서'SerialPort'로 정의됩니다. 아마도 'serialPort'자체 대신에'tmp'를 사용해서는 안됩니다. 둘 다'SerialPort' 유형입니다. –

답변

2

여러 개의 시리얼 포트가 없습니다,하지만 난 컴파일 및 코드를 실행하면, 난 당신이 읽기 동안 직렬 포트 경우 오류를 폐쇄하지 않는 것으로 나타났습니다. 나는 열려있는 동안 포트 이름 변경에 대한 효과 확실하지 않다

 SerialPort tmp; 
     foreach (string str in SerialPort.GetPortNames()) 
     { 
      tmp = new SerialPort(str); 
      if (tmp.IsOpen == false) 
      { 

       serialPort.PortName = str; 

       try 
       { 
        //open serial port 
        serialPort.Open(); 
        serialPort.BaudRate = 9600; 
        serialPort.WriteTimeout = 10; 
        serialPort.ReadTimeout = 10; 
        serialPort.Write("<mccon>"); 
        String s = serialPort.ReadTo("\n"); 
        if (s == "<connected>") 
        { 
         break; 
        } 
        else 
        { 
         serialPort.Close(); 
        } 
       } 
       catch (TimeoutException) 
       { 
        serialPort.Close(); 
       } 
       catch (Exception ex) 
       { 
        MessageBox.Show(ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error); 
       } 
      } 
     } 

하지만, 잘 당신이보고있는 문제가 발생할 수 있습니다 : 나는 다음과 같이 코드를 수정하는 것이 좋습니다.

+0

완벽하게 작동합니다. 새로운 것을 배웠습니다. 감사! –

+0

@DavidHope 약간의 변경으로 코드를 구현하려고했습니다. [여기] (http://stackoverflow.com/q/33853009/4794952) 내가 직면하고있는 문제는 나를 도와주세요. – newbie2015

0

이 코드를 실행하여 표시된 결과를 반환 할 수 있습니까? 직렬 포트에 사용할 수있는 Arduino 포트에 대한 정보가 표시 될 수 있습니다.

System.Management에 대한 참조를 추가하고 또한 사용을 추가 한 다음 코드를 시도 :

using System.Management; 

try 
{ 
    ManagementObjectSearcher searcher = 
     new ManagementObjectSearcher("root\\CIMV2", 
            "SELECT * FROM Win32_PnPEntity"); 

    foreach (ManagementObject queryObj in searcher.Get()) 
    { 
     if (queryObj["Caption"].ToString().ToUpper().Contains("ARDUINO")) 
     { 
      Console.WriteLine(queryObj["Caption"]); 
      foreach (PropertyData pd in queryObj.Properties) { Console.WriteLine(pd.Name + " : " + pd.Value); } 
     } 
    } 
} 
catch (ManagementException e) 
{ 
    Console.WriteLine(e.Message); 
} 
Console.ReadKey(); 
+0

실제로 작동합니다. 내 보드에 대한 설명에는 "Arduino"가 포함될 것입니다. 그러나 너무 일반적이므로이 방법을 사용할 수 없습니다. 같은 시스템에 연결된 다른 Arduino 보드는이 코드에 의해 수행되는 과정에서 선택 될 수 있습니다. 따라서 가장 좋은 방법은 의사 소통하고 고유 한 응답을 확인하는 것입니다. –

+0

@ NealMartin 아아, 그냥 다른 비슷한 질문을 통해 찾고 있었고 그들은 wmi 언급하고 나는 그것이 당신을 도울 수 있다고 생각. –

관련 문제