求大神!!三个数据串口只有一个能用

作者:乱臣贼子 | 更新时间:2020-03-22 | 浏览量:899

我是做温湿度监测,用的示例wendu的代码,改变了串口和温湿度读取函数其他没有变。两次引用示例中update1函数分别上传温湿度到两个数据串口。但是只有第一个数据可以收到温度或湿度。另外的串口不能用。此外我又建立了第三个数据串口依旧如此。有没有大神指点一下?


评论:共8条

lwl 评论于:2020-03-23 02:04:25
看不懂,最好把核心代码贴出来
乱臣贼子 回复于:2020-03-24 01:12:27
回复 @lwl:对不起,疏忽了。因为初步应用,所以代码只改了几处
注意 :Arduino IDE版本请使用1.6.5-1.8.2
ESP8266模块在接Arduino之前请确定透传稳定性,在串口查看ESP8266是否能多次收到WELCOME TO BIGIOT,
能多次收到说明透传稳定且能自动重连。
时间:2018.12.4
作者:www.bigiot.net
*/
#include <aJSON.h>
#include <DHT11.h>
//============= 此处必须修改============
String DEVICEID = "17***0"; // 你的设备ID ==
String APIKEY = "********"; //设备密码=
String INPUTID1 = "15212"; //接口ID==============
String INPUTID2 = "15214"; //接口ID==============
String INPUTID3 = "15215"; //接口ID==============
//=======================================*/
#define dht11Pin 8 //定义温湿度针脚号为8号引脚
dht11 dht; //实例化一个对象
unsigned long lastCheckStatusTime = 0; //记录上次报到时间
unsigned long lastUpdateTime = 0;//记录上次上传数据时间
const unsigned long postingInterval = 40000; // 每隔40秒向服务器报到一次
const unsigned long updateInterval = 5000; // 数据上传间隔时间5秒
unsigned long checkoutTime = 0;//登出时间
void setup() {
Serial.begin(115200);
delay(5000);//等一会儿ESP8266
}
void loop() {
//每一定时间查询一次设备在线状态,同时替代心跳
if (millis() - lastCheckStatusTime > postingInterval) {
checkStatus();
}
//checkout 50ms 后 checkin
if ( checkoutTime != 0 && millis() - checkoutTime > 50 ) {
checkIn();
checkoutTime = 0;
}
//每隔一定时间上传一次数据
if (millis() - lastUpdateTime > updateInterval) {
int tol = dht.read(dht11Pin); //将读取到的值赋给tol
int temp = (float)dht.temperature; //将温度值赋值给temp
int humi = (float)dht.humidity; //将湿度值赋给humi
/*
update2(DEVICEID, INPUTID1, temp, INPUTID2, humi);//引用update函数上传数据到云平

*/
update1(DEVICEID, INPUTID1,humi);
update1(DEVICEID, INPUTID2,temp);
lastUpdateTime = millis();
}
//读取串口信息
while (Serial.available()) {
String inputString = Serial.readStringUntil('\n');
//检测json数据是否完整
int jsonBeginAt = inputString.indexOf("{");
int jsonEndAt = inputString.lastIndexOf("}");
if (jsonBeginAt != -1 && jsonEndAt != -1) {
//净化json数据
inputString = inputString.substring(jsonBeginAt, jsonEndAt + 1);
int len = inputString.length() + 1;
char jsonString[len];
inputString.toCharArray(jsonString, len);
aJsonObject *msg = aJson.parse(jsonString);
processMessage(msg);
aJson.deleteItem(msg);
}
}
}
//设备登录
//{"M":"checkin","ID":"xx1","K":"xx2"}\n
void checkIn() {
Serial.print("{\"M\":\"checkin\",\"ID\":\"");
Serial.print(DEVICEID);
Serial.print("\",\"K\":\"");
Serial.print(APIKEY);
Serial.print("\"}\n");
}
//强制设备下线,用消除设备掉线延时
//{"M":"checkout","ID":"xx1","K":"xx2"}\n
void checkOut() {
Serial.print("{\"M\":\"checkout\",\"ID\":\"");
Serial.print(DEVICEID);
Serial.print("\",\"K\":\"");
Serial.print(APIKEY);
Serial.print("\"}\n");
}

