GPS資訊中提取經緯度座標資訊
阿新 • • 發佈:2019-02-02
1 、NMEA0183通訊協議
NMEA0183是GPS資料的通訊協議,GPS的通訊協議有很多種,但目前絕大多數GPS模組生產廠商都採用NMEA0183協議作為其遵循的標準。
(1)NMEA0183的通訊引數.波特率:4800baud;資料位:8;奇偶校驗:無;停止位:1位.
(2)NMEA0183的報文格式.NMEA 0183協議報文的語句串(ASCII字元)格式全部資訊.
詳情參考:
NMEA0183通訊協議詳細解釋或者《visual C++程式設計例項寶典》第29章GPS定位系統
2、GPS 串列埠初始化
串列埠初始化程式主要定義波特率等引數
在MFC程式中,在OnInitDialog()函式中初始化串列埠.
對串列埠的操作, 用mscomm控制元件完成 mscomm控制元件註冊
控制元件使用
//初始化
void OnInitCOMInf()
{
if (!m_mscom.get_PortOpen()) //初始化串列埠
{
m_mscom.put_CommPort(4); //選擇串列埠
m_mscom.put_InputMode(1); //設定輸入方式為二進位制方式
m_mscom.put_Settings(_T("9600")); //波特率為(波特率組A合框)無校驗,8資料位,1個停止位
m_mscom.put_InputLen(1024); //設定當前接收區資料長度為1024
m_mscom.put_RThreshold(1); //緩衝區一個字元引發事件
m_mscom.put_RTSEnable(1); //設定RT允許
m_mscom.put_PortOpen(true); //開啟串列埠
}
}
3、NMEA0183通訊協議下,GPS經緯度和高度資訊的提取
此步驟是對字串的處理。在共用體GPSPack中,定義了協議解析有關的額結構變數,如:結構體tagBODY_NEMA_TEXT中儲存有NEMA文字格式的協議資料項,經度座標、緯度座標、三維速度等。開發中常用這些資訊。作者僅僅為了方便使用,在科研中學習,所以用了對字串的操作來接受和提取資訊。
CString m_longitude;//經度
CString m_latitude;//緯度
CString m_altitude;//海拔高度
/*...............串列埠響應函式..............*/
BEGIN_EVENTSINK_MAP(CKilometerPostDlg, CDialog)
ON_EVENT(CKilometerPostDlg, IDC_MSCOMM1, 1, CKilometerPostDlg::OnCommMscomm1, VTS_NONE)
END_EVENTSINK_MAP()
void CKilometerPostDlg::OnCommMscomm1()
{
// TODO: 在此處新增訊息處理程式程式碼
//判斷是否有資料接受
if (m_mscom.get_CommEvent() == 2)
{
int nIndex = 0;
int nTokenPos = 0;
char str[1024] = { 0 };
long k;
VARIANT InputData = m_mscom.get_Input(); //讀緩衝區
COleSafeArray fs;
fs = InputData; //VARIANT型變數轉換為COleSafeArray型變數
for (k = 0; k < fs.GetOneDimSize(); k++)
fs.GetElement(&k, str + k); //轉換為BYTE型陣列
m_strlineBuffer += str;
CString strToken = m_strlineBuffer.Tokenize(_T(","), nTokenPos);//以逗號作為分隔符
while (!strToken.IsEmpty())
{
if (0 == nIndex && strToken != _T("$GPGGA")) break; //不是需要的行
if (2 == nIndex)
{
m_latitude = strToken;
m_latitude = m_latitude.Left(7);
m_strlineBuffer += CString(_T("\n "));
//更新介面
// UpdateData(FALSE);
//break;
}
if (4 == nIndex)
{
m_longitude = strToken;
m_longitude = m_longitude.Left(7);//取字串的前7個字元
m_strlineBuffer += CString(_T("\n "));
//更新介面
// UpdateData(FALSE);
//break;
}
if (9 == nIndex)
{
m_altitude = strToken;
m_strlineBuffer += CString(_T("\n "));
//更新介面
// UpdateData(FALSE);
break;
}
strToken = m_strlineBuffer.Tokenize(_T(","), nTokenPos);
++nIndex;
}
//清零一行資料,以便重新記錄
m_strlineBuffer = "";
//UpdateData(false);
}
}