标签存档: GPS

两个免费的Android上的离线导航软件

平时经常用Google Map来导航吧?是不是持续跑流量很不爽?或者是如果跑到没手机信号的地方怎么办?

这个时候就用得到离线导航软件了。今天发现两个还不错的Android下的使用的免费离线导航软件(高大上用iOS的同学就用收费的啦)

这个是利用OSM(Open Street Map)数据来进行导航的软件。支持在线,也同时支持离线导航(当然你需要下载相应的当地地图)地图包括:
Western Europe: ****
Eastern Europe: ***
Russia: ***
North America: ***
South America: **
Asia: **
Japan & Korea: ***
Middle East: **
Africa: **
Antarctica: *

同样也是使用OSM数据来导航的免费软件。地图包括:Andorra, Argentina, Australia, Austria, Benelux (Belgium, Netherlands, Luxembourg), Brazil, Canada, Croatia, Czech Republic, Denmark, Finland, France, Germany, India, Ireland, Italy, Latvia, Mexico, Monaco, Netherlands, New Zealand, Norway, Poland, Portugal, Slovenia, South Africa, Spain, Sweden, Switzerland, UK.

 

灵图天行者5

GPS爱好者的好消息!灵图天行者5已被成功破解!

LT5的eMule下载链接:
ed2k://|file|%E7%81%B5%E5%9B%BE%E5%A4%A9%E8%A1%8C%E8%80%855.0.28R.rar|456115496|39B57A2C1ADA7253A0670AE01B70CAB0|h=S46RMJJWRB2URERH3JVJLFWUW4EGOTMU|/

小胖熊上的帖子:

硬件全面XX,不会有任何死机情况的发生,已经路试,一点问题也没有,直接硬件级别底层XX!
附件中一个是模拟机一个是正版ID一个是LT5最新的BT下载文件
哈哈
强烈感谢wh_cxh对我们的突出贡献,只给下载100次,顶的才下哦

1、下载:ftp://op_down:000000@221.122.54.100:12121/ 的“灵图天行者5.0.28R PDA版”。下载模拟器:DevEmu.rar。见 http://www.sosaw.com/dispbbs.asp?boardID=43&ID=68368&page=1 的12楼。
2、安装:先装在电脑上,不要选同步安装,这样快些。可以选择使用PDA品牌,如Dopod、Hp……。
3、用读卡器把文件考到PDA的SD卡根目录下:文件夹“2577”、“ConfigFile”、“DB”、“StartUp“和“天行者安装. exe”。DB文件夹下是地图文件,测试可以只拷贝你所在省市的地图。插上卡后,LT会自动启动安装,并在桌面建立一个快捷图标。此时,不要启动LT5!
4、激活:启动模拟器DevEmu.exe,若正常则显示:模拟成功。然后启动LT5,会显示输入XXX,然后输入:GVY3H-C2T93-QR3X8 -7349M-9K84D,确定后显示安装码:MBGVB-KB2PY-HBBTB-K3J4T,再输入激活码:3B64-6TFT-DB26- BDRP。进入程序,搞定!!!
5、根据需要,调整Startup目录下SMG_SysConfig.txt设置文件中的路径。

附件:devemu.zip(11047 Byte)

GPS NMEA Protocol [收藏]

NMEA是GPS 的標準protocol,她是ASCII的字串,像

$GPRMC,053322.682,A,2502.6538,N,12121.4838,E,0.00,315.00,080905,,,A*6F

這一個command是GPS Recommanded GNSS data

053322.682

是UTC Time : 格式是hhmmss.sss所以是5:33:22.682

A

代表data是valid (如果找不到衛星,就會是V)

2502.6538

是緯度,格式是degree * 100 + minutes。但是minutes是100進位,所以要/100 * 60轉為degree,轉換後就是25‘02‘39.228‘‘.

N

是代表緯度是北緯

12121.4838

是經度,格式是degree * 100 + minutes。minutes一樣要做/100*60的轉換,轉換後就是121‘21‘29.02‘‘.

E

代表經度是東經

0.00

是速度,因為GPS天線沒動,所以是0.00

315.00

是方向

080905

是目前的日期,格式是ddmmyy,所以是05年9月8日

– –

接著有兩個欄位沒有用,所以空著

A

是Autonomous ?

*6F

是checksum

*** 所以用google earth就知道我把天線放在哪了****


格式是:
1.一律以 $ 符號開頭
2.$ 後是Message id. 5個ASCII Code.
3.一連串以‘,‘分開的欄位.
4.Checksum,checkum以‘*‘開始,後面是兩個ASCII code.
5.

$GPGSV,1,1,02,14,,,37,25,,,46,,,,,,,,*7F

$GPGSV : Satellites in View

Message ID : $GPGSV
Number of Messages : 1
Message number : 1
Satellites in view : 02 目看到的衛星數
Satellite Id : 14 Satellite vehicle 以下是第一個看到的衛星,編號14
Elevation : – Elevation of satellite in degree
Azimuth : – Azimuth of satellite in defree
SNR : 37 Signal to Noise ration in dbHz
Satellite id : 25 Satellite vehicle,以下是第二個看到的衛星,邊號25


