Vanhemmissa ActiveGPS laitteissa on Nemerixin GPS piirisarja. Nemerixin käyttämä laajennus NMEA protokollaan ovat $PNMRX komennot.

nemerix.jpg

ActiveGPS (Nemerix) piirisarjan asetuksia voi tutkailla vaikkapa C# koodilla 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Collections;

namespace ActiveGPSInfo
{
    public partial class FormMain : Form
    {
        private const string ACTIVEGPSINFO_TITLE = "ActiveGPSInfo";
        private const string ACTIVEGPSINFO_VERSION = " version 1.0";
        private const string ACTIVEGPSINFO_ABOUT = "Displays the content of the settings stored in NVRam\r\nof the GPS chipset which supports NMEA extension $PNMRX603";
        private const string ACTIVEGPS_FETCH = "Fetching ... ";

        //private const string PNMRX600 = "&C01";
        private const string PNMRX603 = "$PNMRX603*00";
        private const string PNMRX603_1 = "$PNMRX603,1";
        private const string PNMRX603_2 = "$PNMRX603,2";
        private const string PNMRX603_3 = "$PNMRX603,3";
        private const string PNMRX603_4 = "$PNMRX603,4";

        private bool _isConnected = false;
        private int _nFound = 0;
        private int _nMasterCount = 0;
        private string _serialData = null;

        public FormMain()
        {
            InitializeComponent();
            Text = ACTIVEGPSINFO_TITLE;
            _statusMain.Items[0].Text = "";
            _comboCOM.SelectedIndex = 5;
            clearLabels();
        }

        private void _exitMenuItem_Click(object sender, EventArgs e)
        {
            serialPort.Close();
            Close();
        }

