Получение данных с главного компьютера с помощью Circuit Python на Circuit Playground Express

Я использую Circuit Playground Express от Adafruit и программирую его с помощью Circuit Python.

Я хочу прочитать данные, передаваемые с компьютера, к которому Circuit Playground Express подключен через USB. Использование input() работает нормально, но я бы предпочел вместо этого получить буфер серийного номера, чтобы цикл продолжался, пока нет ввода. Что-то вроде serial.read().

import serial не работает на Circuit Python, или, может быть, мне нужно что-то установить. Могу ли я еще что-нибудь сделать для чтения последовательного буфера с помощью Circuit Python?


person francisaugusto    schedule 22.02.2018    source источник
comment
Под Я хочу что-то прочитать вы имеете в виду, что хотите прочитать символы, отправленные компьютером, к которому подключено CPE? Я думаю, вы, вероятно, захотите использовать sys.stdin. Если вы ничего не добьетесь с этим, вам, вероятно, повезет больше, спросив на форуме Micropython или попробовав любые справочные ресурсы, доступные от Adafruit.   -  person nekomatic    schedule 26.02.2018
comment
Спасибо @nekomatic. Да, я хочу прочитать что-то, что отправлено компьютером, к которому подключен CPE. Попробую sys.stdin. Спасибо за совет!   -  person francisaugusto    schedule 27.02.2018
comment
По всей видимости, на данный момент это невозможно. Полное обсуждение Adafruit см. здесь.   -  person francisaugusto    schedule 28.02.2018


Ответы (3)


Теперь это отчасти возможно! В январском стабильном выпуске 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).

т.е. в питоне:

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))
person Aiden Ray    schedule 17.04.2019

Ответ Эйдена привел меня в правильном направлении, и я нашел здесь хороший (и немного другой) пример использования supervisor.runtime.serial_bytes_available из Adafruit (в частности, строки 89-95): https://learn.adafruit.com/AT-Hand-Raiser/circuitpython-code

Минимальный рабочий пример для code.py, который принимает входные данные и форматирует новую строку в форме «RX: строка»:

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 02.08.2019; Adafruit ItsyBitsy M0 Express с файлом samd21g18. Сообщения, отправленные с использованием последовательного соединения в mu-editor в macOS.

Пример вывода

main.py output:
listening...
hello!
RX: hello!
person nikmart    schedule 10.10.2019

У меня есть простой пример работы, основанный на вышеупомянутых сообщениях, я не уверен, насколько он стабилен или полезен, но все же публикую его здесь:

Код CircuitPython:

import supervisor

while True:
    if supervisor.runtime.serial_bytes_available:
        value = input().strip()
        print(f"Received: {value}\r") 

Код ПК

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']
person Labi Shrestha    schedule 11.05.2020