NMEA Protocol中checksum的算法:
不包含開頭的‘$‘,一直計算到‘*‘之前。一個byte一個byte的作XOR.


data++; // skip the heading ‘

所以可以知道,連command間的‘,‘符號也加入計算。


一般NMEA的report data中,用


有些擴充協定,用來設定,例如
$PNMRX103, NMEA report rate control
可以指定NMEA report資料的頻率
GGA,GLL,GSA,GSV,RMC,VTG,ZDA,ALL
例如:
$PNMRX103,ALL,0*1A
所有的report都停止。
$PNMRX103,RMC,2*02
每2 sec送出一次RMC report


$PNMRX100 設定baud rate
$PNMRX100,0,4800,0*48
設定
Protocol : 0 : NMEA Mode, 1: Bindary Mode (不要用這一個)
baud rate: 4800 其他可以設1200,2400,4800,9600,19200,38400,57600.
Parity : 0 : None, 其他1 2代表Odd, 2代表 Even.
所以上面的example代表:使用NMEA Mode, 4800, None Parity


這些設定在reset後都消失……


雖然Manual中說明support message有GGA,GLL,GSA,GSV,RMC,VTG,ZDA但是用ALL command開啟後,發現只有report GGA,GSA,RMC,VTG.


NMEA是"National Marine Electronics Association"(国际海洋电子协会)缩写,同时也是数据传输标准工业协会,在这里,实际上应为NMEA 0183。它是一套定义接收机输出的标准信息,有几种不同的格式,每种都是独立相关的ASCII格式,逗点隔开数据流,数据流长度从30-100字符不 等,通常以每秒间隔选择输出,最常用的格式为"GGA",它包含了定位时间,纬度,经度,高度,定位所用的卫星数,DOP值,差分状态和校正时段等,其他 的有速度,跟踪,日期等。NMEA实际上已成为所有的GPS接收机和最通用的数据输出格式,同时它也被用于与GPS接收机接口的大多数的软件包里。

  NMEA-0183协议定义的语句非常多,但是常用的或者说兼容性最广的语句只有$GPGGA、$GPGSA、$GPGSV、$GPRMC、$GPVTG、$GPGLL等。下面给出这些常用NMEA-0183语句的字段定义解释。

$GPGGA
例:$GPGGA,092204.999,4250.5589,S,14718.5084,E,1,04,24.4,19.7,M,,,,0000*1F
字段0:$GPGGA,语句ID,表明该语句为Global Positioning System Fix Data(GGA)GPS定位信息
字段1:UTC 时间,hhmmss.sss,时分秒格式
字段2:纬度ddmm.mmmm,度分格式(前导位数不足则补0)
字段3:纬度N(北纬)或S(南纬)
字段4:经度dddmm.mmmm,度分格式(前导位数不足则补0)
字段5:经度E(东经)或W(西经)
字段6:GPS状态,0=未定位,1=非差分定位,2=差分定位,3=无效PPS,6=正在估算
字段7:正在使用的卫星数量(00 – 12)(前导位数不足则补0)
字段8:HDOP水平精度因子(0.5 – 99.9)
字段9:海拔高度(-9999.9 – 99999.9)
字段10:地球椭球面相对大地水准面的高度
字段11:差分时间(从最近一次接收到差分信号开始的秒数,如果不是差分定位将为空)
字段12:差分站ID号0000 – 1023(前导位数不足则补0,如果不是差分定位将为空)
字段13:校验值

$GPGSA
例:$GPGSA,A,3,01,20,19,13,,,,,,,,,40.4,24.4,32.2*0A
字段0:$GPGSA,语句ID,表明该语句为GPS DOP and Active Satellites(GSA)当前卫星信息
字段1:定位模式,A=自动手动2D/3D,M=手动2D/3D
字段2:定位类型,1=未定位,2=2D定位,3=3D定位
字段3:PRN码(伪随机噪声码),第1信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)
字段4:PRN码(伪随机噪声码),第2信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)
字段5:PRN码(伪随机噪声码),第3信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)
字段6:PRN码(伪随机噪声码),第4信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)
字段7:PRN码(伪随机噪声码),第5信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)
字段8:PRN码(伪随机噪声码),第6信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)
字段9:PRN码(伪随机噪声码),第7信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)
字段10:PRN码(伪随机噪声码),第8信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)
字段11:PRN码(伪随机噪声码),第9信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)
字段12:PRN码(伪随机噪声码),第10信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)
字段13:PRN码(伪随机噪声码),第11信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)
字段14:PRN码(伪随机噪声码),第12信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)
字段15:PDOP综合位置精度因子(0.5 – 99.9)
字段16:HDOP水平精度因子(0.5 – 99.9)
字段17:VDOP垂直精度因子(0.5 – 99.9)
字段18:校验值

