1、增加GPS操作指令,同时通过GPIO1来控制GPS的使能

2、根据硬件电路的不同选择不同的输出方式控制GSM的电源
3、根据GSM有时不能正常工作的情况,增加数据发送失败超过三次、重启操作系统
This commit is contained in:
LQF 2017-06-21 09:18:49 +08:00
parent 7ea4e07fa5
commit 988428fdce
2 changed files with 86 additions and 14 deletions

View File

@ -96,9 +96,19 @@ void GSM07::RemoveLed()
bool GSM07::OnOpen()
{
/*_Power.Invert = 1;
_Power.OpenDrain = true;
_Power.Open(); // 使用前必须Open
_Power.Up(500);
//_Power.Write(false); // 打开电源(低电平有效)
_Power.Close();*/
_Power.Invert = 0;
_Power.Open(); // 使用前必须Open
_Power.Write(false); // 打开电源(低电平有效)
debug_printf("SIM800C::OnOpen Power=%d \r\n", _Power.ReadInput());
if (!At.Open()) return false;
// 回显
Echo(true);
@ -111,6 +121,14 @@ bool GSM07::OnOpen()
return false;
}
GPSGpioOut();
GPSPowerOpen();
Sys.Sleep(1);
NameExplain();
WaitForGPSSuccess();
GPSSetTime();
//GPSMessageOut();
#if NET_DEBUG
// 获取版本
@ -152,9 +170,9 @@ bool GSM07::CheckReady()
// 先关一会电,然后再上电,让它来一个完整的冷启动
if (!_Power.Empty())
{
_Power.Open(); // 使用前必须Open
//_Power.Down(20);
_Power.Write(false);
//_Power.Up(500);
//_Power.Write(false);
net_printf("SIM800C::CheckReady Power=%d \r\n", _Power.ReadInput());
}
if (!_Reset.Empty()) _Reset.Open(); // 使用前必须Open
@ -194,8 +212,6 @@ bool GSM07::OnLink(uint retry)
//if (!QueryRegister()) return false;
return Config();
//return true;
}
// 配置网络参数
@ -280,7 +296,7 @@ bool GSM07::Config()
At.SendCmd("AT+CDNSCFG?");
At.SendCmd("AT+CDNSCFG=\"180.76.76.76\",\"223.5.5.5\"");
At.SendCmd("AT+CDNSGIP=\"smart.wslink.cn\"");
At.SendCmd("AT+CIPHEAD=1");
return true;
}
@ -376,7 +392,8 @@ bool GSM07::Test(int times, int interval)
String cmd = "AT";
for (int i = 0; i < times; i++)
{
if (i > 0) Reset(false);
//if (i > 0) Reset(false);
Sys.Sleep(500);
if (At.SendCmd(cmd, interval)) return true;
}
@ -392,7 +409,7 @@ bool GSM07::Reset(bool soft)
RESET的时候注意PWR_KEY脚要先拉低
*/
if (!_Power.Empty()) _Power.Up(100);
if (!_Power.Empty()) _Power.Up(500);
_Reset.Up(100);
return true;
@ -486,6 +503,46 @@ String GSM07::GetCCID() {
return At.Send("AT+CCID");
}
/******************************** GPS服务 ********************************/
//设置GPIO1输出高电平
bool GSM07::GPSGpioOut()
{
return At.SendCmd("AT+CGPIO=0,57,1,1");
}
//打开电源
bool GSM07::GPSPowerOpen()
{
return At.SendCmd("AT+CGNSPWR=1");
}
//名字解析
bool GSM07::NameExplain()
{
return At.SendCmd("AT+CGNSSEQ=\"RMC\"");
}
//等待GPS开机
bool GSM07::WaitForGPSSuccess()
{
auto rs = At.Send("AT+CGNSINF",5000);
return true;
}
//设置GPS数据输出时间
bool GSM07::GPSSetTime()
{
return At.SendCmd("AT+CGNSURC=3");
}
//打开GPS数据流输出
bool GSM07::GPSMessageOut()
{
return At.SendCmd("AT+CGNSTST=1");
}
/******************************** 网络服务 ********************************/
// 获取运营商名称。非常慢
String GSM07::GetMobiles() { return At.Send("AT+COPN"); }
@ -657,25 +714,31 @@ bool GSM07::SendData(const String& cmd, const Buffer& bs)
{
//auto rt = _Host.Send(cmd, ">", "OK", 1600);
// 不能等待OK而应该等待>,因为发送期间可能给别的指令碰撞
auto rt = At.Send(cmd, ">", "ERROR", 1600, false);
auto rt = At.Send(cmd, ">", "ERROR", 2000, false);
if (rt.Contains(">")) break;
Sys.Sleep(500);
}
if (i < 3 && At.Send(bs.AsString(), "SEND OK", "ERROR", 1600).Contains("SEND OK"))
{
return true;
}
/*// 发送失败,关闭链接,下一次重新打开
if (++_Error >= 3)
{
_Error = 0;
Close();
}*/
Sys.Reboot(500);
net_printf(" SmartOS将在500毫秒后重启\r\n");
net_printf("发送超过三次 关闭链接 下一次重新打开!\r\n");
}
if (_Error == 0)
{
Sys.Reboot(500);
net_printf(" SmartOS将在500毫秒后重启\r\n");
}
return false;
}

View File

@ -63,6 +63,14 @@ public:
String GetIMEI();
// 查询SIM的CCID也可以用于查询SIM是否存或者插好
String GetCCID();
/******************************** GPS服务 ********************************/
bool GPSGpioOut();
bool GPSPowerOpen();
bool NameExplain();
bool WaitForGPSSuccess();
bool GPSSetTime();
bool GPSMessageOut();
/******************************** 网络服务 ********************************/
// 获取运营商列表
@ -100,6 +108,7 @@ protected:
uint _task; // 调度任务
ByteArray _Buffer; // 待处理数据包
IPEndPoint _Remote; // 当前数据包远程地址
int _Error;
// 打开与关闭
virtual bool OnOpen();