//查询设备在线状态
//{"M":"status"}\n
void checkStatus() {
Serial.print("{\"M\":\"status\"}\n");
lastCheckStatusTime = millis();
}

//处理来自ESP8266透传的数据
void processMessage(aJsonObject *msg) {
aJsonObject* method = aJson.getObjectItem(msg, "M");
if (!method) {
return;
}
String M = method->valuestring;
if (M == "WELCOME TO BIGIOT") {
checkOut();
checkoutTime = millis();
return;
}
if (M == "connected") {
checkIn();
}
}
//上传一个接口数据
//{"M":"update","ID":"2","V":{"2":"120"}}\n
void update1(String did, String inputid,int value){
Serial.print("{\"M\":\"update\",\"ID\":\"");
Serial.print(did);
Serial.print("\",\"V\":{\"");
Serial.print(inputid);
Serial.print("\":\"");
Serial.print(value);
Serial.println("\"}}");
}
//同时上传两个接口数据调用此函数
//{"M":"update","ID":"112","V":{"6":"1","36":"116"}}\n
void update2(String did, String inputid1, float value1, String inputid2, float value2) {
Serial.print("{\"M\":\"update\",\"ID\":\"");
Serial.print(did);
Serial.print("\",\"V\":{\"");
Serial.print(inputid1);
Serial.print("\":\"");
Serial.print(value1);
Serial.print("\",\"");
Serial.print(inputid2);
Serial.print("\":\"");
Serial.print(value2);
Serial.println("\"}}");
}
//上传更多数据,可以参考上面的写法,和通讯协议,自己添加。
//贝壳物联通讯协议:https://www.bigiot.net/help/1.html
fengzaiqingdao 评论于:2020-03-24 12:02:14
update1同时上传1个参数,如果多次调用会被前面的update1覆盖,建议根据需要例程中的子程序update(比如,你有2个参数,就调用update2;3个参数,自己照着写一个update3,同时上传3个参数)
乱臣贼子 回复于:2020-03-24 16:39:13
回复 @fengzaiqingdao:我也用了,但情况是一样的。串口通讯中显示有两个参数上传,但是平台还是一个。我在想是不是bug还是我没资格用两个数据串口……
乱臣贼子 回复于:2020-03-26 10:16:49
回复 @fengzaiqingdao哥哥哥哥,我试了一下,又可以了,谢谢谢谢!!!
HCW 回复于:2020-04-17 00:44:05
回复 @fengzaiqingdao:void update2(String did, String inputid1, float value1, String inputid2, float value2,String inputid3, float value3) {
Serial.print("{\"M\":\"update\",\"ID\":\"");
Serial.print(did);
Serial.print("\",\"V\":{\"");
Serial.print(inputid1);
Serial.print("\":\"");
Serial.print(value1);
Serial.print("\",\"");
Serial.print(inputid2);
Serial.print("\":\"");
Serial.print(value2);
Serial.print("\",\"");
Serial.print(inputid3);
Serial.print("\":\"");
Serial.print(value3);
Serial.println("\"}}");

前辈,您好。抱歉打扰您了,我也是和楼主一样的问题,我改了这个函数,还是不行,请问是哪里有不对的地方吗?
HCW 评论于:2020-04-17 00:44:41
前辈您好,请问您是怎么解决的?虚心向您请教。
乱臣贼子 回复于:2020-04-18 20:08:27
回复 @HCW:我问过一个四位的串口数据上传,后来我自己检查是因为符号出错了,然后我在自己的帖子下面贴出了正确的,要不你先看看?我手边没有电脑,不太容易对比
返回顶部