我正在尝试使用 asyncio。
我想计算读取arduino串口的时间。我使用硬件触发器向外部发送 arduino 串口。
我的代码是:
import asyncio
from Classes.Arduino_class import ArduinoController
async def wait_for_serial(ard):
print('entered function')
data = await ard.read_data()
return data
async def main():
ard = ArduinoController()
task = asyncio.create_task(wait_for_serial(ard))
ind = 0
while True:
print(ind)
ind += 1
if task.done():
result = await task
print(f"Got signal from Arduino: {result}")
break
else:
await asyncio.sleep(1)
if __name__ == '__main__':
asyncio.run(main())
Arduino 类是:
class ArduinoController:
def __init__(self):
self.ard = serial.Serial('COM7', 2000000)
time.sleep(0.2)
async def read_data(self):
return self.ard.read().decode()
def write_data(self, val):
self.ard.write(val.encode())
ard.read() 命令是一个阻塞代码直到读取数据的命令。
我为这个简单的脚本尝试了几种配置,但我就是找不到正确的配置。 通常发生的情况是脚本打印“0”,然后“输入函数”,然后停止,直到我发送 arduino 序列号。
由于
self.ard.read()
是阻塞的,因此您需要修改 read_data
方法,以便它可以以某种方式启动并等待读取调用完成,而不会阻塞其他异步任务:
from concurrent.futures import ThreadPoolExecutor
...
NUM_CONCURRENT_READ_WRITE_REQUESTS = 1 # Size of the thread pool
executor = ThreadPoolExecutor(NUM_CONCURRENT_READ_WRITE_REQUESTS)
...
class class ArduinoController:
...
async def read_data(self):
loop = asyncio.get_running_loop()
data = await loop.run_in_executor(executor, self.ard.read)
return data.decode()
...