⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gprs.txt

📁 不知道程序是不是有问题
💻 TXT
📖 第 1 页 / 共 2 页
字号:
我先把GPRS.C文件贴出来,大家先分析,注释很多是我注的,也不知道对不对,下班了,回去再说 
#include "project.h" 

#define GPRS_STK_SIZE THREAD_STACK_SIZE                //定义GPRS任务堆栈大小 
static OS_STK        gprsStartStk[GPRS_STK_SIZE];        //定义GPRS任务堆栈 

#define GPRS_EVENT_SIZE EVENT_SIZE                                                 
static void * gprs_a[GPRS_EVENT_SIZE];                         
OS_EVENT * gprsEvent;                                                //GPRS事件 
extern OS_EVENT *coreEvent; 

#define MSG_TYPE MSG_CONTENT_TYPE_BIN 



/* 
转发数据时候的消息结构 
*/ 

#define GPRS_MSG_SIZE 1                                                //将来扩展支持同时多个命令 
#define GPRS_COTSIZE 150                                        //=最大的内部命令大小 
#define GPRS_STASIZE sizeof(GPRS_CORESTA)      
static MSG  gprsMsg[GPRS_MSG_SIZE]; 
static INT8U  gprsMsgCmdBuf[GPRS_MSG_SIZE][GPRS_COTSIZE]; 
static INT8U  gprsMsgStaBuf[GPRS_MSG_SIZE][GPRS_STASIZE]; 


/* 
收发的结构 
*/ 
#define GPRS_SENDDATE_SIZE 400                //因该比较大,因为返回是直接放入其中的,否则会发生丢失 
static INT8U gprs_senddate_d[GPRS_SENDDATE_SIZE]; 
static SFIFO gprs_senddate_f; 

#define GPRS_REC_SIZE 600                //缓存gprs 来的数据  因为没有流控所以必须足够大 
static INT8U gprs_rec_d[GPRS_REC_SIZE]; 
static SFIFO gprs_rec_f; 

/* 
不需要 innerContent 只是发个信号,没有内容 
*/ 
static INT32U reccmdflag; 
static MSG recmsg; 


#define GPRSG_STK_SIZE 40                                        //GPRS接收任务堆栈大小 
static OS_STK        gprsgStartStk[GPRSG_STK_SIZE];        //定义GPRS接收任务堆栈 
#define GPRSS_STK_SIZE 40                                         //定义GPRS发送任务堆栈大小 
static OS_STK        gprssStartStk[GPRSS_STK_SIZE];        //定义GPRS发送任务堆栈 


//gprs 多路解析cmd 和 date 
static INT8U gprs_cmd_type;                                                //0x2 date 0x1 cmd 
static INT8U gprs_date_flag;                                                //0x1 gprs_cmd_type 0x0 unknown 
static INT32U gprs_date_size;                                                //0x2 date 需要的大小  

#define GPRS_MAX_ORG 100                                            //gprs来的最大封装数据如果采取封包的方式,和其他状态[ring etc.] 
//如果太大则丢弃 /r 分割 
static INT8U gprsorgContent[GPRS_MAX_ORG];                //gprs来的封装数据内容 
static INT8U gprsorgCmdSize;// 
//2个 一个包中连续多个命令的处理 最大支持2个 

#define GPRS_MAX_P 3///最多三条命令 
#define GPRS_MAX_TR 150  //最大的输入命令长度  二进制 
static INT8U gprsDataCur; 
static INT8U gprsDataContent[GPRS_MAX_P][GPRS_MAX_TR]; 
static INT8U gprsDataSize[GPRS_MAX_P]; 


//hold transfer date 
#define GPRS_MAX_BK 150  //最大的命令返回长度 二进制 
static INT8U gprsbackContent[GPRS_MAX_BK];///返回内容 
static INT8U gprsbackCmdSize;///返回命令长度 

/* 
原型声明 
*/ 
static void gprs(void*p); 
static void gprsg(void *p); 
static void gprss(void *p); 
static INT8U gprshelp(char* cmdstr,INT8U size); 


