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