Я пытаюсь написать тестовый код для отправки данных через UART на моем Raspberry PI 3 b+, но не могу получить обратно отправленные данные. Raspberry подключен через модуль UART к моему ноутбуку, поэтому я могу видеть результаты в Putty. Кто-нибудь может сказать мне, что я делаю неправильно?
Я проверил, открыт ли порт, и он вернул True, msg=b'Hello' вернул Hello, показал привет, но байты не были получены. Отправка отдельных байтов также не дает обнаруженных байтов. Стирание таймаута показало, что он достигнут.
Редактировать: провел небольшое тестирование, если порт работает правильно
from __future__ import print_function
import serial
test_string = "Testing 1 2 3 4".encode('utf-8')
#test_string = b"Testing 1 2 3 4" ### Will also work
port_list = ["/dev/serial0", "/dev/ttyS0"]
for port in port_list:
try:
serialPort = serial.Serial(port, 9600, timeout = 2)
serialPort.flushInput()
serialPort.flushOutput()
print("Opened port", port, "for testing:")
bytes_sent = serialPort.write(test_string)
print ("Sent", bytes_sent, "bytes")
loopback = serialPort.read(bytes_sent)
if loopback == test_string:
print ("Received", len(loopback), "valid bytes, Serial port", port, "working \n")
else:
print ("Received incorrect data", loopback, "over Serial port", port, "loopback\n")
serialPort.close()
except IOError:
print ("Failed at", port, "\n")
Это дало мне информацию о том, что tty0 не работает должным образом, но также не получил абсолютно никакого ответа о правильности порта serial0.
import serial
import struct
import time
port = serial.Serial("/dev/ttyS0", baudrate=115200, timeout=2.0)
i = 0
while True:
msg = struct.pack('>HBBB', 3000, 243, 234, 254)
port.write(msg)
time.sleep(0.3)
bytesToRead = port.inWaiting()
print("Found {} bytes in serial".format(bytesToRead))
if bytesToRead == 5:
rcv = port.read(5)
# port.write('\r\nYou sent:' + repr(rcv))
for i in range(5):
print('\r {} - {}'.format(i, bytes(rcv[i])))
idCode = struct.pack('BB', rcv[0], rcv[1])
idCode = struct.unpack('>H', idCode)
idCode = idCode[0]
# value = struct.unpack_from('HBBB', decode)
i += 1
if i == 4:
exit()
Ожидаемые результаты:
Found 5 bytes in serial
(index) - (byte at that index)
Есть:
Found 0 bytes in serial
моя командная строка была потеряна, теперь она выглядит так: dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 lift=deadline rootwait и в config.txt есть только enable_uart=1
Самый безопасный способ — запустить sudo raspi-config и включить последовательный порт в меню. Затем перезагрузитесь и выполните петлевой тест, соединяющий RX с TX, и посмотрите, получите ли вы эхо от того, что вы пишете в порт.
У меня есть эхо на консоли Putty, когда я компилирую RPI, но петля пуста
Понятно... Можете ли вы объяснить, как вы подключаете свои порты?





Решено. Дело было только в проводке. Если кто-то в будущем захочет провести такой тест - он должен не забыть соединить линию RX с линией TX. Или, если он подключен к ноутбуку, лучше создать на нем код, отвечающий за связь (но вместо ttyS0 или Serial0 порт должен быть установлен на правильный COM, например, «COM3»)
Вы отключили вывод ядра и включили порт с помощью
raspi-config? Взгляните на это.