$GPGSV
例:$GPGSV,3,1,10,20,78,331,45,01,59,235,47,22,41,069,,13,32,252,45*70
字段0:$GPGSV,语句ID,表明该语句为GPS Satellites in View(GSV)可见卫星信息
字段1:本次GSV语句的总数目(1 – 3)
字段2:本条GSV语句是本次GSV语句的第几条(1 – 3)
字段3:当前可见卫星总数(00 – 12)(前导位数不足则补0)
字段4:PRN 码(伪随机噪声码)(01 – 32)(前导位数不足则补0)
字段5:卫星仰角(00 – 90)度(前导位数不足则补0)
字段6:卫星方位角(00 – 359)度(前导位数不足则补0)
字段7:信噪比(00-99)dbHz
字段8:PRN 码(伪随机噪声码)(01 – 32)(前导位数不足则补0)
字段9:卫星仰角(00 – 90)度(前导位数不足则补0)
字段10:卫星方位角(00 – 359)度(前导位数不足则补0)
字段11:信噪比(00-99)dbHz
字段12:PRN 码(伪随机噪声码)(01 – 32)(前导位数不足则补0)
字段13:卫星仰角(00 – 90)度(前导位数不足则补0)
字段14:卫星方位角(00 – 359)度(前导位数不足则补0)
字段15:信噪比(00-99)dbHz
字段16:校验值

$GPRMC
例:$GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A*50
字段0:$GPRMC,语句ID,表明该语句为Recommended Minimum Specific GPS/TRANSIT Data(RMC)推荐最小定位信息
字段1:UTC时间,hhmmss.sss格式
字段2:状态,A=定位,V=未定位
字段3:纬度ddmm.mmmm,度分格式(前导位数不足则补0)
字段4:纬度N(北纬)或S(南纬)
字段5:经度dddmm.mmmm,度分格式(前导位数不足则补0)
字段6:经度E(东经)或W(西经)
字段7:速度,节,Knots
字段8:方位角,度
字段9:UTC日期,DDMMYY格式
字段10:磁偏角,(000 – 180)度(前导位数不足则补0)
字段11:磁偏角方向,E=东W=西
字段16:校验值

$GPVTG
例:$GPVTG,89.68,T,,M,0.00,N,0.0,K*5F
字段0:$GPVTG,语句ID,表明该语句为Track Made Good and Ground Speed(VTG)地面速度信息
字段1:运动角度,000 – 359,(前导位数不足则补0)
字段2:T=真北参照系
字段3:运动角度,000 – 359,(前导位数不足则补0)
字段4:M=磁北参照系
字段5:水平运动速度(0.00)(前导位数不足则补0)
字段6:N=节,Knots
字段7:水平运动速度(0.00)(前导位数不足则补0)
字段8:K=公里/时,km/h
字段9:校验值

$GPGLL
例:$GPGLL,4250.5589,S,14718.5084,E,092204.999,A*2D
字段0:$GPGLL,语句ID,表明该语句为Geographic Position(GLL)地理定位信息
字段1:纬度ddmm.mmmm,度分格式(前导位数不足则补0)
字段2:纬度N(北纬)或S(南纬)
字段3:经度dddmm.mmmm,度分格式(前导位数不足则补0)
字段4:经度E(东经)或W(西经)
字段5:UTC时间,hhmmss.sss格式
字段6:状态,A=定位,V=未定位
字段7:校验值

2006昆明市乡村旅游图

昨天买到了两张新出的地图:《2006昆明市乡村旅游图》,《2006云南省旅游交通图》

今天把扫描仪找了来扫,弄了半天,还差乡村旅游图的两幅地图和旅游交通图没扫。先提供扫好地图的JPG格式给大家。稍后再提供OZI格式的地图和其它地图~

地图下载
云南经典乡村旅游图 JPG OZI
昆明市北部乡村旅游图 JPG OZI
富民县城乡村旅游图 JPG OZI
大板桥镇乡村旅游图 JPG OZI
金殿水库乡村旅游图 JPG OZI
晋宁乡盘龙寺乡村旅游图 JPG OZI
猫猫箐乡村旅游图 JPG OZI
沙朗乡乡村旅游图 JPG OZI
双龙乡乡村旅游图 JPG OZI
松花坝水库乡村旅游图 JPG OZI
团结镇乡村旅游图 JPG OZI

 

其余地图正在努力中……

 

用C#读取GPS数据的基类

using System;
using System.Runtime.InteropServices;
using System.Text;

namespace BaseStationPDA
{
 class GPS
 {

  public string PortNum;
  public int BaudRate;
  public byte ByteSize;
  public byte Parity; // 0-4=no,odd,even,mark,space
  public byte StopBits; // 0,1,2 = 1, 1.5, 2
  public int ReadTimeout;
  
  //comm port win32 file handle
  private int hComm = -1;
  
  public bool Opened = false;
  
