请问怎么从串口读取GPS的数据

请教如何从串口读取GPS的数据?
用多线程来实现,最初的目的是收到GPS接收器主动发送过来的信息,在屏幕上面打印出来,用工具查看是:
$GPGGA,,,,,,1,00,,,M,,M,,*67
$GPVTG,,T,,,,N,,K*03
$GPGGA,,,,,,1,00,,,M,,M,,*67
$GPVTG,,T,,,,N,,K*03
请教如何能把这些数据读到内存变量中以进行下一步的解码,谢谢!小弟刚接触串口编程,最好有代码,参考下,没代码给点思路也行...

------解决方案--------------------
GPS的我没做过,不过我做过其它的,数据格式应该差不多,都是ascii码的指令和返回数据。每个数据包应该都是有个结束字符的,具体是哪个看协议,你在收到的数据中寻找结束字符,然后把结束字符前的数据存在字符串中,这就是一条数据,如:$GPGGA,,,,,,1,00,,,M,,M,,*67

你再处理这个字符串获取你需要的数据。最好写一个类用来处理每条数据,用来进行数据校验,获取相应字段的值,如GetInt(5)就是1,GetString(9)就是M。
------解决方案--------------------
这个我做过,你的GPS设备是通过虚拟串口连接的吗?你可以通过串口读取数据
BOOL CComPort::OpenConn(int n)
{
TCHAR szComPort[20];

memset(szComPort,0,sizeof(szComPort));
if(n<10)
wsprintf(szComPort,_T("COM%d:"),n);
else
wsprintf(szComPort,_T("\\\\.\\COM%d:"),n);
if(m_hComPort == INVALID_HANDLE_VALUE)
m_hComPort = CreateFile(szComPort,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(m_hComPort != INVALID_HANDLE_VALUE)
{
//设置通讯参数
GetCommState(m_hComPort, &m_DCB); /* 读取串口的DCB */
m_DCB.BaudRate = CBR_9600;
m_DCB.ByteSize = 8;
m_DCB.Parity = NOPARITY;
m_DCB.StopBits = ONESTOPBIT;
m_DCB.fParity = FALSE; /* 禁止奇偶校验 */
m_DCB.fBinary = TRUE;
m_DCB.fDtrControl = 0; /* 禁止流量控制 */
m_DCB.fRtsControl = 0;
m_DCB.fOutX = 0;
m_DCB.fInX = 0;
m_DCB.fTXContinueOnXoff = 0;
SetCommState(m_hComPort,&m_DCB);

//设置超时参数
GetCommTimeouts(m_hComPort, &m_CommTimeOuts);
m_CommTimeOuts.ReadIntervalTimeout = 100; /* 接收字符间最大时间间隔 */
m_CommTimeOuts.ReadTotalTimeoutMultiplier = 1;
m_CommTimeOuts.ReadTotalTimeoutConstant = 100; /* 读数据总超时常量 */
m_CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
m_CommTimeOuts.WriteTotalTimeoutConstant = 0;
SetCommTimeouts(m_hComPort, &m_CommTimeOuts);

//设置状态参数
SetCommMask(m_hComPort, EV_RXCHAR);
SetupComm(m_hComPort, 16384, 16384);// 设置缓冲区大小

PurgeComm(m_hComPort, PURGE_TXCLEAR | PURGE_RXCLEAR); /* 清除收/发缓冲区 */
m_bOpen = TRUE;
}
else
return FALSE;

return TRUE;
}


int CComPort::Com_Read(BYTE * byteData,UINT nLen)
{
DWORD dwError;
DWORD dwReadNum;
DWORD dwActReadNum;
COMSTAT comstat;
int nRead = 0;

ClearCommError(m_hComPort,&dwError,&comstat);
dwReadNum=comstat.cbInQue;
if(dwReadNum > 0)
{
if(dwReadNum >= nLen)
nRead = nLen;
else
nRead = dwReadNum;
ReadFile(m_hComPort,byteData,nRead,&dwActReadNum,NULL);
}

return dwActReadNum;
}


这个两个是打开和读取的代码,自己参考下
------解决方案--------------------
探讨
引用:
引用:
引用:
这些数据是明文的
你用串口助手就能看到
自己写的话每句的末尾是"\r\n"

我能看到数据,也会处理字符串,也会提取信息,关键是如何接收从串口过来的数据,以前没做过串口编程


原来如此
随便找个串口的例子就可以了
VC知识库上有很多

讲个思路就行了,我用的是现成的函数,直接调用就行了,具体的我再自己敲