private void worker_DoWork(object sender, DoWorkEventArgs e) { // run all background tasks here //autoSerialPort = FindPort(); IProgress <string> progress = null; var ports = System.IO.Ports.SerialPort.GetPortNames().OrderBy(s => s); if (ports.Count() <= 0) { MessageBox.Show( "Error: No Serial Ports avaliable. Make sure the gps reciever is plugged in and installed. Contact your system administrator for help. \n" , "Error 1: No Serial Ports Found", MessageBoxButton.OK, MessageBoxImage.Error); _continue = false; autoSerialPort = null; return; } Application.Current.Dispatcher.Invoke((Action) delegate { prog = new autoscanProgress(); prog.Show(); }); int i = 0; int portNum = 0; int total = ports.Count() * 3; prog.scanPercentLabel.Dispatcher.BeginInvoke((Action)(() => prog.scanPercentLabel.Content = "Beginning Scan...")); prog.autoscanProgressBar.Dispatcher.BeginInvoke((Action)(() => prog.autoscanProgressBar.Value = 2)); foreach (var portName in ports) { portNum++; using (var port = new System.IO.Ports.SerialPort(portName)) { var defaultRate = port.BaudRate; List <int> baudRatesToTest = new List <int>(new[] { 9600, 4800, 19200 }); //Ordered by likelihood // removed: 115200, 57600, 38400, 2400 //Move default rate to first spot if (baudRatesToTest.Contains(defaultRate)) { baudRatesToTest.Remove(defaultRate); } baudRatesToTest.Insert(0, defaultRate); foreach (var baud in baudRatesToTest) { i++; double test = (double)(i) / total; int percent = (int)(test * 100); Trace.WriteLine("Percent complete: " + percent + "%"); Application.Current.Dispatcher.Invoke((Action) delegate { prog.autoscanProgressBar.Value = percent; prog.scanPercentLabel.Content = "Scanning Port " + portNum + " at Baud " + baud; }); if (progress != null) { progress.Report(string.Format("Trying {0} @ {1}baud", portName, port.BaudRate)); worker.ReportProgress(percent); } port.BaudRate = baud; port.ReadTimeout = 2500; //this might not be long enough bool success = false; try { port.Open(); if (!port.IsOpen) { continue; //couldn't open port } try { port.ReadTo("$GP"); success = true; Trace.WriteLine("GPS Found at: " + port.PortName + " baud " + port.BaudRate); } catch (TimeoutException) { continue; } } catch { //Error reading } finally { port.Close(); //prog.Close(); } if (success) { Application.Current.Dispatcher.Invoke((Action) delegate { prog.Close(); }); autoSerialPort = new System.IO.Ports.SerialPort(portName, baud); return; } } } } //serialPort = new System.IO.Ports.SerialPort("COM6", 9600); //return serialPort; MessageBox.Show( "Error: Could not AutoDetect a GPS device. Make sure the gps reciever is plugged in and installed. If you believe your device is properly installed, it may not be on a scanned baud rate (9600, 4800, 19200). " + "If this is the case, please go to settings and manually enter the information for your GPS reciever. \n" + "Contact your system administrator for help. \n" , "Error 1: No Serial Ports Found", MessageBoxButton.OK, MessageBoxImage.Error); autoSerialPort = null; Application.Current.Dispatcher.Invoke((Action) delegate { prog.Close(); }); return; }
private static System.IO.Ports.SerialPort FindPort(IProgress <string> progress = null) { var ports = System.IO.Ports.SerialPort.GetPortNames().OrderBy(s => s); if (ports.Count() <= 0) { MessageBox.Show( "Error: No Serial Ports avaliable. Make sure the gps reciever is plugged in and installed. Contact your system administrator for help. \n" , "Error 1: No Serial Ports Found", MessageBoxButton.OK, MessageBoxImage.Error); _continue = false; return(null); } prog = new autoscanProgress(); prog.Show(); int i = 0; int total = ports.Count() * 4; prog.scanPercentLabel.Dispatcher.BeginInvoke((Action)(() => prog.scanPercentLabel.Content = "Beginning Scan...")); prog.autoscanProgressBar.Dispatcher.BeginInvoke((Action)(() => prog.autoscanProgressBar.Value = 2)); foreach (var portName in ports) { i++; int j = 0; using (var port = new System.IO.Ports.SerialPort(portName)) { j++; var defaultRate = port.BaudRate; List <int> baudRatesToTest = new List <int>(new[] { 9600, 4800, 19200 }); //Ordered by likelihood // removed: 115200, 57600, 38400, 2400 //Move default rate to first spot if (baudRatesToTest.Contains(defaultRate)) { baudRatesToTest.Remove(defaultRate); } baudRatesToTest.Insert(0, defaultRate); foreach (var baud in baudRatesToTest) { //prog.autoscanProgressBar.Dispatcher.BeginInvoke((Action)(() => prog.autoscanProgressBar.Value = (double)(((i + j) / total) * 100))); prog.SetProgress((int)(double)(((i + j) / total) * 100)); prog.scanPercentLabel.Dispatcher.BeginInvoke((Action)(() => prog.scanPercentLabel.Content = "Scanning Port " + i + " at Baud " + baud)); if (progress != null) { progress.Report(string.Format("Trying {0} @ {1}baud", portName, port.BaudRate)); } port.BaudRate = baud; port.ReadTimeout = 2000; //this might not be long enough bool success = false; try { port.Open(); if (!port.IsOpen) { continue; //couldn't open port } try { port.ReadTo("$GP"); success = true; } catch (TimeoutException) { continue; } } catch { //Error reading } finally { port.Close(); //prog.Close(); } if (success) { prog.Close(); return(new System.IO.Ports.SerialPort(portName, baud)); } } } } //serialPort = new System.IO.Ports.SerialPort("COM6", 9600); //return serialPort; MessageBox.Show( "Error: Could not AutoDetect a GPS device. Make sure the gps reciever is plugged in and installed. If you believe your device is properly installed, it may not be on a scanned baud rate (9600, 4800, 19200). " + "If this is the case, please go to settings and manually enter the information for your GPS reciever. \n" + "Contact your system administrator for help. \n" , "Error 1: No Serial Ports Found", MessageBoxButton.OK, MessageBoxImage.Error); return(null); }