sscanf导致的堆栈溢出问题

同一份代码会有一些轻微改动,在ubuntu下执行可以正常运行,烧录到hi3861开发板中执行就会堆栈溢出,问题出现在sscanf函数上,注释掉就不会溢出,请教堆栈溢出的原因,谢谢

#ifndef __DRIVER_UART_GPS_H
#define __DRIVER_UART_GPS_H

#include <stdio.h>
#include <string.h>

#define GPS_LEN     180          //read GPS data length

/*GPS 原始数据结构体*/
typedef struct  __gps_original_struct__
{
    unsigned int time;          /*GPS 定位时间*/
    float latitude;                    /*纬度*/
    float longitude;                /*经度*/
    char  quality;                     /*GPS质量指示符*/
    int satellites;                     /*卫星数*/
    float  hdop;                       /*水平精度因子*/
    float altitude;                    /*海拔高度*/
}GPS_OS;

int driver_read_gps( );           //读取GPS数据

#endif
#include "driver_uart_gps.h"

GPS_OS gps_osdata;      // 定义原始数据结构体变量

int driver_read_gps()           //读取GPS数据
{
    char  buff[GPS_LEN]="$GNGGA,075245.00,3155.91710942,N,11848.93259952,E,1,06,2.8,6.5719,M,1.9232,M,,,2.9*4C";        //模拟接收到的GPS数据帧
    char *ptr =NULL;

    //GPS数据过渡变量
    float  utc=0;                          /*GPS 定位时间*/
    float lat=0;                           /*纬度*/
    float lon=0;                         /*经度*/
    char qual=0;                       /*GPS质量指示符*/
    int sats;                               /*卫星数*/
    float  hor;                           /*水平精度因子*/
    float alt;                             /*海拔高度*/


    printf("buff:%s\n",buff);
    printf("bufflen:%ld\n",strlen(buff));
    printf("buffsize:%ld\n",sizeof(buff));

    if(NULL==(ptr=strstr(buff,"$GNGGA")))
    {
        printf("location error\n");
        memset(buff,0,sizeof(buff));
        ptr=NULL;
        return -1;
    }
    printf("ptr:%s\n",ptr);


  /*使用sscanf函数为字符串输入,意思是将ptr内存单元的值作为输入分别输出到后面的结构体成员*/
    sscanf(ptr,"$GNGGA,%f,%f,N,%f,E,%c,%d,%f,%f,*",&utc,&lat,&lon,&qual,&sats,&hor,&alt);
    memset(&gps_osdata,0,sizeof(gps_osdata));
    gps_osdata.time=(int )utc;
    gps_osdata.latitude=lat;
    gps_osdata.longitude=lon;
    gps_osdata.quality=qual;
    gps_osdata.satellites=sats;
    gps_osdata.hdop=hor;
    gps_osdata.altitude=alt;
    memset(buff,0,sizeof(buff));

    return 0;
}

嵌入式系统里,栈空间分配的都比较小,你可以看看如何修改栈空间大小。或者先尝试一下,把函数里占用空间大的变量拿到函数外,做成全局变量,比如函数里定义的buff数组,全局变量不占用栈空间。

似乎sscanf底层实现机层不一样,用了会出错,就一次别用这么长或者干脆别用