字符串简介json/正则
介绍
在传统的单片机应用中,两个单片机串口通信,都是自己定义一些帧,包括帧头,数据帧,校验帧,帧尾。 图中 是飞控MavLink的协议。
这种方式,稳定,高效。缺点也很明显:开发难度稍大,需要自己制定协议,编码解码需要手动编写。如果想快速尝试两个单片机通信的。我推荐使用串口传输json字符串!
优点:不需要了解底层的事情,比如:
- 不考虑大端小端
- 不考虑数据的byte转换
- 支持任意长的int,float
- 简单易懂,容易开发。
缺点:效率稍低。json的编码和解码会占用cpu。
其实传输json在网络编程中已经成为标准,比如在restful api中,前端和后端使用json来获取信息。只是在传统单片机的领域中不常见,一方面是效率稍低,嵌入式通常对成本的控制要求比较高。但是随着芯片成本的降低,很多应用对物料成本要求不是很高了,对开发效率越来越重视。
字符串
string = "hello string!"
OpenMV 是可以直接通过串口发送字符串的。
from machine import UART
uart = UART(1, 9600)
string = "hello string!"
uart.write(string)
字符串操作
http://www.runoob.com/python3/python3-string.html
举个例子:
blobs=[12,23,11,22,33,44]
print("%d", blobs[3])
JSON
JSON是一种简洁高效的交换数据的格式。 它可以是这种简单的:
"[[12,0],[10,12],[22,10],[99,11]]"
注:我通过这种简单的字符串,把OpenMV中的色块的x,y坐标发送出去。
也可以是这种复杂的:('''在python中表示多行字符串)
'''
{
"number":10,
"color" :[255,0,0],
"rate" :0.65
}
'''
我使用这种结构把OpenMV采集到的颜色信息发送到wifi中的服务器中。
甚至于,可以像这样:
'''
{
"firstName": "John",
"lastName": "Smith",
"sex": "male",
"age": 25,
"address":
{
"streetAddress": "21 2nd Street",
"city": "New York",
"state": "NY",
"postalCode": "10021"
},
"phoneNumber":
[
{
"type": "home",
"number": "212 555-1234"
},
{
"type": "fax",
"number": "646 555-4567"
}
]
}
'''
注意:json的形式和Python很像,但是json是javascript的对象表达形式,和python的表达形式稍有不同。
python生成json
OpenMV有json的模块,json.dumps(obj)和ujson.loads(str)可以很容的生成json字符串和解析json字符串。
import json
obj = [[12,0],[10,12],[22,10],[99,11]]
print(json.dumps(obj))
obj = {
"number":10,
"color" :[255,0,0],
"rate" :0.65
}
print(json.dumps(obj))
会输出:
'[[12, 0], [10, 12], [22, 10], [99, 11]]'
'{"color": [255, 0, 0], "number": 10, "rate": 0.65}'
然后把字符串通过串口发送出去,然后在另一端,把json字符串解析成对象/数组。然后进行接下来的逻辑操作。
其他单片机的json模块
json很简单也很通用。
- Arduino: https://github.com/bblanchon/ArduinoJson
- STM32: http://blog.csdn.net/yannanxiu/article/details/52712723
MicroPython(pyboard,esp8266,samd21): http://docs.micropython.org/en/latest/pyboard/library/ujson.html
NodeMCU(esp8266): https://nodemcu.readthedocs.io/en/master/en/modules/sjson/
- 51: 扔了吧
你可以利用这些库,把json字符串转换成对象。
电脑其他语言的json模块
基本所有的语言都支持json(连lisp都有,^>^)。。。所以可以很容易的进行通信。
正则表达式
如果是一些简单的字符串处理,使用python内置的一些功能就可以,但是对于复杂一些的需求,就需要使用正则表达式了。
比如URL处理中。(此处在OpenMV中使用不多。先略去,在我的MicroPython的esp8266网络应用中会详细介绍)