2013-02-13 5 views
2

Я пытаюсь открыть каждый порт и отправить <mccon> серийно, для чего мой микроконтроллер ответит <connected>\n, после чего код C# должен выйти из каждого цикла.Обнаружение порта Arduino в C#

У меня проблема на линии serialPort.PortName = str;. После двух итераций это не продолжается.

Я тоже пытался сделать это вручную. Я сделал выпадающий список и выбрал порты один за другим. После второго порта он не позволяет изменять последовательный порт. Но в случае, если я выбираю в течение двух попыток, он работает нормально.

Я знаю ООП на C++. Но я новичок в 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'. Возможно, я не должен использовать 'tmp' вместо использования' serialPort'. Оба типа «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

@NeilMartin ah ok, просто просматривал другие подобные вопросы, и они упомянули wmi, и я подумал, что это может вам помочь. –

Смежные вопросы