|
|
我的想法很简单就是根据发送的指令监测不同端口的值并进行短信回复的程序
现在遇到一个问题就是,有时发送指令后,Arduino不能回复短信成功,有时又能够成功。
不知道问题出现在什么地方,是延时的时间不够吗?还是串口通讯问题?
开始怀疑是 SIM900没有清空短信息,发现重新初始化仍然不行。
这是我调试信息
Port closed
Uploading to I/O board
Opening port
Port open
AT
OK
AT+CSCS="GSM"
OK
AT+CMGF=0
OK
AT+CNMI=2,1
OK
AT+CMGD=1
OK
initially
//第一次发送指令成功的信息
3
kaishifasongduanxinhansu
17.61
huode>
sendding message is successful
AT
OK
AT+CSCS="GSM"
OK
AT+CMGF=0
OK
AT+CNMI=2,1
OK
AT+CMGD=1
OK
initially
case3
end
第二次发送信息后显示的内容
5
kaishifasongduanxinhansu
7.87
下面是我的代码,
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
- //作者:王伟
- //邮箱:[email][email protected][/email]
- //日期:2015年11月05日
- //说明:此程序为客户端,通过接收主机发送短信命令发送指定
- //传感器值到主机。
- //=============================================================//
- //客户端到主机数据格式
- //指令格式E9E906010001000200030004000500060009001000110012FFFF
- //E9E9:为指令头;
- //06:为传感器编号;
- //01:表示此条命令包含的数据个数
- //0001000200030004000500060009001000110012:表示12组数据
- //FFFF:表示结束字符
- //=============================================================//
- //主机到客户端数据格式
- //指令格式E9E901FFFF
- //E9E9:为指令头
- //01:待测传感器编号
- //FFFF:表示结束字符
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
- #define N 12
- //设置参考电阻
- #define basis 20000.0
- //定义测试传感器端口
- int AnPin[] = { A0, A1, A2, A3, A4, A5 };
- //定义读取模拟端口值以及计算后所得的电阻值
- float val, r;//定义变量
- String CommandString = ""; //定义存储命令变量
- String Sendtext = ""; //定义存储说有传感器的值
- String TelNUM = "";//定义存储需要回复短信的电话号码
- int j = 0;
- //收发短信设置
- #include<string.h>
- #define Buf_Max 100
- unsigned char Rec_Buf[Buf_Max];
- unsigned char i = 0;
- int SensorNUM = 0; //定义存储命令测试端口编号
- void setup() {
-
- Serial.begin(9600);//此串口调试时使用
-
- Serial1.begin(9600);//GSM通信使用
- Initial_GSM();//初始化GSM模块
-
- }
- void loop()
- {
-
- SerialRec();//监听串口消息
- //判断是否接收到消息,接收到消息则进行读取处理
- if (strstr((const char*)Rec_Buf, "+CMTI") != NULL)
- {
- CLR_Buf();//清除缓存
-
- Serial1.println("AT+CMGR=1");//读取收到的短消息
- delay(100);
- while (strstr((const char*)Rec_Buf, "OK") == NULL)
- SerialRec();
- for (int k = 37; k < 48; k++)
- {
- TelNUM += (char)Rec_Buf[k];
- }
- //Serial.println(TelNUM);
- //Serial.println((const char*)Rec_Buf);
- //判断短信内容是否是需要的短信
- if (strstr((const char*)Rec_Buf, "E9E9") != NULL)
- {
-
- //Serial.println((const char*)Rec_Buf);
- //根据短信指令内容查询相应传感器的值
-
- //根据串口接收到的数据得到命令中指定的编号
- SensorNUM = ((int)Rec_Buf[81] - '0') * 10 + ((int)Rec_Buf[82] - '0');
-
- Serial.println(SensorNUM);
- //Serial.println(Rec_Buf[81]);//暂时显示确定要显示数据的位置
- //Serial.println(Rec_Buf[82]);
-
- switch (SensorNUM)
- {
- case 1:
- GetRES(SensorNUM);
- Serial.println("case1");
- CLR_Buf(); //输出数据后清除命令内容
- break;
- case 2:
- GetRES(SensorNUM);
- Serial.println("case2");
- CLR_Buf(); //输出数据后清除命令内容
- break;
- case 3:
- GetRES(SensorNUM);
- Serial.println("case3");
- CLR_Buf(); //输出数据后清除命令内容
- break;
- case 4:
- GetRES(SensorNUM);
- Serial.println("case4");
- CLR_Buf();//输出数据后清除命令内容
- break;
- case 5:
- GetRES(SensorNUM);
- Serial.println("case5");
- CLR_Buf(); //输出数据后清除命令内容
- break;
- case 6:
- GetRES(SensorNUM);
- Serial.println("case6");
- CLR_Buf(); //输出数据后清除命令内容
- break;
- case 7://测试所有传感器
- GetRES(SensorNUM);
- Serial.println("case7");
- CLR_Buf(); //输出数据后清除命令内容
- break;
- }
-
- }
- else if (strstr((const char*)Rec_Buf, "0000") != NULL)
- {
- Serial.println("else");
- Serial.println("OK");
- }
- CLR_Buf();
- Serial1.println("AT+CMGD=1,4");//删除短信,并删除所有已读短信
- delay(100);
-
- while (strstr((const char*)Rec_Buf, "OK") == NULL)
- SerialRec();
- delay(100);
- CLR_Buf();
- Serial.println("end");
- }
- }
- void SerialRec()
- {
- while (Serial1.available())
- {
- Rec_Buf[i] = Serial1.read();
- i++;
- if (i > Buf_Max)
- {
- i = 0;
- }
- delay(3);
- }
-
- }
- void CLR_Buf()
- {
- for (unsigned k = 0; k < Buf_Max; k++)
- {
- Rec_Buf[k] = 0;
- }
- i = 0;
- SensorNUM = 0;//清除编号内容
- }
- void Send_MSG(double MSG,String Tel_NUM)
- {
- //Serial.println((const char*)Rec_Buf);
- Serial.println(MSG);
- CLR_Buf();
- String Send_Order = "AT+CMGS="" + Tel_NUM + """;
- Serial1.println(Send_Order);//向号码发送信息
-
- //Serial1.println("AT+CMGS="10086"");//向号码发送信息
- delay(200);
- while (strstr((const char*)Rec_Buf, ">") == NULL)
- SerialRec();
- Serial.println("huode>");
- Serial1.print(MSG);
- delay(200);
- Serial1.write(0x1A);//发送短信结束符
- delay(200);
- while (strstr((const char*)Rec_Buf, "+CMGS") == NULL)
- SerialRec();
- Serial.println("sendding message is successful");//测试短信是否发送成功
- CLR_Buf();
- Initial_GSM();
- }
- //初始化GSM模块信息
- void Initial_GSM()
- {
- Serial1.println("AT\r");//握手连接 \r 表示回车
- delay(100);
- //这个函数的作用是在Rec_Buf(接收的数据)中查找子串"OK",
- //如果找到,则返回Rec_Buf中"OK"的位置。否则返回NULL。
- //第一次执行由于Rec_Buf中没有因此返回NULL,从而执行while
- //循环,执行SerialRec()函数,使得Rec_Buf接收到数据,执行下一步
- while (strstr((const char*)Rec_Buf, "OK") == NULL)
- SerialRec();
- Serial.println("AT");//调试窗口显示输入的指令
- Serial.println("OK");//调试窗口显示输入的指令
- CLR_Buf();//清除Rec_Buf中的内容,准备判断下一次接受的指令
- //Serial1.println("AT+CSCS="UCS2"");//16位通用8字节倍数编码字符
- Serial1.println("AT+CSCS="GSM"");//GSM
- delay(100);
- while (strstr((const char*)Rec_Buf, "OK") == NULL)
- SerialRec();
- Serial.println("AT+CSCS="GSM"");
- Serial.println("OK");
- CLR_Buf();
- //设置短消息模式0:PDU模式1:文本模式
- Serial1.println("AT+CMGF=1");//PDU
- delay(100);
- while (strstr((const char*)Rec_Buf, "OK") == NULL)
- SerialRec();
- Serial.println("AT+CMGF=0");
- Serial.println("OK");
- CLR_Buf();
- //短信输出方式
- Serial1.println("AT+CNMI=2,1");
- delay(100);
- while (strstr((const char*)Rec_Buf, "OK") == NULL)
- SerialRec();
- Serial.println("AT+CNMI=2,1");
- Serial.println("OK");
- CLR_Buf();
- //删除已读短信
- Serial1.println("AT+CMGD=1,4");
- delay(100);
- while (strstr((const char*)Rec_Buf, "OK") == NULL)
- SerialRec();
- Serial.println("AT+CMGD=1");
- Serial.println("OK");
- Serial.println("initially");
- CLR_Buf();
- }
- //-----------------------------------------------------//
- //---------此部分函数为计算传感器的值公式--------------//
- //-----------------------------------------------------//
- //计算并输出单个传感器的值
- void GetRES(char Port)
- {
- int PortNum = int(Port) - 49; //由于转换字符到ACSIC码值因此要减49
- val = analogRead(AnPin[PortNum]); //读取端口的值到变量
- //Serial.println(val);//调试显示数据到PC
- r = ((basis * 1023.0) / (1023.0 - val)) - basis;
-
- delay(100);
- if (filter() >= 1000)
- {
- if (filter() >= 500.0 * 1000.0)
- {
- Serial.println("Infinity!!");
- }
- else
- {
- //Serial.print(filter() / 1000.0);//输出电阻值
- //Serial.print(filter() / 1000); //1k为一个cm单位输出
- Serial.println("kaishifasongduanxinhansu");
- Send_MSG((filter()/1000), TelNUM);//回复传感器信息到查询手机号
-
- }
- }
- else
- {
- //Serial.print("2A");
- Send_MSG(00, TelNUM);//回复传感器信息到查询手机号
- }
- }
- //巡测所有传感器的值
- void GetRES()
- {
- for (int i = 0; i < 6; i++)
- {
- val = analogRead(AnPin[i]); //读取端口的值到变量
- r = ((basis * 1023.0) / (1023.0 - val)) - basis;
- //Serial.println(r);
- delay(100);
- if (filter() >= 1000)
- {
- if (filter() >= 500.0 * 1000.0)
- {
- Serial.println("Infinity!!");
- }
- else
- {
- //Serial.print(filter() / 1000.0);//输出电阻值
- //Serial.print(filter() / 1000.0); //1k为一个cm单位输出
- Sendtext = Sendtext + int(filter() / 1000);
- }
- }
- else
- {
- Sendtext = Sendtext + "2A";
- //Serial.print("2A");
- }
- }
- Serial.print(Sendtext);//显示所有传感器信息
- Sendtext = "";
- }
- //滤波公式
- float filter()
- {
- float sum = 0;
- for (int count = 0; count < N; count++)
- {
- sum += r;
- delay(5);
- }
- return (float)(sum / N);
- }
- //------------上部位计算端口的计算值---------------------//
复制代码 |
|