Raspberry Pi Pico перестает работать после отправки данных через USB

Я хочу включить светодиод на некоторое время, когда мой Raspberry Pi Pico получит данные с USB. Вот код, который я использую для Raspberry Pi Pico:

import select
import sys
import machine

poll_obj = select.poll()
poll_obj.register(sys.stdin, select.POLLIN)
counter = 0
pin = machine.Pin(25, machine.Pin.OUT)
pin.value(0)

while True:
    poll_results = poll_obj.poll(1)
    if poll_results:
        # Read the data from stdin (read data coming from PC)
        data = sys.stdin.read().strip()
        pin.value(1)
        # Write the data to the input file
        print("receivedL " + str(data))
    else:
        counter = counter + 1
        if (counter >= 1000):
            pin.value(0)
            counter = 0
            print("test")



ПК-код:

import serial

s = serial.Serial(port = "COM3", parity=serial.PARITY_EVEN, timeout=1)
s.flush()

data = s.read()
while True:
    print(data)
    data = s.read()
    s.write("1".encode())
    s.flush()

Я запускаю эту настройку следующим образом:

Подключите Raspberry Pi Pico и запустите код (не используя Thonny или другой редактор). Убедитесь, что код работает, подключившись к порту USB с помощью PuTTY. Отключитесь от PuTTY и запустите мой код на ПК. ПК обычно показывает один вывод Raspberry Pi Pico, и больше ничего. Также светодиод не мигает. Я не уверен на 100%, связана ли проблема с функцией записи на моем компьютере, но, поскольку чтение, похоже, работает нормально, я подозреваю, что что-то еще может быть не так.

Кроме того, когда я не использую шпатлевку для проверки соединения, проблема все еще возникает.

Может ли кто-нибудь помочь мне понять, что может пойти не так?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
84
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это происходит потому, что в строке data = sys.stdin.read().strip() вы не указываете параметр количества символов для ожидания (поэтому он ожидает завершения файлового потока, как это произошло бы, если бы файл был закрыт). Кроме того, ваш код Pyserial отправляет бесконечный поток символов, что, если бы код Pico работал должным образом, означало бы, что светодиод будет гореть.

Поэтому измените строку Пико на data = sys.stdin.read(1).strip() так что вы просто ждете прибытия одного байта, прежде чем включить светодиод.

В идеале также измените код pyserial так, чтобы он просто отправлял байт каждые пару секунд для целей теста. Я сделал это здесь, а также использовал s.readline() для получения операторов печати, отправленных Pico через последовательный порт, и отображал их как целые слова, а не каждый символ в отдельной строке:

import serial
import time

s = serial.Serial(port = "COM3", parity=serial.PARITY_EVEN, timeout=1)
s.flush()

while True:
    data = s.readline()
    print(data)
    s.write("1".encode())
    print("write")
    s.flush()
    time.sleep(2)

Вот часть вывода программы pyserial:

b'test\r\n'
write
b'received 1\r\n'
write
b'test\r\n'

И последнее: очень полезно знать, что Pico правильно перезагрузился и готов принимать последовательные сообщения от ПК. Чтобы помочь в этом, поместите следующее непосредственно перед началом цикла while на Pico. После перезагрузки Pico мигнет один раз, сообщая вам, что он готов к приему.

pin.value(1)
utime.sleep(.5)
pin.value(0)

Упрощенная версия кода Пико
Поскольку вам не повезло с исправленным кодом Пико, попробуйте это. Это то, что я использовал некоторое время назад. Это заставляет светодиод мигать каждый раз, когда он получает байт.

"""
Flash LED when anything received at serial port
"""

import select
import sys
from machine import Pin
import utime

# gpio_no = 'LED'  # For Pico W
gpio_no = 25  # For non Pico W
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(.2)
led.toggle()

print("Started looking")
while True:
    # check usb input
    if poll_object.poll(0):
        #read as character
        ch = sys.stdin.read(1)
        print (ch,"hello from the pico")
        led.value(1)
        utime.sleep(.2)
        led.value(0)
        utime.sleep(.2)

Попробуйте запустить это с помощью приведенного выше кода pyserial. Для меня это дает:

b''
write
b'1 hello from the pico\r\n'
write
b'1 hello from the pico\r\n'
write

и т. д.

Да, ты прав! Я забыл завершить поток или указать количество символов для ожидания. К сожалению, он до сих пор не работает. Я попробовал установить это line data = sys.stdin.read(1).strip(), как вы предложили, а также добавить s.close() в код ПК. Ни то, ни другое не сработало. Мой результат по-прежнему выглядит так: b'test\r\n' write b'' write b'' write b''

cichyvx 12.06.2024 17:56

Использовали ли вы конкретный код ПК, который я указал выше? А вы добавили код Пико, чтобы светодиод мигал, чтобы подтвердить, что Пико прослушивает?

Lee-xp 12.06.2024 18:33

Да, я включил все. Светодиодная вспышка при запуске.

cichyvx 12.06.2024 20:12

Странный. Вы видите, как оно мигает в начале? Я предполагаю, что вы запускаете его на Pico под именем main.pi?

Lee-xp 12.06.2024 20:21

В конце моего ответа я добавил новый раздел, дающий немного более простую, но полную версию кода Pico. Посмотрите, что это дает, с помощью приведенного выше кода pyserial.

Lee-xp 12.06.2024 20:38

Это работает! Спасибо вам огромное :D

cichyvx 12.06.2024 22:28

Прохладный. Рад помочь.

Lee-xp 13.06.2024 10:30

Другие вопросы по теме