📄 gps-.c
字号:
============================================
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h> //文件控制定义
#include <unistd.h> //Unix 标准函数定义
#include <termios.h> //PPSIX 终端控制定义 //结构体termios,
struct termios{ unsigned short c_iflag; //输入模式标志
unsigned short c_cflag; //控制模式标志
unsigned short c_lflag; //本地模式标志
unsigned char c_line; //控制协议
unsigned char c_cc[NCCS] //控制字符}
#include <errno.h> //错误号定义
static int g_nErrorCode = 0;
char TestMode4[15] = //切换sirf至mode 4
{0xA0, 0xA2,
0x00, 0x07, // payload length
0x96, // 150,switch operation mode
0x1E ,0x54, // test mode 4
0x00, 0x14, // SvID on simulator (21..) MUST match simulator
0x00, 0x0A, // Period, tracking period 10 sec
0x01, 0x15, // checksum --> (add all payload) % 0x07ff
0xb0, 0xb3};
unsigned char SwitchToSirf[] = //切回nmea协议命令
{ 0xa0, // KILL THIS BYTE
0xa2,0x00,0x18, // start sequence and payload length
0x81, // message ID dec 129, switch to NMEA
0x02, // Mode
0x01,0x01, // GGA
0x00,0x01, // GLL
0x01,0x01, // GSA
0x05,0x01, // GSV
0x01,0x01, // RMC
0x00,0x01, // VTG
0x00,0x01, // MSS
0x00,0x01, // unused
0x00,0x01, // ZDA
0x00,0x01, // unused
0x12,0xc0, // baudrate 4800
0x01,0x67, // msg checksum
0xb0,0xb3 // end sequence
};
//切换至sirf协议的nmea报文(两种报文对应波特率不同)
char *SwitchToNMEA = "$PSRF100,0,57600,8,1,0*XX\r\n";
char *SwitchToNMEA4800 = "$PSRF100,0,4800,8,1,0*XX\r\n";
//char *pMsg;
int GPS_InfoProcess(char* info)
{
int dwCNOMean = 0;
dwCNOMean=*((unsigned short*)&info[23]);
printf("CNOMean = %d\n", dwCNOMean);
return dwCNOMean;
}
static int GPS_DataReceive(int nProtocol)
{
struct termios options; //终端特性变量定义及初始化
int fd, Rt, recv_len, fd_sel;
//fd_set fd_gps, fd_sel;
struct timeval tv; //定义超时控制结构
fd_set fds; //文件描述符集合变量
char buf[1024];
int i, nReadIndex = 0, bHeaderOK = 0, nWriteIndex = 0;
static char m_sMessage_ID46Buffer[60];
const char acMessge2E[5] = { 0xa0, 0xa2, 0x00, 0x33, 0x2e }; // 2E Test Mode 3/4 - Message ID 46
long nSeconds = time(NULL);
printf("Start Time: %d\n", nSeconds);
long nBegin;
fd = open("/dev/ttyS1", O_RDWR); //打开串口
printf("Get fd: %d\n", fd);
if (-1 == fd) // 不能打开串口一
{
perror("Can't Open Port!\n");
g_nErrorCode = 1;
}
if (tcgetattr ( fd, &options) == -1) //获取当前设备方式
{
printf("Cannot get GPS configuration!\n");
g_nErrorCode = 2;
return 0;
}
cfsetispeed(&options,B4800); //设置输入为4800Bps
cfsetospeed(&options,B4800); //设置输出为4800Bps
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
options.c_oflag &= ~OPOST;
if (tcsetattr ( fd, TCSANOW, &options) == -1) //设置波特率
{
printf("Cannot set GPS configuration!\n");
g_nErrorCode = 3;
return 0;
}
tv.tv_sec = 5;
tv.tv_usec = 0;
FD_ZERO(&fds);
FD_SET(fd, &fds);
/*fd_sel = select(fd+1, &fds, NULL, NULL, &tv);
if (fd_sel == 0)
{
printf("Select Failed!\n");
g_nErrorCode = 4;
return 0;
}*/
Rt = write(fd, SwitchToSirf, strlen(SwitchToSirf));
if(Rt == -1)
{
printf("Switch to Sirf failed!\n");
g_nErrorCode= 5 ;
return 0;
}
printf("Switch OK\n");
nBegin = time(NULL);
while (time(NULL) - nBegin < 1);
Rt = write(fd, TestMode4, strlen(TestMode4));
if(Rt == -1)
{
printf("Switch test mode 4 failed!\n");
g_nErrorCode = 6;
return 0;
}
printf("Mode 4 OK\n");
nBegin = time(NULL);
while (time(NULL) - nBegin < 1);
while(time(NULL) - nSeconds <= 35)
{
//printf("Time: %d\n", time(NULL));
if (FD_ISSET(fd, &fds))
{
printf("Data in\n");
recv_len = read(fd, buf, 200);
printf("%s\n", buf);
printf("length: %d", recv_len);
if (recv_len > 0)
{
for (i = 0;i < recv_len;i++)
{
m_sMessage_ID46Buffer[i + nWriteIndex] = buf;
//nWriteIndex++;
}
nWriteIndex += recv_len;
while (!bHeaderOK && (nReadIndex != nWriteIndex))
{
if (m_sMessage_ID46Buffer[nReadIndex] == acMessge2E[nReadIndex])
{
nReadIndex++;
if (nReadIndex == 5)
bHeaderOK = 1;
}
else {
for (i = 0;i < nWriteIndex - nReadIndex + 1;i++)
{
m_sMessage_ID46Buffer = m_sMessage_ID46Buffer[nReadIndex + i];
}
nReadIndex = 0;
nWriteIndex = i;
break;
}
}
if (nWriteIndex - 8 >= 0x33)
{
if (m_sMessage_ID46Buffer[58] != 0xB3 || m_sMessage_ID46Buffer[57] != 0xB0)
{
printf("Receiving Error gps data.\n");
g_nErrorCode = 7;
break;
}
else
{
return GPS_Info_Process(m_sMessage_ID46Buffer) >= 43.5;
}
}
}
}
//printf("No data\n");
}
if(time(NULL) - nSeconds > 35) g_nErrorCode = 8; // timeout
sleep(1);
close(fd);
return 0;
}
int main(int argc,char *argv[])
{
int nProtocol = 0;
if (argc >= 1)
{
if (argv[0] == "nmea") nProtocol = 1;
else if (argv[0] == "sirf") nProtocol = 0;
}
printf("---GPS Dump Test---\n");
printf("---GPS Dump Test: %s ---\n", GPS_DataReceive(nProtocol) ? "SUCCEEDED" : "FAILED");
return g_nErrorCode;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -