Я хочу включить светодиод на некоторое время, когда мой 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%, связана ли проблема с функцией записи на моем компьютере, но, поскольку чтение, похоже, работает нормально, я подозреваю, что что-то еще может быть не так.
Кроме того, когда я не использую шпатлевку для проверки соединения, проблема все еще возникает.
Может ли кто-нибудь помочь мне понять, что может пойти не так?
Это происходит потому, что в строке 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
и т. д.
Использовали ли вы конкретный код ПК, который я указал выше? А вы добавили код Пико, чтобы светодиод мигал, чтобы подтвердить, что Пико прослушивает?
Да, я включил все. Светодиодная вспышка при запуске.
Странный. Вы видите, как оно мигает в начале? Я предполагаю, что вы запускаете его на Pico под именем main.pi?
В конце моего ответа я добавил новый раздел, дающий немного более простую, но полную версию кода Pico. Посмотрите, что это дает, с помощью приведенного выше кода pyserial.
Это работает! Спасибо вам огромное :D
Прохладный. Рад помочь.
Да, ты прав! Я забыл завершить поток или указать количество символов для ожидания. К сожалению, он до сих пор не работает. Я попробовал установить это
line data = sys.stdin.read(1).strip()
, как вы предложили, а также добавитьs.close()
в код ПК. Ни то, ни другое не сработало. Мой результат по-прежнему выглядит так:b'test\r\n' write b'' write b'' write b''