  //win32 api constants
  private const uint GENERIC_READ = 0x80000000;
  private const uint GENERIC_WRITE = 0x40000000;
  private const int OPEN_EXISTING = 3;  
  private const int INVALID_HANDLE_VALUE = -1;
  
  [StructLayout(LayoutKind.Sequential)]
   public struct DCB
  {
   //taken from c struct in platform sdk
   public int DCBlength;           // sizeof(DCB)
   public int BaudRate;            // 指定当前波特率 current baud rate
   // these are the c struct bit fields, bit twiddle flag to set
   public int fBinary;          // 指定是否允许二进制模式,在windows95中必须主TRUE binary mode, no EOF check
   public int fParity;          // 指定是否允许奇偶校验 enable parity checking
   public int fOutxCtsFlow;      // 指定CTS是否用于检测发送控制,当为TRUE是CTS为OFF,发送将被挂起。 CTS output flow control
   public int fOutxDsrFlow;      // 指定CTS是否用于检测发送控制 DSR output flow control
   public int fDtrControl;       // DTR_CONTROL_DISABLE值将DTR置为OFF, DTR_CONTROL_ENABLE值将DTR置为ON, DTR_CONTROL_HANDSHAKE允许DTR"握手" DTR flow control type
   public int fDsrSensitivity;   // 当该值为TRUE时DSR为OFF时接收的字节被忽略 DSR sensitivity
   public int fTXContinueOnXoff; // 指定当接收缓冲区已满,并且驱动程序已经发送出XoffChar字符时发送是否停止。TRUE时,在接收缓冲区接收到缓冲区已满的字节XoffLim且驱动程序已经发送出XoffChar字符中止接收字节之后,发送继续进行。 FALSE时,在接收缓冲区接收到代表缓冲区已空的字节XonChar且驱动程序已经发送出恢复发送的XonChar之后,发送继续进行。XOFF continues Tx
   public int fOutX;          // TRUE时,接收到XoffChar之后便停止发送接收到XonChar之后将重新开始 XON/XOFF out flow control
   public int fInX;           // TRUE时,接收缓冲区接收到代表缓冲区满的XoffLim之后,XoffChar发送出去接收缓冲区接收到代表缓冲区空的XonLim之后,XonChar发送出去 XON/XOFF in flow control
   public int fErrorChar;     // 该值为TRUE且fParity为TRUE时,用ErrorChar 成员指定的字符代替奇偶校验错误的接收字符 enable error replacement
   public int fNull;          // eTRUE时,接收时去掉空(0值)字节 enable null stripping
   public int fRtsControl;     // RTS flow control
   /*RTS_CONTROL_DISABLE时,RTS置为OFF
            RTS_CONTROL_ENABLE时, RTS置为ON
            RTS_CONTROL_HANDSHAKE时,
            当接收缓冲区小于半满时RTS为ON
             当接收缓冲区超过四分之三满时RTS为OFF
            RTS_CONTROL_TOGGLE时,
            当接收缓冲区仍有剩余字节时RTS为ON ,否则缺省为OFF*/

   public int fAbortOnError;   // TRUE时,有错误发生时中止读和写操作 abort on error
   public int fDummy2;        // 未使用 reserved
   
   public uint flags;
   public ushort wReserved;          // 未使用,必须为0 not currently used
   public ushort XonLim;             // 指定在XON字符发送这前接收缓冲区中可允许的最小字节数 transmit XON threshold
   public ushort XoffLim;            // 指定在XOFF字符发送这前接收缓冲区中可允许的最小字节数 transmit XOFF threshold
   public byte ByteSize;           // 指定端口当前使用的数据位 number of bits/byte, 4-8
   public byte Parity;             // 指定端口当前使用的奇偶校验方法,可能为:EVENPARITY,MARKPARITY,NOPARITY,ODDPARITY  0-4=no,odd,even,mark,space
   public byte StopBits;           // 指定端口当前使用的停止位数,可能为:ONESTOPBIT,ONE5STOPBITS,TWOSTOPBITS  0,1,2 = 1, 1.5, 2
   public char XonChar;            // 指定用于发送和接收字符XON的值 Tx and Rx XON character
   public char XoffChar;           // 指定用于发送和接收字符XOFF值 Tx and Rx XOFF character
   public char ErrorChar;          // 本字符用来代替接收到的奇偶校验发生错误时的值 error replacement character
   public char EofChar;            // 当没有使用二进制模式时,本字符可用来指示数据的结束 end of input character
   public char EvtChar;            // 当接收到此字符时,会产生一个事件 received event character
   public ushort wReserved1;         // 未使用 reserved; do not use
  }

  [StructLayout(LayoutKind.Sequential)]
   private struct COMMTIMEOUTS
  { 
   public int ReadIntervalTimeout;
   public int ReadTotalTimeoutMultiplier;
   public int ReadTotalTimeoutConstant;
   public int WriteTotalTimeoutMultiplier;
   public int WriteTotalTimeoutConstant;
  }  

