我在這里提出一個我一直在努力解決的問題。Python 3.8.8 - 使用 Anaconda - 使用 Spyder。
我想使用 Python 通過 bleak 庫將我的 Arduino Nano BLE 33 連接到 PC。這需要在 AsyncIO 庫中包含一些知識。
BUFFER_LENGHT = 13
PACKET_NUMBER = BUFFER_LENGHT*2
address = "04:56:14:27:55:E8"
MODEL_NBR_UUID = "0000101a-0000-1000-8000-00805f9b34fb"
def process_data(dati):
data = np.array(struct.unpack('H'*BUFFER_LENGHT,dati))
print('_____________DATA_____________')
print(data)
print('_____________END______________')
def shutdown():
client.disconnect()
print('_____________INTERRUPTED_____________')
async def main(address,loop):
global start_timestamp, stream_queue,client
client = BleakClient(address)
while await client.is_connected()==False:
try:
await client.connect()
except Exception as e:
print(e)
try:
time.sleep(1)
start_timestamp=datetime.timestamp(datetime.now())
while True:
dati = await client.read_gatt_char(MODEL_NBR_UUID)
process_data(dati)
time.sleep(2)
except Exception as e:
print(e)
else:
await client.stop_notify(MODEL_NBR_UUID)
await client.disconnect()
try:
loop = asyncio.get_event_loop()
loop.run_until_complete(main(address, loop))
loop.close()
except KeyboardInterrupt:
print("Process interrupted")
loop.run_until_complete(shutdown())
loop.close()
if __name__ == "__main__":
main()
因此,在匯入所有庫之后,我想使用client.read_gatt_char(MODEL_NBR_UUID)從 Arduino 讀取一些資料,然后解壓縮它。我的問題是我無法停止 AsyncIO 周期。我希望使用 ctrl C 停止代碼,但它不起作用,我無法理解為什么。
try-catch 結構有沒有錯誤?或者(更現實的)使用 asyncio 函式是否存在一些不精確性?
有人可以幫助我嗎?真的很感激。
uj5u.com熱心網友回復:
好吧,畢竟這是一個 Spyder 的東西。我復制了你的代碼,經過一些修復和洗掉BleakClient它的作業,所以我決定下載 Spyder。
Spyder 顯然是基于 IPython 的,并且具有一些來自普通 Python 時可能不熟悉的特性。我不確定您首先是如何在 Spyder 中運行該代碼的,因為在 Spyder 的單元格中呼叫它時run_until_complete會引發 a RuntimeError。
但是通過一些修改,您可以在 Spyder 中運行您的腳本:
import asyncio
from datetime import datetime
from asyncio.exceptions import CancelledError
BUFFER_LENGHT = 13
PACKET_NUMBER = BUFFER_LENGHT * 2
address = "04:56:14:27:55:E8"
MODEL_NBR_UUID = "0000101a-0000-1000-8000-00805f9b34fb"
def process_data(dati):
data = dati
print("_____________DATA_____________")
print(data)
print("_____________END______________")
async def shutdown():
# client.disconnect()
print("_____________INTERRUPTED_____________")
async def main(address):
global start_timestamp, stream_queue, client
# client = BleakClient(address)
try:
#await client.connect()
print("connect")
except Exception as e:
print(e)
try:
start_timestamp = datetime.timestamp(datetime.now())
while True:
dati = "some data"
process_data(dati)
await asyncio.sleep(2)
except CancelledError: #KeyboardInterrupt is raised as CancelledError
print("cancelled")
finally: # your else-block was unreachable code, use finally for finalizing stuff
print("stop notify") # your clean-up code here
print("disconnect")
async def start(): #new main entry point
await main(address)
這應該是開箱即用的,供您使用。只需使用“播放”按鈕運行檔案,現在您就可以從 IPython 界面運行您的函式。
[2] await start()
將啟動您的腳本。現在您應該可以在正在運行的單元格中使用“停止”按鈕或 ctrl c 停止。這遠非完美,但我想它應該為您提供重新插入BleakClient邏輯的起點。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/360680.html
上一篇:Go-實作超時的最佳方式
