//////////////////////////////////////////////////////////////////////////////////////////////////// //if port is empty program will auto select arduino port public TGMTarduino(string portName = "", int baudRate = 9600) { if (portName == "") { ArduinoProperties arduinoProperties = AutoDetectArduinoPort(); portName = arduinoProperties.portName; baudRate = arduinoProperties.baudRate; if (portName == null) { return; } } try { m_port = new SerialPort(portName, baudRate, Parity.None, 8, StopBits.One); // Attach a method to be called when there // is data waiting in the port's buffer m_port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived); // Begin communications m_port.Open(); m_portName = portName; m_threadCheckDisconnected = new Thread(new ThreadStart(CheckDisconnected)); m_threadCheckDisconnected.Start(); } catch (Exception ex) { MessageBox.Show(ex.Message); } }
//////////////////////////////////////////////////////////////////////////////////////////////////// private ArduinoProperties AutoDetectArduinoPort() { ManagementScope connectionScope = new ManagementScope(); SelectQuery serialQuery = new SelectQuery("SELECT * FROM Win32_SerialPort"); ManagementObjectSearcher searcher = new ManagementObjectSearcher(connectionScope, serialQuery); ArduinoProperties result = new ArduinoProperties(); try { foreach (ManagementObject item in searcher.Get()) { string desc = item["Description"].ToString(); string deviceId = item["DeviceID"].ToString(); string pnp = item["PNPDeviceID"].ToString(); if (desc.Contains("Arduino") || pnp.Contains("VID_10C4") ||// Vietduino pnp.Contains("VID_2341")) //arduino) { result.portName = deviceId; } var config = item.GetRelated("Win32_SerialPortConfiguration").Cast <ManagementObject>().ToList().FirstOrDefault(); result.baudRate = (config != null) ? int.Parse(config["BaudRate"].ToString()) : int.Parse(item["MaxBaudRate"].ToString()); } } catch (ManagementException e) { throw new Exception("Can not get Arduino port, please check connection"); } return(result); }