  [StructLayout(LayoutKind.Sequential)] 
   private struct OVERLAPPED
  {
   public int  Internal;
   public int  InternalHigh;
   public int  Offset;
   public int  OffsetHigh;
   public int hEvent;
  } 
  
  [DllImport("coredll.dll")]
  private static extern int CreateFile(
   string lpFileName,                         // 要打开的串口名称
   uint dwDesiredAccess,                      // 指定串口的访问方式,一般设置为可读可写方式
   int dwShareMode,                          // 指定串口的共享模式,串口不能共享,所以设置为0
   int lpSecurityAttributes, // 设置串口的安全属性,WIN9X下不支持,应设为NULL
   int dwCreationDisposition,                // 对于串口通信,创建方式只能为OPEN_EXISTING
   int dwFlagsAndAttributes,                 // 指定串口属性与标志,设置为FILE_FLAG_OVERLAPPED(重叠I/O操作),指定串口以异步方式通信
   int hTemplateFile                        // 对于串口通信必须设置为NULL
   );
  [DllImport("coredll.dll")]
  private static extern bool GetCommState(
   int hFile,  //通信设备句柄
   ref DCB lpDCB    // 设备控制块DCB
   ); 
  [DllImport("coredll.dll")]
  private static extern bool BuildCommDCB(
   string lpDef,  // 设备控制字符串
   ref DCB lpDCB     // 设备控制块
   );
  [DllImport("coredll.dll")]
  private static extern bool SetCommState(
   int hFile,  // 通信设备句柄
   ref DCB lpDCB    // 设备控制块
   );
  [DllImport("coredll.dll")]
  private static extern bool GetCommTimeouts(
   int hFile,                  // 通信设备句柄 handle to comm device
   ref COMMTIMEOUTS lpCommTimeouts  // 超时时间 time-out values
   ); 
  [DllImport("coredll.dll")] 
  private static extern bool SetCommTimeouts(
   int hFile,                  // 通信设备句柄 handle to comm device
   ref COMMTIMEOUTS lpCommTimeouts  // 超时时间 time-out values
   );
  [DllImport("coredll.dll")]
  private static extern bool ReadFile(
   int hFile,                // 通信设备句柄 handle to file
   byte[] lpBuffer,             // 数据缓冲区 data buffer
   int nNumberOfBytesToRead,  // 多少字节等待读取 number of bytes to read
   ref int lpNumberOfBytesRead, // 读取多少字节 number of bytes read
   ref OVERLAPPED lpOverlapped    // 溢出缓冲区 overlapped buffer
   );
  [DllImport("coredll.dll")] 
  private static extern bool WriteFile(
   int hFile,                    // 通信设备句柄 handle to file
   byte[] lpBuffer,                // 数据缓冲区 data buffer
   int nNumberOfBytesToWrite,     // 多少字节等待写入 number of bytes to write
   ref int lpNumberOfBytesWritten,  // 已经写入多少字节 number of bytes written
   ref OVERLAPPED lpOverlapped        // 溢出缓冲区 overlapped buffer
   );
  [DllImport("coredll.dll")]
  private static extern bool CloseHandle(
   int hObject   // handle to object
   );
  [DllImport("coredll.dll")]
  private static extern uint GetLastError();
  
  public void Open()
  {
  
   DCB dcbCommPort = new DCB();
   COMMTIMEOUTS ctoCommPort = new COMMTIMEOUTS(); 
    
   // 打开串口 OPEN THE COMM PORT.
   hComm = CreateFile(PortNum ,GENERIC_READ | GENERIC_WRITE,0, 0,OPEN_EXISTING,0,0);
   // 如果串口没有打开,就打开 IF THE PORT CANNOT BE OPENED, BAIL OUT.
   if(hComm == INVALID_HANDLE_VALUE)
   {
    throw(new ApplicationException("非法操作,不能打开串口!"));
   }
  
   // 设置通信超时时间 SET THE COMM TIMEOUTS.
   GetCommTimeouts(hComm,ref ctoCommPort);
   ctoCommPort.ReadTotalTimeoutConstant = ReadTimeout;
   ctoCommPort.ReadTotalTimeoutMultiplier = 0;
   ctoCommPort.WriteTotalTimeoutMultiplier = 0;
   ctoCommPort.WriteTotalTimeoutConstant = 0; 
   SetCommTimeouts(hComm,ref ctoCommPort);
  
   // 设置串口 SET BAUD RATE, PARITY, WORD SIZE, AND STOP BITS.
   GetCommState(hComm, ref dcbCommPort);
   dcbCommPort.BaudRate=BaudRate;
   dcbCommPort.flags=0;
   //dcb.fBinary=1;
   dcbCommPort.flags|=1;
   if (Parity>0)
   {
    //dcb.fParity=1
    dcbCommPort.flags|=2;
   }
   dcbCommPort.Parity=Parity;
   dcbCommPort.ByteSize=ByteSize;
   dcbCommPort.StopBits=StopBits;
   if (!SetCommState(hComm, ref dcbCommPort))
   {
    //uint ErrorNum=GetLastError();
    throw(new ApplicationException("非法操作,不能打开串口!"));
   }
   //unremark to see if setting took correctly
   //DCB dcbCommPort2 = new DCB();
   //GetCommState(hComm, ref dcbCommPort2);
   Opened = true;
  }
  
