static void doread(object o) { lock (runlock) { running++; } var portname = (string)o; Console.WriteLine("Scanning {0}", portname); try { SerialPort port = new SerialPort(); { port.PortName = portname; foreach (var baud in bauds) { // try default baud if (baud != 0) { port.BaudRate = baud; } port.Open(); port.DiscardInBuffer(); // let data flow in Thread.Sleep(2000); lock (runlock) { if (run == 0) { port.Close(); return; } } int available = port.BytesToRead; var buffer = new byte[available]; int read = port.Read(buffer, 0, available); Console.WriteLine("{0} {1}", portname, read); if (read > 0) { using (MemoryStream ms = new MemoryStream(buffer, 0, read)) { MAVLink.MavlinkParse mav = new MAVLink.MavlinkParse(); try { again: var packet = mav.ReadPacket(ms); if (packet != null && packet.Length > 0) { port.Close(); Console.WriteLine("Found Mavlink on port {0} at {1}", port.PortName, port.BaudRate); foundport = true; portinterface.Add(port); if (connect) { doconnect(port); } break; } Console.WriteLine(portname + " crc: " + mav.badCRC); goto again; } catch (Exception ex) { Console.WriteLine(portname + " " + ex.ToString()); } } } try { port.Close(); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } if (foundport) { break; } } } } catch (Exception ex) { Console.WriteLine(portname + " " + ex.ToString()); } finally { lock (runlock) { running--; if (running == 0) { run = 0; } } } Console.WriteLine("Scan port {0} Finished!!", portname); }