请问怎么从串口读取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;
}
这个两个是打开和读取的代码,自己参考下
------解决方案--------------------
用多线程来实现,最初的目的是收到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;
}
这个两个是打开和读取的代码,自己参考下
------解决方案--------------------