  public void Close()
  {
   if (hComm!=INVALID_HANDLE_VALUE)
   {
    CloseHandle(hComm);
   }
  }
  
  public byte[] Read(int NumBytes)
  {
   byte[] BufBytes;
   byte[] OutBytes;
   BufBytes = new byte[NumBytes];
   if (hComm!=INVALID_HANDLE_VALUE)
   {
    OVERLAPPED ovlCommPort = new OVERLAPPED();
    int BytesRead=0;
    ReadFile(hComm,BufBytes,NumBytes,ref BytesRead,ref ovlCommPort);
    try
    {
     OutBytes = new byte[BytesRead];
     Array.Copy(BufBytes,0,OutBytes,0,BytesRead);
    }
    catch
    {
     return BufBytes;
    }
    
   }
   else
   {
    throw(new ApplicationException("串口未打开!"));
   }
   return OutBytes;
   //   return BufBytes;
  }
  
  public void Write(byte[] WriteBytes)
  {
   if (hComm!=INVALID_HANDLE_VALUE)
   {
    OVERLAPPED ovlCommPort = new OVERLAPPED();
    int BytesWritten = 0;
    WriteFile(hComm,WriteBytes,WriteBytes.Length,ref BytesWritten,ref ovlCommPort);
   }
   else
   {
    throw(new ApplicationException("串口未打开!"));
   }  
  }

  public string GetGPS(string strGPS,string strFind)
  {
   ///从GPS中读取的数据中,找出想要的数据
   ///GPSstring原始字符串,
   ///strFind要查找的内容,X:经度,Y:纬度,T:时间,V:速度,是数字从1开始,即以“,”分隔的位置
   ///返回查找到指定位置的字符串
   string handerStr="$GPRMC";//GPS串头
   int findHander=strGPS.IndexOf(handerStr);//看是否含有GPS串头
   if (findHander<0)
   {
    return "-1";
   }
   else
   {
    strGPS=strGPS.Substring(findHander,strGPS.Length-findHander);
    string[] ArryTmp=strGPS.Split(",".ToCharArray());
    try
    {
     if(ArryTmp[2]=="V")
     {
      return "V";//没有信号
     }
     else
     {
      switch(strFind)
      {
       case "X":
        return DM2DD(ArryTmp[5]);
        
       case "Y":
        return DM2DD(ArryTmp[3]);
        
       case "T":
        return T2Time(ArryTmp[9],ArryTmp[1]);
        
       case "V":
        return Convert.ToString(Convert.ToDouble(ArryTmp[7])* 1.852);
        
       default:
        return "V";
        
      }
     }
    }
    catch
    {
     return "V";
    }
   }
  }

  public string T2Time(string strDate,string strTime)
  {
   string dT="20"+strDate.Substring(4,2)+"-"+strDate.Substring(2,2)+"-"+strDate.Substring(0,2);
   string TT=Convert.ToString(Convert.ToInt32(strTime.Substring(0,2)))+":"+strTime.Substring(2,2)+":"+strTime.Substring(4,2);
   DateTime T=Convert.ToDateTime(dT+" "+TT);
   T=T.AddHours(8);
   return T.ToString();
  }

  public string DM2DD(string DegreeMinutes)
  {
   //转换NMEA协议的“度分”格式为十进制“度度”格式
   string sDegree;
   string sMinute;
   string sReturn="";
   if(DegreeMinutes.IndexOf(".")==4)
   {
    //DegreeMinutes = Replace(DegreeMinutes, ".", "")
    //DM2DD = CDbl(Left(DegreeMinutes, 2)) + CDbl(Left(CStr(CDbl(Right(DegreeMinutes, Len(DegreeMinutes) – 2)) / 60), 8)) / 10000
    DegreeMinutes=DegreeMinutes.Replace(".","");
    double sDegree1=Convert.ToDouble(DegreeMinutes.Substring(0,2));
    double sDegree2=Convert.ToDouble(DegreeMinutes.Substring(2,DegreeMinutes.Length-2));
    string sTmp=Convert.ToString(sDegree2/60);
    sDegree2=Convert.ToDouble(sTmp.Substring(0,sTmp.Length));
    sDegree2=sDegree2/10000;
    sDegree=Convert.ToString(sDegree1+sDegree2);
    if(sDegree.Length>11)
     sDegree=sDegree.Substring(0,11);
    sReturn=sDegree;
   }
   else if(DegreeMinutes.IndexOf(".")==5)
   {
    //DegreeMinutes = Replace(DegreeMinutes, ".", "")
    //DM2DD = CDbl(Left(DegreeMinutes, 2)) + CDbl(Left(CStr(CDbl(Right(DegreeMinutes, Len(DegreeMinutes) – 2)) / 60), 8)) / 10000
    DegreeMinutes=DegreeMinutes.Replace(".","");
    double sMinute1=Convert.ToDouble(DegreeMinutes.Substring(0,3));
    double sMinute2=Convert.ToDouble(DegreeMinutes.Substring(3,DegreeMinutes.Length-2));
    string sTmp=Convert.ToString(sMinute2/60);
    sMinute2=Convert.ToDouble(sTmp.Substring(0,sTmp.Length));
    sMinute2=sMinute2/10000;
    sMinute=Convert.ToString(sMinute1+sMinute2);
    if(sMinute.Length>10)
     sMinute=sMinute.Substring(0,10);
    sReturn=sMinute;
   }
   return sReturn;
  }

