首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Python和pyserial在pico (RP2040)上运行python脚本

使用Python和pyserial在pico (RP2040)上运行python脚本
EN

Stack Overflow用户
提问于 2021-09-21 15:17:02
回答 2查看 1.8K关注 0票数 1

我的最终目标是从PC上的GUI界面控制PCB上的一些外围芯片。为此,我的计划是在PCB上加入一个RP2040 (和内存),以便保存所有python脚本,并对所有外围芯片进行编程/监视。然后,使用PC与RP2040接口,通过串口发送命令在pico上执行特定的python文件。我意识到这有点让人费解,所以附图应该会有所帮助。

方框图

从框图的左边开始,我有一个运行tkinter的PC。我现在在Thonny经营tkinter。(最终,我希望它是一个可执行文件,但这超出了本文的范围) gui有许多按钮可以选择运行哪个python脚本。PC机通过USB电缆连接到PCB。USB数据线被路由到are 2040的USB输入端(引脚47,48)。PCB上的内存包含许多与GUI中的按钮相对应的python光盘。理想情况下,按下PC上的按钮将在pcb上执行相应的py文件。

到目前为止我所做的工作:,我真正的专长在于外围芯片和PCB设计,在这种情况下,2-18 got收发器的前端,如果我的一些python问题看起来很基本或错误的话,我就会感到赤裸裸。我已经编写并测试了pico内存中的所有.py文件。为了测试这些脚本,我使用Thonny连接到我的pico,只需运行(f5)脚本,外围设备连接到正确的GPIOs。我还可以让tkinter工作,并创建可以执行命令的功能按钮。使用pyserial模块,我还可以通过USB连接到pico并编写.弦乐。不是很有用,而是个开始。

代码语言:javascript
复制
import serial

ser = serial.Serial('COM3', 38400, timeout=1, parity=serial.PARITY_EVEN, rtscts=1)
s = ser.read(100)       # read up to one hundred bytes or as much is in the buffer

print(ser.name)                # check which port was really used
ser.write(b'ToggleLED.py')     # write a string
ser.close()                    # close port

剩余任务:--我在过去2天里不幸失败的最后一项任务实际上一直试图通过串口执行位于pico内存上的.py文件。我没有经验的/天真的想法就是简单地发送一个带有文件名的字符串,显然是不正确的。对于如何使用这个pyserial模块执行那些py文件,有什么想法吗?

BTW,如果有更好的解决方案,请随时分享!也许这些文件应该位于PC上,而我在同一时间发送了1条命令?

EN

回答 2

Stack Overflow用户

发布于 2021-09-28 16:22:27

在您澄清什么运行在pi上之前,我不能说任何关于您的系列问题的内容(请参阅我的评论:我会更新这个答案),但是“有更好的方法吗?”:可能。

因为Pi运行的是一个完整的操作系统,所以有几种选择。您基本上是在创建到Pi的网络连接。虽然这可以通过串行( Pi,想必,作为一个假的USB串行设备),它也可以做更传统的wifi或以太网。最后,您可以在Pi上托管您的接口,并在out浏览器中与其交互,将第二台计算机从图片中删除。您决定选择的确切选项取决于您,并且在这里真正脱离了主题(尽管它可能在SE的其他地方)。

向pi发送命令并让它运行脚本是远程过程调用。您可能希望查找一些通常用于此操作的协议(如JSON),但基本方法将在pi上运行代码:

代码语言:javascript
复制
def do_something():
    pass
def do_something_else():
    pass

functions = {"something": do_something, "something_else": do_something_else}

while True:
    cmd = get_input() # blocks until input comes
    if cmd in functions:
        reply(f"Running {cmd}")
        output = functions[cmd]()
        reply(f"{cmd} returned with output {output}")
    else:
        reply(f"Invalid command {cmd}")

这是一个原理图: pi上到底是什么get_input()将取决于您如何结束连接,以及您最终使用的是什么协议(如果有的话)。请注意,我已经建立了确认:您想知道事情是成功还是失败。

虽然可以将这些命令存储在单独的脚本中并调用它们,但如果它们只是python脚本,则没有理由不直接从pi上运行的代码调用函数。

票数 0
EN

Stack Overflow用户

发布于 2021-11-28 04:56:12

我看到了两种不同的解决方案:

  1. 通过Pi pico运行REPL (python shell),可以简单地从运行在主机上的python程序(Windows或Raspberry Pi等,连接到USB端口,关闭Thonny窗口)发送文本字符串,并作为python命令发送到pico。这一办法详见:

https://blog.rareschool.com/2021/01/controlling-raspberry-pi-pico-using.html

在pico方面,只需要定义一些将从REPL执行的函数。例如:

代码语言:javascript
复制
from machine import Pin

# use onboard LED which is controlled by Pin 25
led = Pin(25, Pin.OUT)
# Turn the LED on
def on():
    led.value(1)
# Turn the LED off
def off():
    led.value(0)

发送到pico的任何字符串,如

代码语言:javascript
复制
on()

将相应地执行。

  1. 在第二种方法中,pico将从USB串口读取每一行,并将该行解析为命令和附加参数,以便与预定义命令列表进行比较并相应执行。我使用Arduino did完成了这个任务,我正在将它移植到pico (=还没有代码显示:-() )。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69271473

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档