串口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);
}
}
} arduino 上用 json,简直太棒了,感谢楼主分享!
赞,东西不错!! 本帖最后由 gaoshine 于 2013-2-16 13:26 编辑
这个JSON解释器真的很棒! JSON一统江湖! JSON万岁! 非常好,感觉都可以当协议使用,模仿了一下将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: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: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
请您帮忙!
请问一下这个库有发送json的命令么? arduino向电脑发送 左右补充github地址https://github.com/interactive-matter/aJson mark。。。。。。。 测试很好用,感谢分享
不过貌似有个小问题
就是当某一次由于通讯或BUG导致接收格式错误后(例如在}后增减个字符),就无法接收数据了。需要重启串口。
不知道有没有指令可以复位? 请问这句的含义是?
aJsonStream serial_stream(&Serial);
我希望用softserial(我是esplora手柄,只能用softserial接蓝牙)传送ajson数据,如有使用过的网友请指点。谢谢。 这个是非常好的东西 我感觉ajson库默认将数据发送至硬串口,我现在希望使用softserial,对库不了解没有能力改。希望有使用过的,或者对库熟悉的网友指点一二。 已经解决了,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