рдкрд░рд┐рдЪрдп
рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░!
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рд╡рд┐рдВрдбреЛрдЬрд╕реАрдИ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдЙрдкрдХрд░рдгреЛрдВ рдореЗрдВ рдЬреАрдкреАрдПрд╕ рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдВрдЪ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред SCOUT-рдиреЗрд╡рд┐рдЧреЗрдЯрд░ рдЙрддреНрдкрд╛рдж рдмрдирд╛рддреЗ рд╕рдордп, WinCE рд╕рдВрд╕реНрдХрд░рдг 5.0 рдФрд░ WinCE рд╕рдВрд╕реНрдХрд░рдг 6.0 рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдПрдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛, рдЬреЛ рдиреЗрд╡рд┐рдЧреЗрд╢рди рд░рд┐рд╕реАрд╡рд░ рд╕реЗ NMEA рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд▓реЙрдЧ рдореЗрдВ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реИред
рдирд┐рд░реНрдгрдп
WinCE 5.0 рдФрд░ рд╕рдВрд╕реНрдХрд░рдг 6.0 рджреЛрдиреЛрдВ рдореЗрдВ WinCE рдореЗрдВ GPS рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, COM рдкреЛрд░реНрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╣реИред рдЖрдк рдбрд┐рд╡рд╛рдЗрд╕ рдореЗрдВ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ COM рдкреЛрд░реНрдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬреАрдкреАрдПрд╕ рдбреЗрдЯрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ: DeviceManagerред

