glennPattonInThePubAgain! Ответов: 2

Последовательная связь в Python (3.xx)


Привет,

Я пытаюсь прочитать некоторые последовательные данные (строку на данном этапе) в Python и могу отправить строку (" hello world! ") и теперь пытаюсь прочесть строку.

[edit]добавлен тег Python - OriginalGriff[/edit]

Что я уже пробовал:

на данном этапе:
res =ser.readlines()
print(res)

ранее:
res =ser.read()
print(res)

который производит первый символ того, что отправляется, я думал о циклическом цикле до тех пор, пока не будет прочитана вся строка...
stringlength = len ser.res
for i in range(stringlenght)

Просто попробовал ниже:
res =ser.read(5)
print(res)
Проблема с этим заключается в том, что во-первых, вы должны знать, сколько символов должно быть прочитано, а также он производит ведущий b
Цитата:
б'Хелло'
Я предполагаю, что это означает двоичное кодирование, и теги ' могут вызвать проблемы, я предполагаю, что есть способ подавить это? Кроме того, дальнейшая возня привела к попытке зациклиться до тех пор, пока он не увидит /n...

glennPattonInThePubAgain!

Ура Грифф

2 Ответов

Рейтинг:
2

Jochen Arndt

Видеть Краткое введение — документация pySerial 3.4[^] и pySerial API — документация pySerial 3.4[^].

Serial.read(size=1) считывает указанное количество байтов, которое по умолчанию равно единице. Вот почему вы получаете только один символ.

readline() считывает до тех пор, пока не будет получен новый символ строки. Эта функция не может быть использована, когда другая сторона не отвечает новыми ответами с окончанием строки. Он также требует указать тайм-аут при открытии порта.

readlines() звонки readline() пока EOF происходит. Но это никогда не происходит с последовательными портами, так что функция завершается по истечении таймаута.

Общей проблемой последовательной связи является обнаружение конца "пакета", когда он не имеет фиксированного размера.

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

Двоичные данные могут иметь префикс с заголовком фиксированного размера, содержащим длину данных. Таким образом, получатель знает, сколько байтов данных он должен ожидать. Приемник считывает сначала байты заголовка, а затем оставшиеся байты полезной нагрузки.

Вывод:
Вы должны знать используемый формат данных (называемый протокол) или определить его при реализации обеих сторон коммуникации.


Рейтинг:
1

glennPattonInThePubAgain!

Немного возни, и это делает в значительной степени то, что я хочу (вытащил меня из дыры, в которой я был):

#Will send and read from Com1 13/08/2018  

import serial
import time

#Set up Serial Port 1 to send and print out com port 
ser = serial.Serial(0)
ser.baudrate = 9600
ser.parity = serial.PARITY_NONE
ser.BYTESIZES = serial.EIGHTBITS
ser.stopbits = serial.STOPBITS_ONE
print(ser.portstr)
ser.close()


def Send():
    ser.open()
    #write text hello world to serial port
    print('Type a string:')
    text = input()
    ser.write(text.encode())
    ser.close()

def Receive():
    #open serial port and read characters from it
    ser.open()
    print('Receiving')
    res =ser.readline()
    res = res[:-2]
    print(res)
    ser.close()


while True:
    usrInput = input("Choose A: to receive, B: to Send")
    if usrInput == "A":
            Receive()
    if usrInput == "B": 
            Send()

С благодарностью Бену Баркеру!