📄 gprs.txt
字号:
我先把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 + -