我正在尝试通过 UART 在两个 Raspberry Pi 之间发送字符串。到目前为止,一个 Pi 能够传输一个字符串,而第二个 pi 只能接收。我正在尝试从一个 Pi 向另一个 Pi 发送“命令”,然后第二个 Pi 将接收“命令”,然后将“传感器数据”发送回第一个 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()
这个接收命令然后发送传感器数据的树莓派:
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()
最佳答案
原因很可能是您的零超时。结果,您已将 read()
设置为非阻塞,因此您的发送方 Pi 的 for
循环很可能什么都不读(或只读一个字节)并会在之前终止一切都到了。遍历 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
关于2 个树莓派之间的 Python UART,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40196661/