Vanhemmissa ActiveGPS laitteissa on Nemerixin GPS piirisarja. Nemerixin käyttämä laajennus NMEA protokollaan ovat $PNMRX komennot.
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");
//}
}
}
Kommentit
Tämän blogin kommentit tarkistetaan ennen julkaisua.