Index: trunk/BNC/src/pppMain.cpp
===================================================================
--- trunk/BNC/src/pppMain.cpp	(revision 11022)
+++ trunk/BNC/src/pppMain.cpp	(revision 11052)
@@ -45,4 +45,5 @@
 #include "pppCrdFile.h"
 #include "bncsettings.h"
+#include "bnccore.h"
 
 using namespace BNC_PPP;
@@ -85,4 +86,5 @@
   }
   catch (t_except exc) {
+    BNC_CORE->slotMessage(QByteArray::fromStdString(exc.what()), true);
     _running = true;
     stop();
@@ -161,13 +163,38 @@
     opt->_realTime     = _realTime;
     opt->_roverName    = hlp[0].toStdString();
-    opt->_aprSigCrd[0] = hlp[1].toDouble()+1e-10;
-    opt->_aprSigCrd[1] = hlp[2].toDouble()+1e-10;
-    opt->_aprSigCrd[2] = hlp[3].toDouble()+1e-10;
-    opt->_noiseCrd[0]  = hlp[4].toDouble()+1e-10;
-    opt->_noiseCrd[1]  = hlp[5].toDouble()+1e-10;
-    opt->_noiseCrd[2]  = hlp[6].toDouble()+1e-10;
-    opt->_aprSigTrp    = hlp[7].toDouble();
-    opt->_noiseTrp     = hlp[8].toDouble();
-    opt->_nmeaPort     = hlp[9].toInt();
+
+    // Numeric Fields: reject malformed entries 
+    // ----------------------------------------
+    double num[9];
+    for (int ii = 1; ii <= 8; ii++) {
+      bool ok;
+      num[ii] = hlp[ii].trimmed().toDouble(&ok);
+      if (!ok || num[ii] < 0.0) {
+        std::string msg = "pppMain: wrong option staTable: station "
+                        + opt->_roverName + " field " + std::to_string(ii)
+                        + " \"" + hlp[ii].toStdString() + "\"";
+        delete opt;
+        throw t_except(msg.c_str());
+      }
+    }
+    bool okPort;
+    int nmeaPort = hlp[9].trimmed().toInt(&okPort);
+    if (!okPort && !hlp[9].trimmed().isEmpty()) {
+      std::string msg = "pppMain: wrong option staTable: station "
+                      + opt->_roverName + " NMEA port \""
+                      + hlp[9].toStdString() + "\"";
+      delete opt;
+      throw t_except(msg.c_str());
+    }
+
+    opt->_aprSigCrd[0] = num[1]+1e-10;
+    opt->_aprSigCrd[1] = num[2]+1e-10;
+    opt->_aprSigCrd[2] = num[3]+1e-10;
+    opt->_noiseCrd[0]  = num[4]+1e-10;
+    opt->_noiseCrd[1]  = num[5]+1e-10;
+    opt->_noiseCrd[2]  = num[6]+1e-10;
+    opt->_aprSigTrp    = num[7];
+    opt->_noiseTrp     = num[8];
+    opt->_nmeaPort     = nmeaPort;
 
     string trkStr      = hlp[10].trimmed().toStdString();
