这个写的问题解决了:是在read的基础上一步步改的,结果要write而open没有给write的权限。
但是Ublox_Cfg_Ack_Check();找不到同步码。
还有另外一个问题,就是解析GPRMC时,头三条能解析出来,后面好像一直就截不到GPRMC这个字符串了;但原始数据是正常接收的。不知道是什么原因。相关代码,有点多,没贴完,帮忙看一下,谢谢。我感觉可能是我读数据的方式有些问题。
[mw_shl_code=c,true]#define ORG_GPS 1
#define FUNC_QUIT 8
#define PARSE 9
#define Max_Tx_Len 200
unsigned char Tx_Buf[Max_Tx_Len];
#define PACKED __attribute__( ( packed, aligned( 1 ) ) )
typedef struct
{
unsigned short int header; //cfg header,固定为0X62B5(小端模式)
unsigned short int id; //CFG RATE ID:0X0806 (小端模式)
unsigned short int dlength; //数据长度
unsigned short int measrate; //测量时间间隔,单位为ms,最少不能小于200ms(5Hz)
unsigned short int navrate; //导航速率(周期),固定为1
unsigned short int timeref; //参考时间:0=UTC Time;1=GPS Time;
unsigned char cka; //校验CK_A
unsigned char ckb; //校验CK_B
}PACKED _ublox_cfg_rate;
int read_GPS_datas(int fd, char *rcv_buf)
{
unsigned char buf[1];
int ret = 1;
int pos = 0;
int rval;
while(ret){
ret = read(fd, buf, 1);
if(ret == -1){
rval = 0;
break;
}
else if(ret>0){
rcv_buf[pos] = buf[0];
if(rcv_buf[pos-1] == '\n' && rcv_buf[pos-2] == '\r'){
pos = 0;
rval = 1;
break;
}
else pos++;
}
}
return rval;
}
unsigned char NMEA_Comma_Pos(unsigned char *buf, unsigned char x)
{
unsigned char *p = buf;
while(x)
{
if(*buf == '*' || *buf < ' ' || *buf > 'z') return 0XFF;
if(*buf == ',') x--;
buf++;
}
return buf-p;
}
unsigned int NMEA_Pow(unsigned char m,unsigned char n)
{
unsigned int result=1;
while(n--)result*=m;
return result;
}
int NMEA_Str2num(unsigned char *buf,unsigned char*comma_bit)
{
unsigned char *p=buf;
unsigned int ires=0,fres=0;
unsigned char ilen=0,flen=0,i;
unsigned char mask=0;
int res;
while(1) //得到整数和小数的长度
{
if(*p=='-'){mask|=0X02;p++;}//是负数
if(*p==','||(*p=='*'))break;//遇到结束了
if(*p=='.'){mask|=0X01;p++;}//遇到小数点了
else if(*p>'9'||(*p<'0')) //有非法字符
{
ilen=0;
flen=0;
break;
}
if(mask&0X01)flen++;
else ilen++;
p++;
}
if(mask&0X02)buf++; //去掉负号
for(i=0;i<ilen;i++) //得到整数部分数据
{
ires+=NMEA_Pow(10,ilen-1-i)*(buf-'0');
}
if(flen>5)flen=5; //最多取5位小数
*comma_bit=flen; //小数点位数
for(i=0;i<flen;i++) //得到小数部分数据
{
fres+=NMEA_Pow(10,flen-1-i)*(buf[ilen+1+i]-'0');
}
res=ires*NMEA_Pow(10,flen)+fres;
if(mask&0X02)res=-res;
return res;
}
unsigned char Ublox_Cfg_Ack_Check(int fd)
{
unsigned char buf[200];
unsigned short int len = 0, i;
unsigned char rval = 0;
if(read_GPS_datas(fd, buf)){
len = sizeof(buf);
for(i =0; i < len; i++){
if(buf == 0XB5) break; //
}
if(i == len) rval = 2; //not found sync char
else if (buf[i+3] == 0X00) rval = 3;//receive NAK
else rval = 0;
}
else rval = 1;
return rval;
}
unsigned char Ublox_Cfg_Rate(int fd, unsigned short int measrate,unsigned char reftime)
{
_ublox_cfg_rate *cfg_rate=(_ublox_cfg_rate *)Tx_Buf;
if(measrate<200)return 1; //小于200ms,直接退出
cfg_rate->header=0X62B5; //cfg header
cfg_rate->id=0X0806; //cfg rate id
cfg_rate->dlength=6; //数据区长度为6个字节.
cfg_rate->measrate=measrate;//脉冲间隔,us
cfg_rate->navrate=1; //导航速率(周期),固定为1
cfg_rate->timeref=reftime; //参考时间为GPS时间
Ublox_CheckSum((unsigned char*)(&cfg_rate->id),sizeof(_ublox_cfg_rate)-4,&cfg_rate->cka,&cfg_rate->ckb);
if(write(fd, (unsigned char *)cfg_rate, sizeof(_ublox_cfg_rate)) != sizeof(_ublox_cfg_rate)){printf("x\r\n");return 1;}
return Ublox_Cfg_Ack_Check(fd);
}
void GPS_original_signal(int fd)
{
char rcv_buf[2048];
while (1)
{
bzero(rcv_buf,sizeof(rcv_buf));
{
if (read_GPS_datas(fd,rcv_buf))
{
printf("%s",rcv_buf);
}
}
}
}
void NMEA_Parse(int fd)
{
unsigned char rcv_buf[256];
unsigned char *buf_head;
unsigned char comma_pos;
unsigned char comma_bit;
int temp;
float rs;
nmea_msg gpsx;
while(1){
bzero(rcv_buf, sizeof(rcv_buf));
if(read_GPS_datas(fd, rcv_buf)){
buf_head = (unsigned char *)strstr((const char *)rcv_buf, "GPRMC");
if(buf_head){
comma_pos = NMEA_Comma_Pos(buf_head,1);
if(comma_pos != 0XFF){
temp=NMEA_Str2num((buf_head + comma_pos),&comma_bit);
gpsx.utc.hour=temp/1000000;
gpsx.utc.min=(temp%1000000)/10000;
gpsx.utc.sec=(temp%10000)/100;
gpsx.utc.msec=temp%100;
printf("%02d:%02d:%02d.%02d\r\n",gpsx.utc.hour,gpsx.utc.min,gpsx.utc.sec,gpsx.utc.msec);
}
}
}
}
}
void print_prompt(void)
{
printf ("Select what you want to read:\n");
printf ("1 : Original GPS datas\n");
printf ("8 : Quit\n");
printf ("9 : Parse\n");
printf (">");
}
void func_GPS(int fd)
{
int flag_func_run;
int flag_select_func;
ssize_t ret;
flag_func_run = FUNC_RUN;
while (flag_func_run == FUNC_RUN)
{
print_prompt(); // print select functions
scanf("%d",&flag_select_func); // user input select
getchar(); // get ENTER <LF>
switch(flag_select_func)
{
case ORG_GPS : {GPS_original_signal(fd); break; }
case FUNC_QUIT :
{
flag_func_run = FUNC_NOT_RUN;
printf("Quit GPS function. byebye\n");
break;
}
case PARSE : {NMEA_Parse(fd); break; }
default :
{
printf("please input your select use 1 to 8\n");
}
}
}
}
int main(void)
{
int fd;
unsigned char sta;
fd = open("/dev/ttySAC1", O_RDWR);
if (fd == -1){
printf("open device %s error\n",DEVICE_TTYS);
}
else{
init_ttySAC(fd,38400); // init device
if(Ublox_Cfg_Rate(fd, 400, 1) != 0) printf("cfg failed\r\n");
func_GPS(fd);
if (close(fd)!=0) printf("close device %s error",DEVICE_TTYS);
}
return 0;
}
[/mw_shl_code]
|