Introdução a string json/regex
introdução
Nas aplicações tradicionais de MCU, quando dois MCUs se comunicam por porta
serial, eles definem seus próprios quadros, incluindo cabeçalho de quadro,
quadro de dados, quadro de verificação e final de quadro. A figura mostra o
protocolo MavLink de controle de voo.

Essa forma é estável e eficiente, mas com desvantagens evidentes, como o fato de o esforço inicial ser um tanto grande, sendo necessário criar seu próprio protocolo e compilar o código manualmente também. Se pretende tentar a comunicação entre dois chips únicos, eu recomendo usar a transmissão de strings json pela porta serial!
Características excelentes: não há necessidade de conhecer os detalhes de baixo nível, por exemplo:
- não é preciso considerar big-endian e little-endian
- não é preciso considerar a conversão de bytes dos dados
- suporta comprimento arbitrário de int, float
- fácil de entender e de desenvolver.
Desvantagem: a eficiência é um pouco baixa, a codificação e a decodificação ocuparão a CPU.
Na verdade, transmitir JSON se tornou um padrão na programação de rede. Por exemplo, em APIs RESTful, o front-end e o back-end usam JSON para obter informações. Simplesmente não é comum no campo dos microcontroladores tradicionais. Por um lado, a eficiência é um pouco menor, e sistemas embarcados costumam ter requisitos mais altos de controle de custo. No entanto, com a redução do custo dos chips, muitas aplicações não têm requisitos muito altos de custo de material, e dão cada vez mais atenção à eficiência de desenvolvimento.
String
string = "hello string!"
A OpenMV é capaz de enviar strings pela porta serial.
from machine import UART
uart = UART(1, 9600)
string = "hello string!"
uart.write(string)
Operações com strings
http://www.runoob.com/python3/python3-string.html
Por exemplo:
blobs=[12,23,11,22,33,44]
print("%d", blobs[3])
JSON é uma forma concisa e eficiente de trocar dados. Pode ser tão simples quanto isto:
"[[12,0],[10,12],[22,10],[99,11]]"
Observação: eu uso uma string direta como essa para enviar as coordenadas x, y de um bloco de cor na OpenMV.
Também pode ser tão complexo quanto isto: ('''indica string multilinha em python)
'''
{
"number":10,
"color" :[255,0,0],
"rate" :0.65
}
'''
Uso essa estrutura para enviar as informações de cor coletadas na OpenMV para o servidor via wifi.
Ou pode ser assim:
'''
{
"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"
}
]
}
'''
Atenção: a forma do json é parecida com a do Python, mas o json é a forma de expressão de objetos, um pouco diferente da representação do Python.
Python gerando json
A OpenMV possui o módulo json; json.dumps(obj) e ujson.loads(str) podem facilmente gerar e decodificar strings 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))
Produzirá:
'[[12, 0], [10, 12], [22, 10], [99, 11]]'
'{"color": [255, 0, 0], "number": 10, "rate": 0.65}'
Em seguida, envie as strings pela porta serial; na outra extremidade, decodifique a string json em um objeto/array e prossiga com a lógica seguinte.
Módulos json de outros chips únicos
O json é simples e 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: Descarte a ideia
Você pode usar essas bibliotecas para converter strings json em objetos.
Módulos json de outras linguagens no computador
Basicamente, todas as linguagens suportam json (até mesmo lisp), portanto é fácil se comunicar.
Expressão regular
Se for um processamento simples de strings, basta usar algumas funções internas. Mas para requisitos relativamente complexos, você precisará de expressões regulares.
Por exemplo, no processamento de URL (isso não será usado com frequência na OpenMV, vou omitir; haverá uma breve introdução na aplicação de rede esp do meu MicroPython)