首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Windows Mobile >

Wince怎么调用GPS获取经纬度

2012-05-03 
Wince如何调用GPS获取经纬度Wince使用.net C#如何调用GPS获取经纬度[解决办法]是串口的吗?从串口读啊。[解

Wince如何调用GPS获取经纬度
Wince使用.net C#如何调用GPS获取经纬度

[解决办法]
是串口的吗?从串口读啊。
[解决办法]
可以通过串口,但是需要自己解析数据;
用SDK提供的GPS相关的API也可。
[解决办法]
公用类?

当然没有,因为GPS硬件和协议各不相同,一般是直接从串口来分析NEMA信息的。
[解决办法]
/// <summary>
/// 打开串口
/// </summary>
public bool 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);

hComm = CreateFile(string.IsNullOrEmpty(GPSParam.PortNum)?GetGPSport():GPSParam.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("非法操作,不能打开串口!"));
return false;
}

// 设置通信超时时间 SET THE COMM TIMEOUTS.
GetCommTimeouts(hComm, ref ctoCommPort);
ctoCommPort.ReadTotalTimeoutConstant = GPSParam.ReadTimeout;// 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 = GPSParam.BaudRate;// BaudRate;
dcbCommPort.flags = 0;
//dcb.fBinary=1;
dcbCommPort.flags |= 1;
if (GPSParam.Parity > 0)//Parity
{
//dcb.fParity=1
dcbCommPort.flags |= 2;
}
dcbCommPort.Parity = GPSParam.Parity;// Parity;
dcbCommPort.ByteSize = GPSParam.ByteSize;// ByteSize;
dcbCommPort.StopBits = GPSParam.StopBits;// StopBits;
if (!SetCommState(hComm, ref dcbCommPort))
{
//uint ErrorNum=GetLastError();
//throw (new ApplicationException("非法操作,不能打开串口!"));
return false;
}
//unremark to see if setting took correctly
//DCB dcbCommPort2 = new DCB();
//GetCommState(hComm, ref dcbCommPort2);
Opened = true;
return true;
}
/// <summary>
/// 关闭端口
/// </summary>
public void Close()
{
if (hComm != INVALID_HANDLE_VALUE)
{
CloseHandle(hComm);
}
Opened = false;
}
/// <summary>
/// 读原始字节
/// </summary>
/// <returns></returns>
public byte[] Read()
{
byte[] BufBytes;
byte[] OutBytes;
BufBytes = new byte[GPSParam.NumBytes];
if (hComm != INVALID_HANDLE_VALUE)
{
OVERLAPPED ovlCommPort = new OVERLAPPED();
int BytesRead = 0;
ReadFile(hComm, BufBytes,GPSParam.NumBytes, ref BytesRead, ref ovlCommPort);
try
{
OutBytes = new byte[BytesRead];
Array.Copy(BufBytes, 0, OutBytes, 0, BytesRead);
}
catch
{
return BufBytes;
}

}
else
{
return null;//throw (new ApplicationException("串口未打开!"));
}
return OutBytes;
// return BufBytes;
}

/// <summary>
/// 从GPS中读取的数据中,返回“V”为无信号。strFind要查找的内容,X:经度,Y:纬度,T:时间,V:速度,是数字从1开始,即以“,”分隔的位置返回查找到指定位置的字符串
/// </summary>
/// <param name="strFind"></param>
/// <returns></returns>
public string GetGPS(string strFind)
{
string strGPS = ReadStr();



int findHander = strGPS.IndexOf(handerStr); //看是否含有GPS串头
if (findHander < 0)
{
return "-1";
}
strGPS = strGPS.Substring(findHander, strGPS.Length - findHander);
string[] ArryTmp = strGPS.Split(",".ToCharArray());
try
{
//暂时当作有信号处理
if (!GPSParam.GPSTest)// GPSTest)
{
if (ArryTmp[2] == "V")
{
return "V"; //没有信号
}
}
else
{
switch (strFind)
{
case "X": //lng经度
return DM2DD(ArryTmp[5]);

case "Y": //lat纬度
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 //(Exception ex)
{
return "V";
}
return "V";
}

热点排行