编码和串口通信

先了解字符串和bytes(字节
字符串:
python里的字符串就是文本,用于与人类交互,像这样:
阿拉伯数字:a = ‘1234566454’
英语: b = ‘I love you.’
简体中文:c = ‘我热爱学习’

Python3的字符串是utf8编码的,可以支持世界上所有的语言,并且是ASCII兼容的。

bytes:
python中,bytes是二进制数据,与string不同的是,bytes是用来传输的,就是一个一个的二进制数据。

什么是编码?
编码分为:编码(encoding)和解码(decoding)

具体可以从下面一篇文章理解:
Python 3的bytes/str之别:
原文:The bytes/str dichotomy in Python 3中解析道:
Python 3最重要的新特性大概要算是对文本和二进制数据作了更为清晰的区分。文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示。Python 3不会以任意隐式的方式混用str和bytes,正是这使得两者的区分特别清晰。你不能拼接字符串和字节包,也无法在字节包里搜索字符串(反之亦然),也不能将字符串传入参数为字节包的函数(反之亦然)。这是件好事。
不管怎样,字符串和字节包之间的界线是必然的,下面的图解非常重要,务请牢记于心:
编码和串口通信_第1张图片
字符串可以编码成字节包,而字节包可以解码成字符串。
这里写图片描述

micropython的串口操作,除了发送uart.write(string)外,还有:

uart.write(string)    #发送一个字符串
uart.writechar(int)   #发送一个char
uart.any()            #检测还有多少字符可以接受
uart.read(n)          #接收n个byte
uart.readall()        #接受所有
uart.readchar()       #接受一个字符
uart.readline()       #读取一行,以换行符为结尾
uart.sendbreak()      #发送一个00

注意:不要直接使用uart.read(),不加参数的话,会持续1s,会拖慢程序。

如果想快速尝试两个单片机通信的。我推荐使用串口传输json字符串!
其实传输json在网络编程中已经成为标准,比如在restful api中,前端和后端使用json来获取信息。只是在传统单片机的领域中不常见,一方面是效率稍低,嵌入式通常对成本的控制要求比较高。但是随着芯片成本的降低,很多应用对物料成本要求不是很高了,对开发效率越来越重视。

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字符串解析成对象/数组。然后进行接下来的逻辑操作。

下面是micropython的ujson:
编码和串口通信_第2张图片

micropython的ustruct:
编码和串口通信_第3张图片
如果不懂继续看python官网解析:
https://docs.python.org/3/library/struct.html#module-struct
全英看不懂可以参考:
http://www.runoob.com/python/python-json.html

串口通信参考:
http://book.openmv.cc/MCU/serial1.html

今天写的东西实在是乱。那为啥还写呢?主要还是我没有理解好串口通信【特别是用python来写】,好记性不如烂笔头啊,暂且写下来,下面我是想用pc来做图像和算法处理的(单片机的性能还是太差了),然后将处理的数据发送给单片机(可能用ESP32又或者树莓派又或者arduino)作为下位机接收数据后进行一些控制操作【控制机械臂】。

你可能感兴趣的:(esp32)