Python UART между 2 Raspberry Pi

Я пытаюсь отправить строки между двумя Raspberry Pi через UART. Пока что один Pi может передавать строку, а второй pi может только получать. Я пытаюсь отправить «команду» от одного Pi к другому, затем второй Pi получит «команду», а затем отправит «данные датчика» обратно на первый Pi. Однако, похоже, это не работает. Я не могу одновременно отправлять и получать данные.

Любая помощь будет принята с благодарностью.

Raspberry Pi, который отправляет команду:

import serial

ser = serial.Serial(
    port = '/dev/ttyAMA0',\
    baudrate = 115200,\
    bytesize = serial.EIGHTBITS,\
    timeout = 0)

dat = ''

while True:
    #asks user for input
    command = raw_input()
    #terminates command with null
    ser.write(command + '\0')

    #reads data per char
    for c in ser.read():
        #appends string
        dat += c
        #terminates at null char
        if c == '\0':
            print(dat)
            dat = ''
            break
ser.close()

Этот RPi, который получает команду, а затем отправляет данные датчика:

import serial

ser = serial.Serial(
    '/dev/ttyAMA0' ,\
    baudrate = 115200 ,\
    bytesize = serial.EIGHTBITS ,\
    timeout = 0)

dat = ''
sen1 = 'sen1\x00'
sen2 = 'sen2\x00'
com1 = 'hello'
com2 = 'this thing works!'
com3 = 'error!'

while True:

    #reads data per char
    for c in ser.read():
    #appends string
    dat += c
    #terminates at null char
    if c == '\0':
        #decides which sensor to choose
        if dat == sen1:
            print(com1)
            ser.write(com1 + '\0')
            dat = ''
            break
        elif dat == sen2:
            print(com2)
            ser.write(com2 + '\0')
            dat = ''
            break
        else:
            print(com3)
            ser.write(com3 + '\0')
            dat = ''         

ser.close()

person wait_wut    schedule 22.10.2016    source источник


Ответы (1)


Причина, скорее всего, в вашем нулевом тайм-ауте. В результате вы установили read() на неблокировку, поэтому циклы for вашего отправителя Pi, скорее всего, ничего не прочитают (или только байт) и завершатся до того, как все будет доставлено. Кроме того, повторение ser.read() на самом деле не имеет смысла, поскольку по умолчанию он все равно возвращает только байт.

Увеличьте время ожидания до некоторого ненулевого значения.

ser = serial.Serial(
    '/dev/ttyAMA0' ,\
    baudrate = 115200 ,\
    bytesize = serial.EIGHTBITS ,\
    timeout = 0.1)

Предполагая, что вы хотите получить ответ на полученную команду, прежде чем будет отправлена ​​​​другая команда, это должно работать для отправителя:

while True:
    #asks user for input
    command = raw_input()
    #terminates command with null
    ser.write(command + '\0')

    dat = []
    lastRead = time.time()
    while time.time() - lastRead < 0.1:
        while ser.inWaiting() > 0:
            dat.append(ser.read())
            lastRead = time.time()
    if dat and (dat[-1] == '\0'):
        print(''.join(dat[:-1]))

Если проходит 100 мс или более, прежде чем станет доступен другой байт, цикл while прерывается, и последний полученный байт проверяется, чтобы узнать, является ли он нулевым байтом. Что-то подобное должно работать для вашего приемника:

while True:
    dat = []
    lastRead = time.time()
    while time.time() - lastRead < 0.1:
        while ser.inWaiting() > 0:
            dat.append(ser.read())
            lastRead = time.time()
    dat = ''.join(dat)
    # begin your comparisons here
person SoreDakeNoKoto    schedule 23.10.2016
comment
Спасибо за ответ. К сожалению, ваш код мне не подошел. - person wait_wut; 23.10.2016
comment
inter_byte_timeout не будет компилироваться. После быстрого поиска в Google я нашел interCharTimeout, который должен делать то же самое. После этого изменения программа скомпилировалась, но это не решило мою проблему. Когда я ввожу команду sen1 на первый Pi, второй Pi (приемник) не отправляет ему данные датчика. Как ни странно, после того, как я введу одну команду, он не получит вторую команду. Я знаю это, потому что я прошу 2-й Пи (приемник) распечатать все, что он получает команду от первого Пи. - person wait_wut; 23.10.2016