//辅助构造date头 
#define GPRS_HEAD_SIZE 20 
#define GPRS_HEAD_FIX_SIZE 11 
static        INT8U cmd_head[GPRS_HEAD_SIZE]; 
         
//辅助构造ip命令 
#define GPRS_IPHEAD_SIZE 50 

#define GPRS_IPHEAD_FIX_SIZE 18 


static        INT8U ip_head[GPRS_IPHEAD_SIZE]; 


/*和GPRS模块通信的UART1口初始化 
*/ 

static void gprs_hw_init(void) 
{ 
         
                INT16U hwBaudVal; 
                 
                hwBaudVal=((PCLK / ((115200) * 16.0)) + 0.5); 
                U1LCR|=0x80;                //使能访问除数锁存 
                U1DLL=(INT8U)hwBaudVal;                //除数低八位 
                U1DLM=(INT8U)(hwBaudVal>>8);//除数高八位 
                U1LCR&=~0x80;                //禁止访问除数锁存 
                U1LCR=0x3;                        //8位字符长度 
                U1FCR=0x47;                        //使能FIFO,触发点1(默认=4个字符或0x04h) 
                U1IER=0x0;                        //禁止中断 
                                 
} 
static INT8U gprs_retry;//0 立刻 1 稍候 其他 无效 
static INT32U gprs_retry_c; 
void gprs_resetstate(void); 
static void gprsCMDhelp(char* cmdstr,INT8U size); 


static INT32U gprsshutplus(void)//默认稍后发送 
{ 
#if OS_CRITICAL_METHOD == 3                
    OS_CPU_SR    cpu_sr; 
#endif 
                        IO2SET=1<<20;//监控系统网络连接LED灭 
                                         
                        IO2SET=1<<21;                // 1s高电平脉冲 reset 
                        OSTimeDlyHMSM(0,0,1,0);// 1S 
                        IO2CLR=1<<21; 
                        OSTimeDlyHMSM(0, 0, 6,0);//6 s  
                 
                OS_ENTER_CRITICAL(); 
                SFIFO_clear(&gprs_senddate_f); 
                SFIFO_clear(&gprs_rec_f); 
                OS_EXIT_CRITICAL(); 

                        gprs_resetstate();//GPRS复位 
                        gprs_retry=1;//稍候发送 
                        gprs_retry_c=0;//can change after this function 
                         
                return GPRS_STATE_INIT; 
} 


static INT8U pro_type;//0x1 头 0x2 取全部 
static INT32U pro_size;//一共大小 
static INT32U pro_needsize;// 0x2 取全部的大小 
static INT8U pro_flag;//0 1 已经获得一个ascall 
static INT8U pro_ascall; 
static INT8U gprs_mon; 
static INT8U gprs_mon_try; 
static INT32U gprs_heart;//链路检测 
static INT8U gprs_cr_dis;//else 丢弃下一个 /r      0 不丢弃 
void gprs_resetstate(void)        //GPRS复位函数 
{ 
         
         
         
        gprs_cr_dis=0; 
        gprsorgCmdSize=0;//一个包中连续多个命令的处理 最大支持2个 
        gprs_date_flag=0;//0x1 gprs_cmd_type 0x0 unknown 
         
        gprs_cmd_type=0;//need by q26//0x2 date 0x1 cmd 
         
        gprsDataCur=0;//当前命令编号初始化为0 
        gprsDataSize[gprsDataCur]=0;//当前命令大小初始化为0 
         
         
        pro_type=0x1;//0x1 头 0x2 取全部 
        pro_size=0;//一共大小 
         
        pro_flag=0;//0 1 已经获得一个ascall 
                 
        gprs_mon=0; 
        gprs_mon_try=0; 

        gprs_heart=0; 
} 