        private void _buttonConnect_Click(object sender, EventArgs e)
        {
            _statusMain.Items[0].Text = "";
            _serialData = null;
            _nFound = 0;
            _nMasterCount = 0;
            clearLabels();
            try
            {
                _isConnected = true;
                serialPort.Close();
                serialPort.PortName = _comboCOM.Text;
                serialPort.Open();
            }
            catch (Exception ex)
            {
                _isConnected = false;
                MessageBox.Show(ex.ToString(), ACTIVEGPSINFO_TITLE, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            if (_isConnected)
            {
                _buttonConnect.Enabled = false;
                _statusMain.Items[0].Text = ACTIVEGPS_FETCH;
                this.Cursor = Cursors.WaitCursor;
                int i;
                for (i = 0; i < 127; i++)
                    serialPort.WriteLine(PNMRX603);
                while (_buttonConnect.Enabled == false)
                {
                    Application.DoEvents();
                }
                this.Cursor = Cursors.Default;

                //$PNMRX603,1,01,01,01,01,01,01,01,01,0,1,01,00*71
                //$PNMRX603,2,40.0,40.0,40.0,00000000,20.0,0.1,16,12*5F
                //$PNMRX603,3,1846,1748,493,1,0,12000,*52
                //$PNMRX603,4,1,216,0,0,0,0,0,494,-20,16367600,25,35*54

                try
                {
                    int d1;
                    int d2;
                    i = _serialData.IndexOf(PNMRX603_1);
                    if (i > -1)
                    {
                        A0.Text = Convert.ToInt32(_serialData.Substring(i + 12, 2), 16).ToString();
                        A1.Text = Convert.ToInt32(_serialData.Substring(i + 15, 2), 16).ToString();
                        A2.Text = Convert.ToInt32(_serialData.Substring(i + 18, 2), 16).ToString();
                        A3.Text = Convert.ToInt32(_serialData.Substring(i + 21, 2), 16).ToString();
                        B0.Text = Convert.ToInt32(_serialData.Substring(i + 24, 2), 16).ToString();
                        B1.Text = Convert.ToInt32(_serialData.Substring(i + 27, 2), 16).ToString();
                        B2.Text = Convert.ToInt32(_serialData.Substring(i + 30, 2), 16).ToString();
                        B3.Text = Convert.ToInt32(_serialData.Substring(i + 33, 2), 16).ToString();
                        Y20B.Text = Convert.ToInt32(_serialData.Substring(i + 38, 1), 16).ToString();
                    }
                    i = _serialData.IndexOf(PNMRX603_2);
                    if (i > -1)
                    {
                        d1 = _serialData.IndexOf(",", i + 11) + 1;
                        d2 = _serialData.IndexOf(",", d1) - 1;
                        maxpdop.Text = _serialData.Substring(d1, d2 - d1 + 1);
                        d1 = _serialData.IndexOf(",", d2) + 1;
                        d2 = _serialData.IndexOf(",", d1) - 1;
                        maxhdop.Text = _serialData.Substring(d1, d2 - d1 + 1);
                        d1 = _serialData.IndexOf(",", d2) + 1;
                        d2 = _serialData.IndexOf(",", d1) - 1;
                        isv.Text = _serialData.Substring(d1, d2 - d1 + 1);
                        d1 = _serialData.IndexOf(",", d2) + 1;
                        d2 = _serialData.IndexOf(",", d1) - 1;
                        MinCNO.Text = _serialData.Substring(d1, d2 - d1 + 1);
                        d1 = _serialData.IndexOf(",", d2) + 1;
                        d2 = _serialData.IndexOf(",", d1) - 1;
                        MinE.Text = _serialData.Substring(d1, d2 - d1 + 1);
                        d1 = _serialData.IndexOf(",", d2) + 1;
                        d2 = _serialData.IndexOf(",", d1) - 1;
                        MaxTM.Text = _serialData.Substring(d1, d2 - d1 + 1);
                        d1 = _serialData.IndexOf(",", d2) + 1;
                        d2 = _serialData.IndexOf(",", d1) - 1;
                        MaxSv.Text = _serialData.Substring(d1, d2 - d1 + 1);
                    }
                    i = _serialData.IndexOf(PNMRX603_3);
                    if (i > -1)
                    {
                        d1 = _serialData.IndexOf(",", i + 11) + 1;
                        d2 = _serialData.IndexOf(",", d1) - 1;
                        acq1.Text = _serialData.Substring(d1, d2 - d1 + 1);
                        d1 = _serialData.IndexOf(",", d2) + 1;
                        d2 = _serialData.IndexOf(",", d1) - 1;
                        acq2.Text = _serialData.Substring(d1, d2 - d1 + 1);
                        d1 = _serialData.IndexOf(",", d2) + 1;
                        d2 = _serialData.IndexOf(",", d1) - 1;
                        nf.Text = _serialData.Substring(d1, d2 - d1 + 1);
                        d1 = _serialData.IndexOf(",", d2) + 1;
                        d2 = _serialData.IndexOf(",", d1) - 1;
                        km.Text = _serialData.Substring(d1, d2 - d1 + 1);
                        d1 = _serialData.IndexOf(",", d2) + 1;
                        d2 = _serialData.IndexOf(",", d1) - 1;
                        da.Text = _serialData.Substring(d1, d2 - d1 + 1);
                    }
                    i = _serialData.IndexOf(PNMRX603_4);
                    if (i > -1)
                    {
                        d1 = _serialData.IndexOf(",", i + 11) + 1;
                        d2 = _serialData.IndexOf(",", d1) - 1;
                        EGM96.Text = _serialData.Substring(d1, d2 - d1 + 1);
                        d1 = _serialData.IndexOf(",", d2) + 1;
                        d2 = _serialData.IndexOf(",", d1) - 1;
                        MapDatum.Text = _serialData.Substring(d1, d2 - d1 + 1);
                        if (MapDatum.Text.Equals("216"))
                            MapDatum.Text = MapDatum.Text + " (WGS 84)";

                        d1 = _serialData.IndexOf(",", d2) + 1;
                        d2 = _serialData.IndexOf(",", d1) - 1;
                        Dx.Text = _serialData.Substring(d1, d2 - d1 + 1);
                        d1 = _serialData.IndexOf(",", d2) + 1;
                        d2 = _serialData.IndexOf(",", d1) - 1;
                        Dy.Text = _serialData.Substring(d1, d2 - d1 + 1);
                        d1 = _serialData.IndexOf(",", d2) + 1;
                        d2 = _serialData.IndexOf(",", d1) - 1;
                        Dz.Text = _serialData.Substring(d1, d2 - d1 + 1);
                        d1 = _serialData.IndexOf(",", d2) + 1;
                        d2 = _serialData.IndexOf(",", d1) - 1;
                        Inverse.Text = _serialData.Substring(d1, d2 - d1 + 1);
                        d1 = _serialData.IndexOf(",", d2) + 1;
                        d2 = _serialData.IndexOf(",", d1) - 1;
                        MajorAxis.Text = _serialData.Substring(d1, d2 - d1 + 1);
                    }
                }
                catch (Exception ex)
                {
                    this.Cursor = Cursors.Default;
                    MessageBox.Show(ex.ToString(), ACTIVEGPSINFO_TITLE, MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }

        private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            if ((_nFound > 81) || (_nMasterCount > 143))
            {
                serialPort.DiscardOutBuffer();
                serialPort.DiscardInBuffer();
                serialPort.Close();
                _statusMain.Items[0].Text = "";
                _buttonConnect.Enabled = true;
                return;
            }

            _serialData = _serialData + serialPort.ReadExisting();

            _nMasterCount++;

            if ((_serialData.IndexOf(PNMRX603_4) > -1) && (_nFound == 0))
                _nFound = 1;

            if (_nFound > 0)
                _nFound++;
        }

        private void clearLabels()
        {
            int i;
            for (i = 0; i < panel1.Controls.Count; i++)
                panel1.Controls[i].Text = "";
            for (i = 0; i < panel2.Controls.Count; i++)
                panel2.Controls[i].Text = "";
            for (i = 0; i < panel3.Controls.Count; i++)
                panel3.Controls[i].Text = "";
            for (i = 0; i < panel4.Controls.Count; i++)
                panel4.Controls[i].Text = "";
        }

        private void aboutToolStripMenuItem_Click(object sender, EventArgs e)
        {
            MessageBox.Show(ACTIVEGPSINFO_TITLE + ACTIVEGPSINFO_VERSION + "\r\n\r\n" + ACTIVEGPSINFO_ABOUT, ACTIVEGPSINFO_TITLE, MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        //private static string getChecksum(string sentence)
        //{
        //    int checksum = Convert.ToByte(sentence[sentence.IndexOf('$') + 1]);
        //    for (int i = sentence.IndexOf('$') + 2; i < sentence.IndexOf('*'); i++)
        //    {
        //        checksum ^= Convert.ToByte(sentence[i]);
        //    }
        //    return checksum.ToString("X2");
        //}

    }
}