  public bool ScanPort()
  {
   
   try
   {
    if (Opened)
    {
     Close();
     Open();
    }
    else
    {
     Open();//打开串口
     
    }
    byte[] bytRead=Read(512);
    Close();
    if(Encoding.ASCII.GetString(bytRead,0,bytRead.Length).IndexOf("$GP")>=0)
     return true;
    else
     return false;
   }
   catch
   {
    return false;
   }

  }
 }

 class HexCon
 {
  // 把十六进制字符串转换成字节型和把字节型转换成十六进制字符串 converter hex string to byte and byte to hex string
  public static string ByteToString(byte[] InBytes)
  {
   string StringOut="";
   foreach (byte InByte in InBytes)
   {
    StringOut=StringOut + String.Format("{0:X2} ",InByte);
   }
   return StringOut;
  }
  public static byte[] StringToByte(string InString)
  {
   string[] ByteStrings;
   ByteStrings = InString.Split(" ".ToCharArray());
   byte[] ByteOut;
   ByteOut = new byte[ByteStrings.Length-1];
   for (int i = 0;i==ByteStrings.Length-1;i++)
   {
    ByteOut[i] = Convert.ToByte(("0x" + ByteStrings[i]));
   }
   return ByteOut;
  }
 }
}

在别的class中调用时如Frmlogoin(是通过一个时间控件来循环的)

public class Frmlogin : System.Windows.Forms.Form
 {

private GPS ss_port=new GPS();

}

#region 读取GPS
  private void opengps(string ComPoint)
  {
   ss_port.PortNum = ComPoint;
   ss_port.BaudRate = 4800;
   ss_port.ByteSize = 8;
   ss_port.Parity = 0;
   ss_port.StopBits = 1;
   ss_port.ReadTimeout = 1000;

   try
   {
    if (ss_port.Opened)
    {
     ss_port.Close();
     ss_port.Open();
     timer1.Enabled=true;
    }
    else
    {
     ss_port.Open();//打开串口
     timer1.Enabled=true;
    }
    
   }
   catch
    
   {
//    MessageBox.Show("读取GPS错误!" ,"系统提示");
    
   }
  }
  private void timer1_Tick(object sender, System.EventArgs e)
  {
   
   if (ss_port.Opened)
    gpsread();
   else
    ss_port.Open();//打开串口
  }
  
  private void gpsread()
  {
   byte[] aa=ss_port.Read(512);
   string gpsinfo =System.Text.Encoding.ASCII.GetString(aa,0,aa.Length);
   GetParam.GpsLongitude=ss_port.GetGPS(gpsinfo,"X");
   GetParam.GpsLatitude=ss_port.GetGPS(gpsinfo,"Y");
   GetParam.GpsSpeed=ss_port.GetGPS(gpsinfo,"V");
   GetParam.GpsTime=ss_port.GetGPS(gpsinfo,"T");
   if(GetParam.GpsLongitude=="-1")
    GetParam.GpsState="0";
   if(GetParam.GpsLongitude=="V" && GetParam.GpsLatitude=="V")
    GetParam.GpsState="0";
   if(GetParam.GpsLongitude!="-1" && GetParam.GpsLongitude!="V")
    GetParam.GpsState="1";

    GetParam.GpsLongitude=(GetParam.GpsLongitude=="V") ? "0" : GetParam.GpsLongitude;
    GetParam.GpsLatitude=(GetParam.GpsLatitude=="V") ? "0" : GetParam.GpsLatitude;
    GetParam.GpsSpeed=(GetParam.GpsSpeed=="V") ? "0" : GetParam.GpsSpeed;
    GetParam.GpsTime=(GetParam.GpsTime=="V") ? "0" :GetParam.GpsTime;
   
  }
  private void GpsClose()
  {
   timer1.Enabled=false;
   if (ss_port.Opened)
    ss_port.Close();
  }
  #endregion

Holux GR 236 Bluetooth GPS Receiver SiRF III PDA

这几天实在是太忙了,发生了N多事情,唉。不想提了,说点其它的吧。

