編碼和串列埠通訊
先了解字串和bytes(位元組)
字串:
python裡的字串就是文字,用於與人類互動,像這樣:
阿拉伯數字:a = ‘1234566454’
英語: b = ‘I love you.’
簡體中文:c = ‘我熱愛學習’
Python3的字串是utf8編碼的,可以支援世界上所有的語言,並且是ASCII相容的。
bytes:
python中,bytes是二進位制資料,與string不同的是,bytes是用來傳輸的,就是一個一個的二進位制資料。
什麼是編碼?
編碼分為:編碼(encoding)和解碼(decoding)
具體可以從下面一篇文章理解:
Python 3的bytes/str之別:
原文:
Python 3最重要的新特性大概要算是對文字和二進位制資料作了更為清晰的區分。文字總是Unicode,由str型別表示,二進位制資料則由bytes型別表示。Python 3不會以任意隱式的方式混用str和bytes,正是這使得兩者的區分特別清晰。你不能拼接字串和位元組包,也無法在位元組包裡搜尋字串(反之亦然),也不能將字串傳入引數為位元組包的函式(反之亦然)。這是件好事。
不管怎樣,字串和位元組包之間的界線是必然的,下面的圖解非常重要,務請牢記於心:
字串可以編碼成位元組包,而位元組包可以解碼成字串。
micropython的串列埠操作
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:
今天寫的東西實在是亂。那為啥還寫呢?主要還是我沒有理解好串列埠通訊【特別是用python來寫】,好記性不如爛筆頭啊,暫且寫下來,下面我是想用pc來做影象和演算法處理的(微控制器的效能還是太差了),然後將處理的資料傳送給微控制器(可能用ESP32又或者樹莓派又或者arduino)作為下位機接收資料後進行一些控制操作【控制機械臂】。