在 Circuit Playground Express 上使用 Circuit Python 从主机接收数据
Receive data from host computer using Circuit Python on Circuit Playground Express
我正在使用 Adafruit 的 Circuit Playground Express,我正在使用 Circuit Python 对其进行编程。
我想读取从 Circuit Playground Express 通过 USB 连接到的计算机传输的数据。使用 input()
工作正常,但我宁愿获取串行缓冲区,以便在没有输入时循环继续。类似于 serial.read()
。
import serial
在电路 Python 上不起作用,或者我可能必须安装一些东西。我还能做些什么来使用电路读取串行缓冲区 Python?
现在有点可能!
stable release of CircuitPython 3.1.2 一月,函数 serial_bytes_available
被添加到 supervisor
模块。
这允许您轮询串行字节的可用性。
例如,在 CircuitPython 固件(即 boot.py
)中,串行回显示例为:
import supervisor
def serial_read():
if supervisor.runtime.serial_bytes_available():
value = input()
print(value)
并确保在主机端创建串行设备对象时将超时等待时间设置得非常小(即 0.01)。
即 python:
import serial
ser = serial.Serial(
'/dev/ttyACM0',
baudrate=115200,
timeout=0.01)
ser.write(b'HELLO from CircuitPython\n')
x = ser.readlines()
print("received: {}".format(x))
Aiden 的回答将我引向了正确的方向,我在此处找到了一个很好的(且略有不同)示例,说明如何使用 Adafruit 中的 supervisor.runtime.serial_bytes_available
(特别是第 89-95 行):https://learn.adafruit.com/AT-Hand-Raiser/circuitpython-code
code.py
的最小工作示例是
,它接受输入并格式化 "RX: string" 形式的新字符串
import supervisor
print("listening...")
while True:
if supervisor.runtime.serial_bytes_available:
value = input().strip()
# Sometimes Windows sends an extra (or missing) newline - ignore them
if value == "":
continue
print("RX: {}".format(value))
测试于:Adafruit CircuitPython 4.1.0,2019-08-02; Adafruit ItsyBitsy M0 Express 与 samd21g18。在 macOS 上的 mu-editor 中使用串行连接发送的消息。
示例输出
main.py output:
listening...
hello!
RX: hello!
我得到了一个基于以上帖子的简单示例,不确定它有多稳定或有用,但仍然在这里发布它:
CircuitPython代码:
import supervisor
while True:
if supervisor.runtime.serial_bytes_available:
value = input().strip()
print(f"Received: {value}\r")
PC码
import time
import serial
ser = serial.Serial('COM6', 115200) # open serial port
command = b'hello\n\r'
print(f"Sending Command: [{command}]")
ser.write(command) # write a string
ended = False
reply = b''
for _ in range(len(command)):
a = ser.read() # Read the loopback chars and ignore
while True:
a = ser.read()
if a== b'\r':
break
else:
reply += a
time.sleep(0.01)
print(f"Reply was: [{reply}]")
ser.close()
c:\circuitpythontest>python TEST1.PY
Sending Command: [b'hello\n\r']
Reply was: [b'Received: hello']
我正在使用 Adafruit 的 Circuit Playground Express,我正在使用 Circuit Python 对其进行编程。
我想读取从 Circuit Playground Express 通过 USB 连接到的计算机传输的数据。使用 input()
工作正常,但我宁愿获取串行缓冲区,以便在没有输入时循环继续。类似于 serial.read()
。
import serial
在电路 Python 上不起作用,或者我可能必须安装一些东西。我还能做些什么来使用电路读取串行缓冲区 Python?
现在有点可能!
stable release of CircuitPython 3.1.2 一月,函数 serial_bytes_available
被添加到 supervisor
模块。
这允许您轮询串行字节的可用性。
例如,在 CircuitPython 固件(即 boot.py
)中,串行回显示例为:
import supervisor
def serial_read():
if supervisor.runtime.serial_bytes_available():
value = input()
print(value)
并确保在主机端创建串行设备对象时将超时等待时间设置得非常小(即 0.01)。
即 python:
import serial
ser = serial.Serial(
'/dev/ttyACM0',
baudrate=115200,
timeout=0.01)
ser.write(b'HELLO from CircuitPython\n')
x = ser.readlines()
print("received: {}".format(x))
Aiden 的回答将我引向了正确的方向,我在此处找到了一个很好的(且略有不同)示例,说明如何使用 Adafruit 中的 supervisor.runtime.serial_bytes_available
(特别是第 89-95 行):https://learn.adafruit.com/AT-Hand-Raiser/circuitpython-code
code.py
的最小工作示例是
import supervisor
print("listening...")
while True:
if supervisor.runtime.serial_bytes_available:
value = input().strip()
# Sometimes Windows sends an extra (or missing) newline - ignore them
if value == "":
continue
print("RX: {}".format(value))
测试于:Adafruit CircuitPython 4.1.0,2019-08-02; Adafruit ItsyBitsy M0 Express 与 samd21g18。在 macOS 上的 mu-editor 中使用串行连接发送的消息。
示例输出
main.py output:
listening...
hello!
RX: hello!
我得到了一个基于以上帖子的简单示例,不确定它有多稳定或有用,但仍然在这里发布它:
CircuitPython代码:
import supervisor
while True:
if supervisor.runtime.serial_bytes_available:
value = input().strip()
print(f"Received: {value}\r")
PC码
import time
import serial
ser = serial.Serial('COM6', 115200) # open serial port
command = b'hello\n\r'
print(f"Sending Command: [{command}]")
ser.write(command) # write a string
ended = False
reply = b''
for _ in range(len(command)):
a = ser.read() # Read the loopback chars and ignore
while True:
a = ser.read()
if a== b'\r':
break
else:
reply += a
time.sleep(0.01)
print(f"Reply was: [{reply}]")
ser.close()
c:\circuitpythontest>python TEST1.PY
Sending Command: [b'hello\n\r']
Reply was: [b'Received: hello']