void GPS_REV_TASK(void *p_arg) { uint8_t data_temp; (void)p_arg; USART_ITConfig(USART2, USART_IT_RXNE, DISABLE); comClearRxFifo(COM2); GpsRevCnt = 0; while(1) { BSP_OS_TimeDlyMs(10000); comClearRxFifo(COM2); GpsRevCnt = 0; USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); while(GpsRevCnt < GPS_MAX_REV_SIZE) { while(comGetChar(COM2, &data_temp)) { GpsRevBuf[GpsRevCnt++] = data_temp; } BSP_OS_TimeDlyMs(10); } USART_ITConfig(USART2, USART_IT_RXNE, DISABLE); GPS_Analysis(&GpsCurInfo, GpsRevBuf); } }
/* ********************************************************************************************************* * 函 数 名: SIM800_SendAT * 功能说明: 向GSM模块发送AT命令。 本函数自动在AT字符串口增加<CR>字符 * 形 参: _Str : AT命令字符串,不包括末尾的回车<CR>. 以字符0结束 * 返 回 值: 无 ********************************************************************************************************* */ void SIM800_SendAT(char *_Cmd) { comClearRxFifo(COM_SIM800); /* 清零串口接收缓冲区 */ comSendBuf(COM_SIM800, (uint8_t *)_Cmd, strlen(_Cmd)); comSendBuf(COM_SIM800, "\r", 1); }
/* ********************************************************************************************************* * 函 数 名: MG323_GetNetStatus * 功能说明: 查询当前网络状态 * 形 参: 无 * 返 回 值: 网络状态, CREG_NO_REG, CREG_LOCAL_OK 等。 ********************************************************************************************************* */ uint8_t MG323_GetNetStatus(void) { /* AT+CREG? +CREG: 0,1 OK */ char buf[128]; uint16_t len, i; uint8_t status; comClearRxFifo(COM_MG323); /* 清零串口接收缓冲区 */ MG323_SendAT("AT+CREG?"); /* 发送 AT 命令 */ len = MG323_ReadResponse(buf, sizeof(buf), 200); /* 超时 200ms */ if (len == 0) { return 0; } for (i = 2; i < len; i++) { if (buf[i] == ',') { i++; status = buf[i] - '0'; } } return status; }
/* ********************************************************************************************************* * 函 数 名: MG323_PowerOn * 功能说明: 给MG323模块上电 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ void MG323_PowerOn(void) { comClearRxFifo(COM_MG323); /* 清零串口接收缓冲区 */ MG323_Reset(); /* 根据MG323手册,模块上电后延迟250ms,然后驱动 TERM_ON口线为低电平 750ms 之后驱动为高,完成开机时序 */ TERM_ON_1(); bsp_DelayMS(250); TERM_ON_0(); bsp_DelayMS(750); TERM_ON_1(); /* 等待模块完成上电,判断是否接收到 ^SYSSTART */ MG323_WaitResponse("^SYSSTART", 5000); }
/* ********************************************************************************************************* * 函 数 名: SIM800_PowerOn * 功能说明: 模块上电. 函数内部先判断是否已经开机,如果已开机则直接返回1 * 形 参: 无 * 返 回 值: 1 表示上电成功 0: 表示异常 ********************************************************************************************************* */ uint8_t SIM800_PowerOn(void) { uint8_t ret_value = 0; uint8_t i; /* 判断是否开机 */ for (i = 0; i < 5; i++) { SIM800_SendAT("AT"); if (SIM800_WaitResponse("OK", 100)) { return 1; } } comClearRxFifo(COM_SIM800); /* 清零串口接收缓冲区 */ /* 通过拉低 PWRKEY 引脚至少 1.2 秒然后释放,使模块开机。*/ PWRKEY_0(); bsp_DelayMS(2000); PWRKEY_1(); /* 等待模块完成上电,如果是自动波特率则收不到RDT */ //if (SIM800_WaitResponse("RDY", 5000) == 0) { /* 开始同步波特率: 主机发送AT,只到接收到正确的OK 当模块开机后建议延迟 2 至 3 秒后再发送同步字符,用户可发送“ AT” (大写、小写均可)来和模块 同步波特率,当主机收到模块返回“ OK”, */ for (i = 0; i < 50; i++) { SIM800_SendAT("OK"); if (SIM800_WaitResponse("OK", 100)) { ret_value = 1; break; /* 模块上电成功 */ } } } return ret_value; }
/* ********************************************************************************************************* * 函 数 名: MG323_GetHardInfo * 功能说明: 读取模块的硬件信息. 分析 ATI 命令应答结果。 * 形 参: 存放结果的结构体指针 * 返 回 值: 1 表示成功, 0 表示失败 ********************************************************************************************************* */ uint8_t MG323_GetHardInfo(MG_HARD_INFO_T *_pInfo) { /* ATI Manufacture: HUAWEI Model: MG323 Revision: 12.210.10.05.00 IMEI: 351869045435933 +GCAP: +CGSM OK */ char buf[255]; uint16_t len, i, begin, num; uint8_t status = 0; comClearRxFifo(COM_MG323); /* 清零串口接收缓冲区 */ MG323_SendAT("ATI"); /* 发送 ATI 命令 */ len = MG323_ReadResponse(buf, sizeof(buf), 300); /* 超时 300ms */ if (len == 0) { return 0; } _pInfo->Manfacture[0] = 0; _pInfo->Model[0] = 0; _pInfo->Revision[0] = 0; _pInfo->IMEI[0] = 0; for (i = 2; i < len; i++) { if (buf[i] == ':') { i += 2; begin = i; } if (buf[i] == AT_CR) { num = i - begin; if (status == 0) { if (num >= sizeof(_pInfo->Manfacture)) { num = sizeof(_pInfo->Manfacture) - 1; } memcpy(_pInfo->Manfacture, &buf[begin], num); _pInfo->Manfacture[num] = 0; } else if (status == 1) { if (num >= sizeof(_pInfo->Model)) { num = sizeof(_pInfo->Model) - 1; } memcpy(_pInfo->Model, &buf[begin], num); _pInfo->Model[num] = 0; } else if (status == 2) { if (num >= sizeof(_pInfo->Revision)) { num = sizeof(_pInfo->Revision) - 1; } memcpy(_pInfo->Revision, &buf[begin], num); _pInfo->Revision[num] = 0; } else if (status == 3) { if (num >= sizeof(_pInfo->IMEI)) { num = sizeof(_pInfo->IMEI) - 1; } memcpy(_pInfo->IMEI, &buf[begin], num); _pInfo->IMEI[num] = 0; break; } status++; } } return 1; }