quqianghao 发表于 2013-2-15 23:51:52

串口JSON指令发送

我是一个PHP 程序员,休闲的时候也谢谢python ,小时候就很喜欢电子产品,现在发现了arduino真是太高兴了,休息的时间又可以有个东西玩玩了,但是写惯了PHP 在回来写C发现真是心有余力不足,好吧废话不多说了,最近准备弄个小车,可过年时预定的零件还不能马上发到货,于是先写个伪代码吧,首先我想到的就是和串口的数据交互问题,看了好多文章都不是我想要的做法,由于常使用JSON 我对JSON 还是很有把握的于是找到了aJSON这个库,看了DEMO觉得这个真是太棒了,写了点代码基本实现了我想要的参数传递。小弟新手请大家多多指教。

实现要求
   参数传递(由PYTHON 或 processing 通过串口发送给ARDUINO) 格式:{"motor":{"left":100, "right":20}, "servo":{"servo_1":90}}

基本的想法就是想把数据结构化些,并且JSON 好多语言也有支持,实在不行构造也简单,下面的代码只实现了简单的几个参数

{
      "motor":{
                "left":100,
                "right":20
      },
       "servo":{
               "servo_1":90
      }
}


当然也可以加更多例如

{
      "motor":{
                "left":100,
                "right":20
      },
       "servo":{
               "servo_1":90,
               "servo_2":40,
               "servo_3":20,
      },
      "led":{
               "led_1":1,
               "led_2":0,
               "led_3":1,
      },
   "test":"xxx"
}


代码如下:
#include <aJSON.h>
aJsonStream serial_stream(&Serial);

void setup()
{
Serial.begin(9600);
}

void loop()
{

if (serial_stream.available()) {
    /* First, skip any accidental whitespace like newlines. */
    serial_stream.skip();
}
if (serial_stream.available()) {
    /* Something real on input, let's take a look. */
    aJsonObject *msg = aJson.parse(&serial_stream);
    ComExecution(msg);
    aJson.deleteItem(msg);
}
}


void ComExecution(aJsonObject *msg)
{
aJsonObject *motor = aJson.getObjectItem(msg, "motor");//电动机指令速度
if (motor) { //电机参数存在
      aJsonObject *motor_left = aJson.getObjectItem(motor, "left"); //左速度
      aJsonObject *motor_right = aJson.getObjectItem(motor, "right");//右速度
      if(motor_left) {
            //左侧电机功能
            
            //
            Serial.println(motor_left->valueint);//速度为整型值
            //Serial.println(motor_left->valuestring);//字符串
            
      }
      if(motor_right) {
            //右侧电机功能
            
            //
            Serial.println(motor_right->valueint);
      }
}

aJsonObject *servo = aJson.getObjectItem(msg, "servo");//舵机指令角度
if(servo) { //舵机参数存在
      aJsonObject *servo_1 = aJson.getObjectItem(servo, "servo_1");
      if (servo_1) {
            //舵机1的功能
            
            //
            Serial.println(servo_1->valueint);
      }
}

}

大连好人 发表于 2013-2-16 08:51:32

arduino 上用 json,简直太棒了,感谢楼主分享!

ttyp 发表于 2013-2-16 09:20:02

赞,东西不错!!

gaoshine 发表于 2013-2-16 13:25:05

本帖最后由 gaoshine 于 2013-2-16 13:26 编辑

这个JSON解释器真的很棒! JSON一统江湖! JSON万岁!

ogre_c 发表于 2013-2-16 16:33:47

非常好,感觉都可以当协议使用,模仿了一下将SHT10温湿度数据用json形式发出。

#include <Wire.h>
#include <SHT1x.h>
#include <aJSON.h>
#include <avr/pgmspace.h>
aJsonStream serial_stream(&Serial);

// Specify data and clock connections and instantiate SHT1x object
#define dataPin8
#define clockPin 7

#define numID 1;

SHT1x sht1x(dataPin, clockPin);
const prog_char PROGMEM ADDING_Temperature_STRING[] = "Adding Temperature to the object\n";
const prog_char PROGMEM ADDING_Humidity_STRING[] = "Adding Humidity to the object\n";


void setup()
{
Serial.begin(9600);
//*********************************

}
void loop()
{
sendData();
}

void sendData()
{
aJsonObject *msg = createMessage();
aJson.print(msg, &serial_stream);
Serial.println(); /* Add newline. */
aJson.deleteItem(msg);
//*******************************************      
delay(1000);
}

/* Generate message like: { "ID":1,"temperature":25.5,"humidity":31.1} */
aJsonObject *createMessage()
{
int    id = numID;
floattemp = sht1x.readTemperatureC();
floathumidity = sht1x.readHumidity();

aJsonObject *msg = aJson.createObject();
if (msg != NULL) {
   aJson.addNumberToObject(msg, "ID", id);
   printProgStr( ADDING_Temperature_STRING);
   aJson.addNumberToObject(msg, "temperature", temp);
   printProgStr( ADDING_Humidity_STRING);
   aJson.addNumberToObject(msg, "humidity", humidity);

   return msg;
   }
}

void printProgStr(const prog_char* str) {
char c;
if (!str) {
    return;
}
while ((c = pgm_read_byte(str))) {
    Serial.write(c);
    str++;
}
}

沧海笑1122 发表于 2013-2-16 17:14:24

本帖最后由 沧海笑1122 于 2013-2-16 17:17 编辑

啊,一直在找这样一个解释器来移植水滴拍摄
方法一:可以用手机、或者平板的串口工具,用json形式通过OTG向arduino下发:{"drop1":60,
“drop2":60,
"space":154,
"flash":260}
水滴1:60毫秒
水滴2:60毫秒
两滴间隔:154毫秒
闪光灯引闪延时:260毫秒

用arduino执行,驱动电磁阀和闪灯。

方法二:用python编写简单的人机界面(友好地设置电磁阀和闪灯参数),然后用json形式串口下发,arduino解读、执行。

谢谢楼主,又多了一个玩法。

fangtaonj 发表于 2013-3-20 21:26:36

本帖最后由 fangtaonj 于 2013-3-20 21:27 编辑

楼主您好!我有个问题要解决,我是arduino初学者,打算用arduino的试验板读取GPS0183格式的数据,但对下面这样的GPS数据串不知如何读取,看你的帖子估计json能派上用场,你们本帖内容我还看不太明白求您帮忙解释一下!
我想读取下面GPS信息中的经纬度信息
N,139.446667,E,32.002354,应如何编程》?
格式举例:$GPGGA,062320,3537.8333,N,139.446667,E,32.002354,99.9,0100,M,,M,000,0000*7D
请您帮忙!

lizh1245 发表于 2013-4-7 23:16:03

请问一下这个库有发送json的命令么? arduino向电脑发送

MicroCao 发表于 2013-4-8 11:51:18

左右补充github地址https://github.com/interactive-matter/aJson

Pizzro 发表于 2013-7-18 14:50:02

mark。。。。。。。

幻生幻灭 发表于 2013-10-10 13:56:49

测试很好用,感谢分享

不过貌似有个小问题
就是当某一次由于通讯或BUG导致接收格式错误后(例如在}后增减个字符),就无法接收数据了。需要重启串口。

不知道有没有指令可以复位?

沧海笑1122 发表于 2014-4-15 00:36:05

请问这句的含义是?
aJsonStream serial_stream(&Serial);

我希望用softserial(我是esplora手柄,只能用softserial接蓝牙)传送ajson数据,如有使用过的网友请指点。谢谢。

转角 发表于 2014-4-15 09:38:20

这个是非常好的东西

沧海笑1122 发表于 2014-4-15 09:50:30

我感觉ajson库默认将数据发送至硬串口,我现在希望使用softserial,对库不了解没有能力改。希望有使用过的,或者对库熟悉的网友指点一二。

沧海笑1122 发表于 2014-4-15 21:30:14

已经解决了,ajson可以使用SoftwareSerial
只需要把serial改为 已经定义的SoftwareSerial即可。非常方便。#include <aJSON.h>
#include <Esplora.h>
#include <SoftwareSerial.h>
SoftwareSerial mySerial(11, 3); // RX, TX

aJsonStream myserial_stream(&mySerial);
页: [1] 2
查看完整版本: 串口JSON指令发送