极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 119031|回复: 26

串口JSON指令发送

[复制链接]
发表于 2013-2-15 23:51:52 | 显示全部楼层 |阅读模式
我是一个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"
}


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

  3. void setup()
  4. {
  5.   Serial.begin(9600);
  6. }

  7. void loop()
  8. {
  9.   
  10.   if (serial_stream.available()) {
  11.     /* First, skip any accidental whitespace like newlines. */
  12.     serial_stream.skip();
  13.   }
  14.   if (serial_stream.available()) {
  15.     /* Something real on input, let's take a look. */
  16.     aJsonObject *msg = aJson.parse(&serial_stream);
  17.     ComExecution(msg);
  18.     aJson.deleteItem(msg);
  19.   }
  20. }


  21. void ComExecution(aJsonObject *msg)
  22. {
  23.   aJsonObject *motor = aJson.getObjectItem(msg, "motor");//电动机指令速度
  24.   if (motor) { //电机参数存在
  25.       aJsonObject *motor_left = aJson.getObjectItem(motor, "left"); //左速度
  26.       aJsonObject *motor_right = aJson.getObjectItem(motor, "right");//右速度
  27.       if(motor_left) {
  28.             //左侧电机功能
  29.             
  30.             //
  31.             Serial.println(motor_left->valueint);//速度为整型值
  32.             //Serial.println(motor_left->valuestring);//字符串
  33.             
  34.       }
  35.       if(motor_right) {
  36.             //右侧电机功能
  37.             
  38.             //
  39.             Serial.println(motor_right->valueint);
  40.       }
  41.   }
  42.   
  43.   aJsonObject *servo = aJson.getObjectItem(msg, "servo");//舵机指令角度
  44.   if(servo) { //舵机参数存在
  45.       aJsonObject *servo_1 = aJson.getObjectItem(servo, "servo_1");
  46.       if (servo_1) {
  47.             //舵机1的功能
  48.             
  49.             //
  50.             Serial.println(servo_1->valueint);
  51.       }
  52.   }  
  53.   
  54. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2013-2-16 08:51:32 | 显示全部楼层
arduino 上用 json,简直太棒了,感谢楼主分享!

回复 支持 反对

使用道具 举报

发表于 2013-2-16 09:20:02 | 显示全部楼层
赞,东西不错!!
回复 支持 反对

使用道具 举报

发表于 2013-2-16 13:25:05 | 显示全部楼层
本帖最后由 gaoshine 于 2013-2-16 13:26 编辑

这个JSON解释器真的很棒! JSON一统江湖! JSON万岁!
回复 支持 反对

使用道具 举报

发表于 2013-2-16 16:33:47 | 显示全部楼层
非常好,感觉都可以当协议使用,模仿了一下将SHT10温湿度数据用json形式发出。

  1. #include <Wire.h>
  2. #include <SHT1x.h>
  3. #include <aJSON.h>
  4. #include <avr/pgmspace.h>
  5. aJsonStream serial_stream(&Serial);

  6. // Specify data and clock connections and instantiate SHT1x object
  7. #define dataPin  8
  8. #define clockPin 7

  9. #define numID 1;

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


  13. void setup()
  14. {  
  15.   Serial.begin(9600);
  16. //*********************************  

  17. }
  18. void loop()
  19. {
  20.   sendData();
  21. }

  22. void sendData()
  23. {
  24.   aJsonObject *msg = createMessage();
  25.   aJson.print(msg, &serial_stream);
  26.   Serial.println(); /* Add newline. */
  27.   aJson.deleteItem(msg);
  28. //*******************************************        
  29.   delay(1000);
  30. }

  31. /* Generate message like: { "ID":1,"temperature":25.5,"humidity":31.1} */
  32. aJsonObject *createMessage()
  33. {
  34.   int    id = numID;
  35.   float  temp = sht1x.readTemperatureC();
  36.   float  humidity = sht1x.readHumidity();
  37.   
  38.   aJsonObject *msg = aJson.createObject();
  39.   if (msg != NULL) {
  40.      aJson.addNumberToObject(msg, "ID", id);
  41.      printProgStr( ADDING_Temperature_STRING);
  42.      aJson.addNumberToObject(msg, "temperature", temp);
  43.      printProgStr( ADDING_Humidity_STRING);
  44.      aJson.addNumberToObject(msg, "humidity", humidity);

  45.    return msg;
  46.    }
  47. }

  48. void printProgStr(const prog_char* str) {
  49.   char c;
  50.   if (!str) {
  51.     return;
  52.   }
  53.   while ((c = pgm_read_byte(str))) {
  54.     Serial.write(c);
  55.     str++;
  56.   }
  57. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2013-2-16 17:14:24 | 显示全部楼层
本帖最后由 沧海笑1122 于 2013-2-16 17:17 编辑

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

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

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

谢谢楼主,又多了一个玩法。
回复 支持 反对

使用道具 举报

发表于 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
请您帮忙!
回复 支持 反对

使用道具 举报

发表于 2013-4-7 23:16:03 | 显示全部楼层
请问一下这个库有发送json的命令么? arduino向电脑发送
回复 支持 反对

使用道具 举报

发表于 2013-4-8 11:51:18 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2013-7-18 14:50:02 | 显示全部楼层
mark。。。。。。。
回复 支持 反对

使用道具 举报

发表于 2013-10-10 13:56:49 | 显示全部楼层
测试很好用,感谢分享

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

不知道有没有指令可以复位?
回复 支持 反对

使用道具 举报

发表于 2014-4-15 00:36:05 | 显示全部楼层
请问这句的含义是?
aJsonStream serial_stream(&Serial);

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

使用道具 举报

发表于 2014-4-15 09:38:20 | 显示全部楼层
这个是非常好的东西
回复 支持 反对

使用道具 举报

发表于 2014-4-15 09:50:30 | 显示全部楼层
我感觉ajson库默认将数据发送至硬串口,我现在希望使用softserial,对库不了解没有能力改。希望有使用过的,或者对库熟悉的网友指点一二。
回复 支持 反对

使用道具 举报

发表于 2014-4-15 21:30:14 | 显示全部楼层
已经解决了,ajson可以使用SoftwareSerial
只需要把serial  改为 已经定义的SoftwareSerial即可。非常方便。
  1. #include <aJSON.h>
  2. #include <Esplora.h>
  3. #include <SoftwareSerial.h>
  4. SoftwareSerial mySerial(11, 3); // RX, TX

  5. aJsonStream myserial_stream(&mySerial);
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-23 16:21 , Processed in 0.046657 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表