前几天到Ebay的英文网站逛了一下,发现国外的 Holux GR 236 Bluetooth GPS Receiver SiRF III PDA Laptop 比国内的便宜多了。竟拍的话,500元以内就可以买到了。而在国内买的话,要8xx才可以买到。所以就试着拍了一下,结果还拍到了。为29.00英镑,换为人民币的话大概29.00 x 14.80 = 429.2,还是比较划的来的。但是运费就贵了,要付12.99英镑的运费。等于就是200元的运费了。通过信用卡在网上通过Paypal付了费,折合成美元是$81.12,收了一部分的手续费。现在钱是付了,但是不知道什么时候才可以收到货了。我是在7月25日付的款。看看什么时候可以拿到。

Holux GPSlim236 Bluetooth GPS Receiver

Manufacturer‘s Warranty: 1 year

Product Code: Holux GPSlim236

Wireless connectivity allows you to place the GPS receiver in an optimal position, while easily viewing and accessing your PDA or PC. The SiRF Star-III chipset and 20 parallel satellite-tracking channels ensure high sensitivity and fast acquisition and reacquisition.

Don‘t bother with bulky plug-in receivers and cables — turn any Bluetooth-enabled PDA, PC, or smart phone into a GPS navigation system with this tiny, super-sensitive, super-fast GPS receiver!

This GPS receiver works with any Bluetooth-enabled mobile computer that runs NMEA-compatible GPS software or the included flash-based software. A mini-USB port means you can also use this receiver as a GPS mouse for use with non-Bluetooth devices. A built-in rechargeable Li-ion battery means no need to plug in power capbles for at least 10 hours.

Compare our prices with other sellers and save!

  • Package Includes: Holux GPSlim236 Bluetooth GPS receiver, AC power adapter (EU round two-prong; U.S., Aus, and UK plug adaptors included), Cigarette lighter power adaptor, CD with Windows and Pocket PC drivers (navigation software not included), Quick Installation Guide, Removable rechargeable Li-ion battery.
  • Dimensions: 46.3 x 67 x 19 mm
  • Weight: 56g
    Performance
  • Channels: 20 parallel channels
  • Frequency: L1, 1575.42MHz, C/A code
  • Acquisition Times: Cold start – 42 seconds (avg), warm start – 38 seconds (avg), hot start – 1 second, re-acquitision – 0.1 sec (avg)
  • Position Accuracy: Position: 5-25m CEP without SA, Velocity: 0.1m/sec, Time: 1&micro;sec sync GPS time
  • Minimum signal tracked: -159dBm
  • Altitude Sensitivity: Maximum 18,000m (60,000 feet)
  • Velocity Dynamics: Maximum 515m/sec (700 knots)
  • Acceleration Dynamics: +/- 4G
  • Jerk: Maximum 20m/sec
  • Chipset: SiRF Star-III
    Bluetooth
  • Bluetooth version 1.1 compliant
  • Bluetooth™ Class 2 operation (up to 10 meter range)
  • Frequency: 2.400 to 2.480 GHz
  • Modulation: FHSS/GFSK
  • RF channels: 79
    Environmental Conditions
  • Operating Temperature Range: -10°C to 60°C
  • Storage Temperature Range: -20°C to 85°C
  • Humidity: 5% to 95%. No condensing.
    Other Specifications
  • Baud Rate: 38.4kbps
  • I/O Protocols: NMEA v2.2 (optional v3.0). GGA, GSA, GSV, RMC, VTP. Optional: GGL, SiRF Binary
    Compatible with (not a comprehensive list):
  • HP iPAQ 64Mb Bluetooth
  • Mobile HP iPAQ rx3715 Companion
  • HP iPAQ hx4700
  • HP iPAQ h2210 64MB
  • QTEK 9090
  • QTEK S100
  • PalmOne Treo 650 SmartPhone
  • PalmOne Tungsten T5 256Mb
  • PalmOne Mobile LifeDrive Manager
  • Nokia 6600
  • Nokia 7710
  • i-mate SP3
  • TomTom 3
  • TomTom 5

 

 

图片附件:
gpslim236_01.jpg

GPS软件下载

因为现在把yngps.cn转到了新站点,一些老的软件下载地址就不好找了。我发它发到我的Blog上吧,大家也好Download:

 

 

地图下载

昆明交通图
昆明百姓生活休闲旅游图(农家乐地图)
昆明地区地图(四区八县)
云南交通图

上面OZI格式的地图都是经过校准的

 

   

 

 

OZI轨迹下载

 

城际通PC版,附特殊文件:
ftp://ftp.yngps.cn/CJT.zip

灵图3.05 PPC绿色版,Copy到卡即可使用。让输入序列号的话随便输入
ftp://ftp.yngps.cn/LT_3_05_10_For_PPC.rar

中国电子地图2005
ftp://ftp.yngps.cn/MapChina.2005.rar

中国电子地图2006
ftp://ftp.yngps.cn/MapChina2006.zip

北京电子地图2006
ftp://ftp.yngps.cn/bjmap2006.rar

广州电子地图
ftp://ftp.yngps.cn/gzmap.iso

以上软件仅作个人测试用,如要使用请购买正版软件。