рдЕрдХреНрд╕рд░, рдлрд░реНрдорд╡реЗрдпрд░ рдирд┐рд░реНрдорд╛рддрд╛рдУрдВ рдиреЗ рдкрд╣рд▓реЗ рд╣реА рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ рдХрд┐ рджреЛ рдЬреАрдкреАрдПрд╕ COM рдкреЛрд░реНрдЯ рд╣реИрдВред рдпрд╣ рдЖрдкрдХреЛ рдРрд╕реЗ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХреЛ рдирд╕реНрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрд┐рдирдХреЗ рд▓рд┐рдП GPS рдФрд░ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рддрд╛рдХрд┐ рд╡реЗ COM рдкреЛрд░реНрдЯ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдШрд░реНрд╖ рди рдХрд░реЗрдВред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо COM рдкреЛрд░реНрдЯ рдХрд╛ рд╡рд┐рд╢реЗрд╖ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
NMEA рдбреЗрдЯрд╛ (http://ru.wikipedia.org/wiki/NMEA_0183) рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХреЗрд╡рд▓ COM рдкреЛрд░реНрдЯ рдЦреЛрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рд╕реЗ рдбреЗрдЯрд╛ рдкрдврд╝реЗрдВ, рдлрд┐рд░ COM рдкреЛрд░реНрдЯ рдмрдВрдж рдХрд░реЗрдВред C # рдореЗрдВ рдХреНрдпрд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
///<summary> /// COM ///</summary> ///<param name="comPortName"> COM-</param> ///<param name="baudRate"></param> private void ReadData(string comPortName,int baudRate) { var serialPort = newSerialPort(comPortName) { BaudRate = baudRate, DataBits = 8, Parity = Parity.None, StopBits = StopBits.One, RtsEnable = true }; serialPort.Open(); // COM- //..... var line=serialPort.ReadLine(); //..... serialPort.Close(); }
рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рддреБрдЪреНрдЫ рджрд┐рдЦрддрд╛ рд╣реИ, рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдЕрдХреНрд╕рд░ COM рдкреЛрд░реНрдЯ рддрдХ рдкрд╣реБрдВрдЪ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░рдг рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рддреНрд░реБрдЯрд┐ рдЕрдХреНрд╕рд░ рд╣реЛрддреА рд╣реИ: "рдЕрдирдзрд┐рдХреГрдд рдЕрд╕рдлрд╝рд▓ рдЕрдкрд╡рд╛рдж: рдкреЛрд░реНрдЯ рддрдХ рдкрд╣реБрдВрдЪ рдЕрд╕реНрд╡реАрдХреГрдд рд╣реИ")ред
рдЖрдЗрдП рдкрд░реЗрд╢рд╛рди рди рд╣реЛрдВ, рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рд╣реИ рдЬреЛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
OpenNetCf рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдорд╣рд╛рди рд▓реЛрдЧ рд╕рд╛рд╡рдзрд╛рдиреА рд╕реЗ рдЕрдкрдиреЗ рдЦреБрдж рдХреЗ SerialPort рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред
http://serial.codeplex.com/SourceControl/changeset/view/25883#435389рдЕрд╕реЗрдВрдмрд▓реА OpenNetCf.IO.Serial рдХреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ
GPS COM рдкреЛрд░реНрдЯ рдХреНрд▓рд╛рд╕ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:
///<summary> /// GPS COM- ///</summary> public class GpsPort: IDisposable { private Port _serialPort; private bool _disposed; private readonly object _syncObject = new object(); public bool IsOpen { get; private set; } ///<summary> /// GPS ///</summary> ///<param name="serialPortName"></param> ///<param name="baudRate"></param> public GpsPort(string serialPortName, int baudRate) { _serialPort = newPort(serialPortName, newDetailedPortSettings { BasicSettings = newBasicPortSettings { BaudRate = (BaudRates)baudRate }, EOFChar = '\n' }); _disposed = false; } public void Dispose() { if (!_disposed) { Close(); _serialPort = null; _disposed = true; } GC.SuppressFinalize(this); } ///<summary> ///Destructor ///</summary> ~GpsPort() { Dispose(); } ///<summary> /// ///</summary> public void Open() { try { _serialPort.Open(); _serialPort.DataReceived += SerialPortDataReceived; IsOpen = true; } catch (Exception ex) { throw new ApplicationException("Could not open com port", ex); } } ///<summary> /// ///</summary> private void SerialPortDataReceived() { lock (_syncObject) { if (_serialPort == null || !_serialPort.IsOpen) return; var realPortData = _serialPort.Input; if (realPortData.Length == 0) return; Debug.Write(Encoding.GetEncoding("ASCII").GetString(realPortData, 0, realPortData.Length)); } } ///<summary> /// ///</summary> public void Close() { IsOpen = false; if (_serialPort != null) if (_serialPort.IsOpen) { _serialPort.DataReceived -= SerialPortDataReceived; _serialPort.Close(); } } }
SerialPortDataReceived рд╡рд┐рдзрд┐ рдореЗрдВ, рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, NMEA рддрд╛рд░ рдХреЗ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рд▓рд┐рдЦрддреЗ рд╣реИрдВред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
- рдЕрдкрдирд╛ NMEA рдкрд╛рд░реНрд╕рд░ рд▓рд┐рдЦреЗрдВ;
- SharpGps рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ;
- NMEA-0183-2-0- рд╕реЗрдВрдЯреЗрдВрд╕-рдкрд╛рд░реНрд╕рд░-рдмрд┐рд▓реНрдбрд░ (рдпрд╣рд╛рдВ рд╣реИрдмреЗ рдкрд░ рдбреЗрд╡рд▓рдкрд░ рдХрд╛ рд▓реЗрдЦ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ;
- рдХреЛрдИ рдЕрдиреНрдп рдкрд╛рд░реНрд╕рд░ред
рдореИрдВрдиреЗ рд╕реЗрдВрдЯреЗрдВрд╕рдкрд░реНрд╕рдмрд┐рд▓реНрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА рд╣реИ, рд▓реЗрдХрд┐рди SharpGps рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╣реИред
рдореИрдВ рд╡рд┐рд╖рдп рд╕реЗ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╡рд┐рд╖рдпрд╛рдВрддрд░ рдХрд░реВрдВрдЧрд╛ред рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдЪреЗрдХрд╕рдо рдХреА рдЧрдгрдирд╛ рдореЗрдВ рдПрдХ рдЕрдЬреАрдм рдЧрд▓рддреА рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореЗрд░реЗ рдХрдИ рд╕рд╣рдпреЛрдЧрд┐рдпреЛрдВ рдХрд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдЧрд▓рддреА рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рддрд╛рд░реНрдХрд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИред рд▓реЗрдХрд┐рди рдкрд╣рд▓реА рдЪреАрдЬреЗрдВ рдкрд╣рд▓реЗ:
NMEA 0183 рдкреНрд░реЛрдЯреЛрдХреЙрд▓ (
http://www.tronico.fi/OH6NT/docs/NMEA0183.pdf ) рдореЗрдВ рдЪреЗрдХрд╕рдо рдХреЛ 2-рдЕрдВрдХреАрдп рд╣реЗрдХреНрд╕рд╛рдбреЗрд╕рд┐рдорд▓ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - "$" рдФрд░ "*" рдХреЗ рдмреАрдЪ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рд╕рднреА рдмрд╛рдЗрдЯреНрд╕ рдХрд╛ XOR рдЪреЗрдХрд╕рдоред "ред
SharpGps рдореЗрдВ рдкреИрдХреЗрдЬ рдореЗрдВ рдЪреЗрдХрд╕рдо рдХреА рд╢реБрджреНрдзрддрд╛ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ:
private bool CheckSentence(string strSentence) { int iStart = strSentence.IndexOf('$'); int iEnd = strSentence.IndexOf('*'); //If start/stop isn't found it probably doesn't contain a checksum, //or there is no checksum after *. In such cases just return true. if (iStart >= iEnd || iEnd + 3 > strSentence.Length) return true; byte result = 0; for (int i = iStart + 1; i < iEnd; i++) { result ^= (byte)strSentence[i]; } return (result.ToString("X") == strSentence.Substring(iEnd + 1, 2)); }
рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЕрдЧрд░ рдиреЗрд╡рд┐рдЧреЗрд╢рди рд░рд┐рд╕реАрд╡рд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдореЗрдВ рдмрддрд╛рдП рдЕрдиреБрд╕рд╛рд░ рджреЛ рдирдВрдмрд░ (0x01, 0x02, рдЖрджрд┐) рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдЪреЗрдХрд╕рдо рдЯреНрд░рд╛рдВрд╕рдорд┐рдЯ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рдЖрджрд░реНрд╢ рдХреЛрдб рдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдореЗрдВ рддреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдиреЗрд╡рд┐рдЧреЗрд╢рди рд░рд┐рд╕реАрд╡рд░ рдПрдХ рдЕрдЧреНрд░рдгреА рд╢реВрдиреНрдп (0x1,0x2) рдХреЛ рдЬреЛрдбрд╝реЗ рдмрд┐рдирд╛ рдПрдХ рдЪреЗрдХрд╕рдо рдХреЗ рд╕рд╛рде рдкреИрдХреЗрдЯ рд╕рдВрдЪрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рдПрдХ рдЪрд▓ рд░рд╣реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдкреИрдХреЗрдЯ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдП рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд▓рдЧ рд░рд╣рд╛ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЯреНрд░реИрдХ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЦрд░рд╛рдм рдЧреБрдгрд╡рддреНрддрд╛ рдХрд╛ рд╣реИред
рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХрдо рд╕реЗ рдХрдо рдЗрд╕ рддрд░рд╣:
var packCrc = byte.Parse(strSentence.Substring(iEnd + 1, 2), System.Globalization.NumberStyles.AllowHexSpecifier); return (result == packCrc);
рд╕рднреА рдкреАрдЫреЗ рд╣рдЯ рдЧрдПред
рдиреЗрд╡рд┐рдЧреЗрд╢рди рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, SqlServer рдХреЙрдореНрдкреИрдХреНрдЯ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ред рдЖрд╡реЗрджрди рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд░рдирд╛, рдФрд░ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рдореИрдВрдиреЗ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ SqlServer Compact рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рдмрдирд╛рдИ рд╣реИ, рдпрджрд┐ рдЖрдк WinCe рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ SqlServer Compact рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рдПрдХ рд▓реЗрдЦ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕реЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдирд┐рд╖реНрдХрд░реНрд╖
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВрдиреЗ WinCe рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ GPS рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рджрд┐рдпрд╛, рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рднрд┐рдиреНрди рдирд┐рд░реНрдорд╛рддрд╛рдУрдВ (Prestigio, Texet, Shturmann, Mio) рдХреЗ рдиреЗрд╡рд┐рдЧреЗрдЯрд░ рдкрд░ WinCE рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ WinCE рдХреЗ рддрд╣рдд рд╡рд┐рдХрд╛рд╕ рдХреЗ рд░рд╛рд╕реНрддреЗ рдкрд░ рдЖрдкрдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣реЗ рд░реЗрдХ рдХреЗ рдПрдХ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдмрдЪрд╛рдПрдЧрд╛ред
рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдкреНрд░рд╢реНрдиреЛрдВ рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИред