2 个树莓派之间的 Python UART

标签 python linux uart raspberry-pi3

我正在尝试通过 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/

相关文章:

python - OpenERP 7 中的主细节关系、变量和 XML

python - excel如何找到默认的文件扩展名

linux - 如何运行多个 Unix 命令?

flutter - 通过 USB 端口进行串行交互以在 Flutter 上开发 Windows 应用程序

python - Spark 中笛卡尔的替代品?

python - 如何使用带有 python 的 Selenium WebDriver 获取 Web 元素的颜色?

linux - 执行命令时双破折号有什么作用?

linux - 在 Linux 文件权限上使用 boolean AND

linux - 发生了什么我的 ttyS0 在/proc/interrupt 中没有 irq 列表

gcc - 用于连接微 Controller 和 AT 调制解调器的 C 库