2个Raspberry Pis之间的Python UART

时间:2016-10-22 20:20:04

标签: python linux uart raspberry-pi3

我试图通过UART在两个Raspberry Pis之间发送字符串。到目前为止,一个Pi能够传输一个字符串,而第二个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()

1 个答案:

答案 0 :(得分:0)

原因很可能是你的零超时。因此,您已将read()设置为非阻止,因此您的发件人Pi for循环很可能不会读取任何内容(或只读取一个字节),并且会在所有内容之前终止&# 39;到了。迭代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]))

如果在另一个字节可用之前经过了100ms或更长时间,则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