void gprs_init() 
{ 
        INT32U i; 
        i=OSTaskCreate(gprs, (void *)0, (void *)&gprsStartStk[GPRS_STK_SIZE - 1], GPRS_PRIO); 
        gprsEvent=OSQCreate(gprs_a,GPRS_EVENT_SIZE); 
        for(i=0;i<GPRS_MSG_SIZE;i++){ 
                gprsMsg[i].empty=MSG_EMPTY; 
                gprsMsg[i].innerContent=&gprsMsgCmdBuf[i]; 
                gprsMsg[i].context=&gprsMsgStaBuf[i]; 
        } 
        OSTaskCreate(gprsg, (void *)0, (void *)&gprsgStartStk[GPRSG_STK_SIZE - 1], GPRSG_PRIO); 
        OSTaskCreate(gprss, (void *)0, (void *)&gprssStartStk[GPRSS_STK_SIZE - 1], GPRSS_PRIO); 
         

         
        reccmdflag=MSG_FLA_ALLOW; 
         
        SFIFO_init(&gprs_senddate_f,gprs_senddate_d,GPRS_SENDDATE_SIZE); 
        SFIFO_init(&gprs_rec_f,gprs_rec_d,GPRS_REC_SIZE); 
                 

        //at+cipsend=3/r123 
        strcpy((char*)cmd_head,"at+cipsend=");//11 
        //AT+CIPSEND<CR> 返回“>”后输入要传输的数据,再发送CTRL+Z 
        //即将所要发送的数据发送到指定IP的服务器上 

        //at+wipcreate=2,1,"58.240.120.146",8001 
        ///用TCP socket 1连接remote的server,8001为端口 
        strcpy((char*)ip_head,"at+wipcreate=2,1,\"");//18 
        gprs_hw_init(); 
         
} 
/* 
0xd  \r ASCLL 
0xa  \n        换行 
cmdhelp  后加\r即回车 
gprshelp 封装data 
*/ 

static void gprsCMDhelp(char* cmdstr,INT8U size) 
{ 

#if OS_CRITICAL_METHOD == 3                
    OS_CPU_SR    cpu_sr; 
#endif 
        INT8U i,f; 
         
        DPRINTS("G "); 
        DPRINTSN(cmdstr,size); 
        DPRINTS("\r\n"); 
                 
                 
        OS_ENTER_CRITICAL();         
        for(i=0;i<size;i++){ 
                f=SFIFO_push(&gprs_senddate_f,(INT8U)cmdstr[i]); 
                if(f)//full 
                        systemExit(ERROR_USR+7); 
                } 
        f=SFIFO_push(&gprs_senddate_f,'\r'); 
        if(f)//full 
                        systemExit(ERROR_USR+8); 
        OS_EXIT_CRITICAL(); 
         
} 
//add size checksum 
static void gprsfillp(char* cmdstr,INT8U size) 
{ 
        INT8U i,sum; 
        cmdstr[0]=size-1; 
        sum=0; 
        for(i=0;i<3;i++){ 
                sum+=cmdstr[i];//报文头校验和 
        } 
        cmdstr[3]=sum; 
         
        sum=0; 
        for(i=0;i<size-5;i++){ 
                sum+=cmdstr[4+i];//报文体校验和 
        } 
        cmdstr[size-1]=sum; 
} 
// q26 help need process 
static void gprsrawhelp(char* cmdstr,INT8U size) 
{ 

#if OS_CRITICAL_METHOD == 3                
    OS_CPU_SR    cpu_sr; 
#endif 
        INT8U i,f; 
        INT8U err; 
        INT32U state; 
         
        OSSemPend(globalEvent,0,&err); 
        state=g_gvv.gprs_state; 
        OSSemPost(globalEvent); 
         
        if(state!=GPRS_STATE_ONLINE) return; 
                 
                #if (HWVERSION==0x6) 
                if(gprs_date_flag==0) return; 
                #endif 
         
         
        OS_ENTER_CRITICAL();         
        #if (HWVERSION==0x6) 
        ; 
         
        #else 
        //strcat to tail 
        INT8Utostr((char*)cmd_head,size); 
         
        for(i=0;i<strlen((char*)cmd_head);i++){ 
                f=SFIFO_push(&gprs_senddate_f,cmd_head[i]); 
                if(f)//full 
                        systemExit(ERROR_USR+8); 
        } 
        f=SFIFO_push(&gprs_senddate_f,'\r'); 
        if(f)//full 
                        systemExit(ERROR_USR+8); 
        #endif 
         

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -