Introducción a cadenas json/expresiones regulares
Introducción
En las aplicaciones tradicionales de microcontroladores, cuando dos MCU se
comunican mediante puertos serie, ellas mismas definen algunos marcos, incluyendo
la cabecera del marco, el marco de datos, el marco de verificación y el final
del marco. La figura muestra el protocolo de control de vuelo MavLink.

Esta forma es estable y eficiente, pero con inconvenientes evidentes, como que el trabajo de apertura es un poco grande, hay que crear el protocolo por cuenta propia y compilar el código manualmente también. Si se pretende intentar comunicar entre dos chips únicos, ¡recomiendo usar la transmisión de cadenas json por puerto serie!
Característica excelente: no hay necesidad de conocer los problemas de bajo nivel, por ejemplo:
- no hay que considerar el orden de bytes (big endian/little endian)
- no hay que considerar el cambio de bytes de los datos
- admite longitud arbitraria de int, float
- fácil de entender y de desarrollar.
Inconveniente: la eficiencia es un poco baja, la codificación y la decodificación ocuparán CPU.
De hecho, transmitir JSON se ha convertido en un estándar en la programación de redes. Por ejemplo, en una API RESTful, el front-end y el back-end usan JSON para obtener información. Simplemente no es común en el campo de los microcontroladores tradicionales. Por un lado, la eficiencia es ligeramente menor, y los sistemas embebidos suelen tener requisitos más altos de control de costos. Sin embargo, con la reducción de los costos de los chips, muchas aplicaciones ya no tienen requisitos muy altos en cuanto a costos de materiales, y se presta cada vez más atención a la eficiencia del desarrollo.
Cadena
string = "hello string!"
OpenMV puede enviar una cadena a través del puerto serie.
from machine import UART
uart = UART(1, 9600)
string = "hello string!"
uart.write(string)
Operaciones con cadenas
http://www.runoob.com/python3/python3-string.html
Por ejemplo:
blobs=[12,23,11,22,33,44]
print("%d", blobs[3])
JSON es una forma concisa y eficiente de intercambiar datos. Puede ser tan
simple como esto:
"[[12,0],[10,12],[22,10],[99,11]]"
Nota: uso una cadena tan directa para enviar las coordenadas x, y del bloque de color en OpenMV.
También puede ser complejo como esto: ('''indica una cadena multilínea en Python)
'''
{
"number":10,
"color" :[255,0,0],
"rate" :0.65
}
'''
Uso esta estructura para enviar la información de color recopilada en OpenMV al servidor de wifi.
Así que, por ejemplo, puede ser así:
'''
{
"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"
}
]
}
'''
Atención: la forma de json es como Python, pero json es la forma de expresión sobre el sujeto, algo diferente de la representación de python.
Python genera json
OpenMV tiene los módulos json; json.dumps(obj) y ujson.loads(str) pueden generar fácilmente una cadena json y decodificar una cadena 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))
Se obtendrá como salida:
'[[12, 0], [10, 12], [22, 10], [99, 11]]'
'{"color": [255, 0, 0], "number": 10, "rate": 0.65}'
Luego se envían las cadenas por el puerto serie, y en el otro extremo, se decodifica la cadena json en un objeto/arreglo y se continúa con las siguientes operaciones lógicas.
Módulos json de otros microcontroladores
Json es simple y universal.
- 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: Descártalo
Puedes usar estas bibliotecas para transportar cadenas json a objetos.
Módulos json de otros lenguajes en la computadora
Básicamente, todos los lenguajes admiten json (incluso lisp), así que es fácil comunicarse.
Expresión regular
Si se trata de un procesamiento simple de cadenas, solo se necesita usar algunas funciones internas. Pero para requisitos relativamente complejos, se necesitará usar expresiones regulares.
Por ejemplo, en el procesamiento de URL (no se usa mucho en OpenMV, se omite aquí; habrá una breve introducción en la aplicación de red esp de mi MicroPython)