我试图通过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()
答案 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