Как отправлять и получать данные с помощью Pyserial?

Я хочу отправлять и получать данные между двумя последовательными портами. Я использую наборы инструментов CANtact в качестве своих последовательных устройств. Я использовал следующий код

написать.ру:

import serial
#init serial port and bound
# bound rate on two ports must be the same
ser = serial.Serial('/dev/ttyACM1', 9600)
print(ser.portstr)

#send data via serial port
serialcmd=("012345688902341")
ser.write(serialcmd.encode())
ser.close()

слушать.py

import serial
serBarCode = serial.Serial('/dev/ttyACM0', 9600, timeout=1)

while True:

    #read data from serial port
    serBarCode = serBarCode.readline()

    #if there is smth do smth
    if len(serBarCode) >= 1:
        print(dataBarCode.decode("utf-8"))

Я получаю следующую ошибку:

hp@HP-ноутбук:~$ cd /home/hp/Desktop

hp@HP-ноутбук:~/Desktop$ python3 write.py

/dev/ttyACM1

hp@HP-ноутбук:~/Desktop$ python3 listen.py

Traceback (последний последний вызов):

Файл «listen.py», строка 7, в

serBarCode = serBarCode.readline()

AttributeError: объект 'bytes' не имеет атрибута 'readline'

hp@HP-ноутбук:~/Desktop$


person annonymous    schedule 06.03.2019    source источник


Ответы (2)


serBarCode = serBarCode.readline()

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

Сделайте это вместо этого:

data = serBarCode.readline()
if len(data) >= 1:
    print(dataBarCode.decode("utf-8"))
person entropy    schedule 06.03.2019
comment
Ошибка устранена, но я все еще не распечатываю вывод - person annonymous; 06.03.2019
comment
Вы передаете /dev/ttyACM2 в свой write.py, но на самом деле он записывает в /dev/ttyACM1. И ваш listen.py читает из /dev/ttyACM0. То, что вы записываете в ACM1, не будет доступно в ACM0, если в системе нет другого процесса, читающего из ACM1 и записывающего в ACM0. - person entropy; 06.03.2019
comment
Имеет ли значение устройство, которое я использую для последовательной связи? Я использую CANtact, который обычно отправляет сообщение CAN, а также должен ли я создавать сокет между двумя устройствами? - person annonymous; 06.03.2019
comment
Должны ли listen.py и write.py работать на одной машине? - person entropy; 06.03.2019
comment
@annonymous Имеет значение, требуется ли для связи между устройствами определенный протокол. В противном случае он может потерять ваши данные. - person John Szakmeister; 06.03.2019
comment
Если вы подозреваете, что ваши последовательные устройства отправляют данные через последовательные порты, но ваш сценарий не читает их, вы можете попробовать вручную отправлять и получать данные из портов. Попробуйте echo "012345688902341" > /dev/ttyACM1, а затем сделайте cat /dev/ttyACM0 - person entropy; 06.03.2019
comment
Я получаю следующие ошибки, когда пытаюсь использовать echo и cat bash: echo: ошибка записи: ошибка ввода/вывода и cat: /dev/ttyACM0: ошибка ввода/вывода - person annonymous; 06.03.2019
comment
@suicidalteddy write.py и listen.py работают на двух разных устройствах - person annonymous; 06.03.2019

Вы пишете, что используете устройства CANtact.

Эти устройства не понимают "012345688902341".

Устройство говорит по определенному протоколу. Например. для отправки сообщения CAN команда начинается с t, за которым следует CAN-ID, затем DLC, затем данные и так далее.

Другие команды начинаются с F, K и т. д.

Ваше сообщение, скорее всего, просто проигнорировано устройством CANtact.

Вам определенно следует использовать библиотеку более высокого уровня, например pyvit, для использования устройства.

person M. Spiller    schedule 06.03.2019
comment
сможет ли pyvit принимать такие сообщения, как 012345688902341? - person annonymous; 06.03.2019
comment
Да, pyvit можно использовать для отправки данных. Он будет обрабатывать связь с устройством CANtact и говорить по последовательному протоколу, чтобы устройство знало, что делать. Ваше сообщение больше 8 байт, поэтому вы, скорее всего, захотите использовать ISO-TP для передачи своих данных. - person M. Spiller; 06.03.2019
comment
Я использовал эти данные 012345688902341 для целей тестирования, но на самом деле я хочу отправить строку данных, подобную этой 7f33117cf266a525a029a59541b3e80f3f, которая представляет собой не что иное, как хешированное сообщение CAN. Я попытался отправить это сообщение с помощью ISO-TP, но на стороне получателя я получил сообщение фрагментами. Эти фрагментированные сообщения находились не в том порядке, в котором они были отправлены, и я не мог их собрать. Вот почему я перешел на последовательную связь. Я хочу, чтобы сообщение, отправленное на стороне отправителя, было получено как таковое на стороне получателя. Есть ли какой-либо метод для этого? - person annonymous; 06.03.2019
comment
В этом случае вы разговариваете с последовательным устройством, которое не имеет ничего общего с последовательной связью по CAN. ISO-TP — это то, что вам нужно. Конечно, принимающая сторона также должна использовать ISO-TP. Получение фрагментов не по порядку (в CAN-сети из двух узлов) возможно только тогда, когда они отправляются не по порядку. - person M. Spiller; 06.03.2019
comment
Принимает ли CANtact только сообщения CAN, а не любой другой формат, такой как строка, данные, текстовый файл? - person annonymous; 06.03.2019
comment
CANtact — это аппаратное обеспечение для отправки и получения данных по шине CAN. Таким образом, он может только отправлять и получать сообщения CAN. Но вы, конечно, можете обернуть свою строку, данные, файл и т. Д. В сообщения CAN и отправлять и получать их. - person M. Spiller; 06.03.2019
comment
Спасибо за информацию. Не могли бы вы предложить какие-либо веб-сайты, проекты, репозитории Git для справки, поскольку я новичок в этом домене? - person annonymous; 06.03.2019
comment
Только что понял, что это не единственный ваш вопрос, на который я ответил. Pyvit поддерживает ISO-TP. Для получения общей информации об ISO-TP просто загляните в Википедию. Протокол описан там. В общем, было бы неплохо прочитать о модели OSI и понять различные уровни. - person M. Spiller; 06.03.2019
comment
Давайте продолжим обсуждение в чате. - person annonymous; 06.03.2019