版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2相关知识34任务小结与练习1任务实施任务引入与目标Arduino程序中的JSON解析一、任务引入与目标任务目标任务5通过计算机向ESP32的串口发送满足JSON对象格式的字符串,ESP32收到后解析并控制LED灯。使用ArduinoJson库对接收的数据进行解析。任务引入通过serialEvent函数的设计,程序很清晰。接下来,我们思考怎样把解析过程变得清晰起来,可以用到JSON数据格式。这是一种跨语言的数据格式,C语言、Java、JavaScript都要使用,会贯穿于网关设计、APP设计和后端设计全过程。二、相关知识JSON对象数据格式JavaScript对象表示法(JavaScriptObjectNotation)是一种轻量级的文本数据交换格式。它独立于语言,具有自我描述性,容易被理解和使用。比如一个JSON对象:{"motor":{"left":100,"right":20},"servo":{"servo_a":90}}。其中,有两个成员(也是JSON对象),分别是motor、servo。JSON对象的成员是键值对,键和值之间用冒号分隔,键值对之间用逗号分隔。ArduinoJson库的构造类在Arduino中解析JSON数据,可以交给ArduinoJson库处理,但一定是从外到里一层层地获取。JsonBuffer作为ArduinoJson库的入口,负责处理整个JSON数据的内存管理以及构造解析工作,它包括两个实现类:二、相关知识(1)DynamicJsonBuffer,内存分配在heap区,无固定大小,可以自动增长所需空间,方法调用完自动回收;(2)StaticJsonBuffer,内存分配在stack区,有固定大小,大小值由开发者定义,方法调用完自动回收。JsonBuffer对象的方法(1)parseObject方法:功能是将字符串转换为JSON对象。能否转换成功,要看字符串本身是否满足JSON对象格式。(2)Success方法:判断JSON对象是否有效。很明显,parseObject方法后面应该有一个Success方法进行判断,然后进行解析才有意义。三、任务实施实施设备部署了Arduino开发环境的计算机。实施过程1.工程目标对一个成员的JSON对象解析工程名为OneKeyValue,串口接收符合JSON对象格式的字符串,通过ArduinoJson库进行解析。假如串口收到字符串{"LightStatus":1},点亮灯;收到字符串{"LightStatus":0},熄灭灯;收到其他字符串(不满足JSON对象格式),不处理。可见,JSON对象里只有一个成员,键(字段)是“LightStatus”。三、任务实施#include<ArduinoJson.h>StringinputString="";//aStringtoholdincomingdataboolstringComplete=false;//whetherthestringiscomplete//引脚定义#defineLIGHT25//产品标识符StringIdentifier="LightStatus";voidsetup(){//initializeserial:Serial.begin(9600);//reserve200bytesfortheinputString:inputString.reserve(200);pinMode(LIGHT,OUTPUT);}2.程序设计voidloop(){//printthestringwhenanewlinearrives:if(stringComplete){Serial.println(inputString);//解析,控制,约定Json格式:{"LightStatus":1},{"LightStatus":0}StaticJsonBuffer<200>jsonBuffer;JsonObject&root=jsonBuffer.parseObject(inputString);if(!root.success()){Serial.println("parseObject()failed");inputString="";stringComplete=false;return;}constchar*val=root[Identifier];三、任务实施if(val!=NULL){constuint16_tLightStatus=root[Identifier];if(LightStatus==1){digitalWrite(LIGHT,HIGH);}else{digitalWrite(LIGHT,LOW);}Serial.print("LightStatus:");Serial.println(LightStatus);}//clearthestring:inputString="";stringComplete=false;}serialEvent();}voidserialEvent(){while(Serial.available()){//getthenewbyte:charinChar=(char)Serial.read();//addittotheinputString:inputString+=inChar;//iftheincomingcharacterisanewline,setaflagsothemainloopcan//dosomethingaboutitif(inChar==\'n'){stringComplete=true;}}}三、任务实施我们下面主要分析loop函数中的解析过程:当串口接收到字符串inputString后,调用jsonBuffer对象的parseObject,将字符串转为JSON对象root,可能成功,也可能不成功。调用root对象的success方法,判断root是否是JSON对象:如果不是JSON对象,则没有必要进行解析了,清除inputString和标志后返回;如果是JSON对象,则执行接下来的解析过程。解析过程中,取出JSON对象“LightStatus”字段的值,如果非空,第二次取出后,根据值控制LED的亮和灭。在以上解析过程中,需要注意两点:一是先转换再解析,转换过程可能不成功;二是解析两次,避免未收到命令即解析值为NULL,但赋值为0,控制LED熄灭的错误操作。3.硬件连接LED灯的数据引脚连接IO25。下载线连接,因为ESP32开发板有USB转串口芯片CP2102,将USB口转为串口Serial,也就是说本任务中ESP32使用的是Serial。三、任务实施4.运行效果下载程序后,打开串口监视器,波特率为9600。计算机发送字符串:{"LightStatus":1}(后面加上换行符作为结束符),红灯点亮,并且串口监视器接收区显示:LightStatus:1,效果如图1-16所示。图1-16点亮红灯三、任务实施计算机发送字符串{"LightStatus":0}(后面加上换行符作为结束符),红灯熄灭,并且串口监视器接收区显示LightStatus:0,效果如图117所示。图117关闭红灯四、任务小结与练习任务小结任务5中通过计算机往
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论