使用 UART 在 2 Raspberry Pi 之间通信
Communicate between 2 Raspberry Pi with UART
我想通过 UART 通信将数据从一个 pi 发送到另一个。第一个 Raspberry 型号是 Raspberry Pi 4,第二个是 Raspberry Pi 3。要进行此通信,我以这种方式连接两个 Raspberry 引脚:
Pi 4 -> Pi 3
Tx -> Rx
Rx -> Tx
Ground -> Ground
我已经按照 link: https://iot4beginners.com/raspberry-pi-configuration-settings/ 的步骤在树莓派配置上激活了两个 Pis 串行连接。为了写入和发送数据,我创建了下一个 python 程序:
import time
import serial
ser = serial.Serial(
port='/dev/ttyS0', #Replace ttyS0 with ttyAM0 for Pi1,Pi2,Pi0
baudrate = 9600,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.SEVENBITS)
counter=0
while True:
ser.write(str.encode(str(counter)))
time.sleep(1)
counter += 1
为了读取和打印接收到的数据,我创建了下一个程序:
import time
import serial
ser = serial.Serial(
port='/dev/ttySO', #Replace ttyS0 with ttyAM0 for Pi1,Pi2,Pi0
baudrate = 9600,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.SEVENBITS
)
counter=0
while 1:
x = ser.readline()
print(x)
最后,当我 运行 阅读程序时,我得到了下一个错误:
Traceback (most recent call last):
File "serial_read.py", line 14, in <module>
x = ser.readline()
File "/usr/lib/python2.7/dist-packages/serial/serialposix.py", line 501, in read
'device reports readiness to read but returned no data '
serial.serialutil.SerialException: device reports readiness to read but returned no data (device disconnected or multiple access on port?)
我是 Raspberry 通信的新手,如果有任何建议,我将不胜感激。
Python 2.7 正式失效,所以我建议使用 Python3 - 特别是对于像你这样的新项目。
所以,而不是 运行 你的脚本:
python3 YourScript.py
您可以在开头放置适当的 shebang,这样它会自动使用您想要的正确 Python 版本:
#!/usr/bin/env python3
import ...
然后使脚本可执行:
chmod +x YourScript.py
现在您可以运行它:
./YourScript.py
很高兴它将使用 Python3,即使其他人使用它也是如此。
我认为,实际问题是接收端的 readline()
正在寻找您未发送的换行符。所以我会尝试添加一个:
ser.write(str.encode(str(counter) + '\n'))
就我个人而言,我发现 f-strings
比旧的 %
和 .format()
更容易,所以也许试试:
ser.write(str.encode(f'{counter}\n'))
我想通过 UART 通信将数据从一个 pi 发送到另一个。第一个 Raspberry 型号是 Raspberry Pi 4,第二个是 Raspberry Pi 3。要进行此通信,我以这种方式连接两个 Raspberry 引脚:
Pi 4 -> Pi 3
Tx -> Rx
Rx -> Tx
Ground -> Ground
我已经按照 link: https://iot4beginners.com/raspberry-pi-configuration-settings/ 的步骤在树莓派配置上激活了两个 Pis 串行连接。为了写入和发送数据,我创建了下一个 python 程序:
import time
import serial
ser = serial.Serial(
port='/dev/ttyS0', #Replace ttyS0 with ttyAM0 for Pi1,Pi2,Pi0
baudrate = 9600,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.SEVENBITS)
counter=0
while True:
ser.write(str.encode(str(counter)))
time.sleep(1)
counter += 1
为了读取和打印接收到的数据,我创建了下一个程序:
import time
import serial
ser = serial.Serial(
port='/dev/ttySO', #Replace ttyS0 with ttyAM0 for Pi1,Pi2,Pi0
baudrate = 9600,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.SEVENBITS
)
counter=0
while 1:
x = ser.readline()
print(x)
最后,当我 运行 阅读程序时,我得到了下一个错误:
Traceback (most recent call last):
File "serial_read.py", line 14, in <module>
x = ser.readline()
File "/usr/lib/python2.7/dist-packages/serial/serialposix.py", line 501, in read
'device reports readiness to read but returned no data '
serial.serialutil.SerialException: device reports readiness to read but returned no data (device disconnected or multiple access on port?)
我是 Raspberry 通信的新手,如果有任何建议,我将不胜感激。
Python 2.7 正式失效,所以我建议使用 Python3 - 特别是对于像你这样的新项目。
所以,而不是 运行 你的脚本:
python3 YourScript.py
您可以在开头放置适当的 shebang,这样它会自动使用您想要的正确 Python 版本:
#!/usr/bin/env python3
import ...
然后使脚本可执行:
chmod +x YourScript.py
现在您可以运行它:
./YourScript.py
很高兴它将使用 Python3,即使其他人使用它也是如此。
我认为,实际问题是接收端的 readline()
正在寻找您未发送的换行符。所以我会尝试添加一个:
ser.write(str.encode(str(counter) + '\n'))
就我个人而言,我发现 f-strings
比旧的 %
和 .format()
更容易,所以也许试试:
ser.write(str.encode(f'{counter}\n'))