使用 pyserial 从 PC 调用 Raspberry Pi Pico 上的函数

问题描述 投票:0回答:1

我在 Raspberry Pi Pico 中有一个小的 python 文件,可以通过 PCA9685 伺服控制器控制伺服系统:

import time
from adafruit_servokit import ServoKit
import busio
import board
import time
kit = ServoKit(channels=16, i2c=(busio.I2C(board.GP1, board.GP0)))

def rotateservo():
    kit.servo[0].angle = 100
    time.sleep(1)
    kit.servo[0].angle = 0
    time.sleep(1)
    kit.servo[0].angle = 180

从 Pico 调用时该函数工作正常。 我正在寻找一种使用 pyserial 从 PC 调用该函数的方法

import serial
ser = serial.Serial('COM5', 115200, timeout=timeout)
ser.write('rotateservo()'.encode())
ser.close()

这只是输出数字 13,我假设它是字符串的长度。如何使用 pyserial 调用 Pi Pico 上的函数?

python pyserial raspberry-pi-pico
1个回答
0
投票

这里有一种方法可以做到这一点。我在 Pico W 上运行它(如果它不是“W”,您需要将“LED”更改为 13):

import select
import sys
from machine import Pin
import utime

gpio_no = 'LED'
led = Pin(gpio_no, Pin.OUT)

# setup poll to read USB port
poll_object = select.poll()
poll_object.register(sys.stdin,1)

led.value(0)
led.toggle()
utime.sleep(1)
led.toggle()

def blink():
    led.value(1)
    utime.sleep(.2)
    led.value(0)
    utime.sleep(.2)
    
def function_1():
    print("Executing function 1")
    blink()

def function_2():
    print("Executing function 2")
    blink()
    blink()

print("Started looking")
while True:
    # check usb input
    if poll_object.poll(0):
        #read as character
        ch = sys.stdin.read(1)
        if ch == "1":
            function_1()
        elif ch == "2":
            function_2()
        else:   
            print (ch, "Received. Was expecting 1 or 2")
            led.value(1)
            utime.sleep(1)
            led.value(0)

如果接收到“1”,则执行 function_1,该函数会使 LED 短暂闪烁一次,并发回一条消息。如果它收到“2”,它会短暂地使 LED 闪烁两次并发回另一条消息。对于所有其他字符,它会闪烁更长的时间(1 秒),并发送不同的消息。

这是在 PC 上用 Python 运行的代码(将 COM7 替换为您正在使用的端口号)。

import serial
import time

ser = serial.Serial('COM7', 9600, write_timeout=0)

to_send = ['1', '2', '3']

for a in to_send:
    bytes_sent = ser.write(bytes(a, 'UTF-8'))
    print(f"Sent {bytes_sent} bytes ({a})")
    line = ser.readline()
    print(f"Received: {line.decode('UTF-8') }")
    time.sleep(1)

ser.close()

print("done")

它使用pyserial模块,并以一秒的间隔发送“1”、“2”和“3”。这些信息被 Pico 接收,并闪烁响应,并将文本发送回 PC,确认其收到的内容。这是电脑打印输出:

Sent 1 bytes (1)
Received: Executing function 1

Sent 1 bytes (2)
Received: Executing function 2

Sent 1 bytes (3)
Received: 3 Received. Was expecting 1 or 2

done

设置此功能时,您需要将 Pico 程序作为 main.py 运行(从 Pico 运行)。一旦运行,您需要将 Thonny 从串行端口上移除,否则您将无法从 Python 代码访问它。为此,请单击右下角的 Thonny,并将其设置为除您正在使用的 COM 端口之外的任何端口(例如“本地 Python”)。

© www.soinside.com 2019 - 2024. All rights reserved.