使用 Python 通过串口与 Raspberry Pi 通信
Using Python to communicate to Raspberry Pi via serial
你好 Whosebug 社区,我一直在做一个个人项目,我需要一些帮助。我有一个 RaspberryPi,用于通过 USB 转串口连接存储来自 PC 的消息。目前,我可以使用 Putty 通过 COM 端口 3 连接到 RPi(请求用户 id/password)并给我一个 shell (ttyAMA0)。我的最终目标是在 python 中编写一段代码来监听来自 PC 的通信(也在 Python 中),这样当我输入一条消息时(即 "hello world"),它会将它发送到 COM3 上的 RPi,RPi 将接收它并将其保存到文件。
我的方法可能是错误的(显然因为它不起作用)但这是我目前所拥有的:
此 Python 脚本在 RPi 上 运行(我通过网络连接 (SSH) 登录)并且它正在通过 ttyAMA0 侦听来自 PC 的消息
import serial
import time
def readlineCR(port):
rv = ""
while True:
ch = port.read()
rv += ch
if ch=="\r' or ch=='';
return rv
port = serial.Serial("/dev/ttyAMA0", baudrate=115200, timeout = 3.0)
while True:
rcv = readlineCR(port)
print 'message received: ' + repr(rcv)
此 Python 脚本在 PC 上 运行
import serial
ser = 0
def init_serial():
COMNUM = 3
global see
ser = serial.Serial()
ser.baudrate = 115200
ser.port = COMNUM - 1 #this makes it COM3
ser.timeout = 10
ser.open()
if ser.isOpen():
print 'Open: ' + ser.portstr
init_serial()
ser.write(‘root’ + '\n')
ser.write(‘<PASWORD HERE>’ + '\n')
while True:
msg = raw_input(“message: \r\n“)
ser.write(msg)
print ‘sent: ‘+ msg +’\r\n’
如有任何建议,我们将不胜感激!
init_serial()
ser.write('root')
ser.write('<PASSWORD HERE>')
如果我没记错的话(不能在这里测试),你不会在 root 的末尾发送 \n
和密码(ser.write()
不会将它们添加为 print()
会),所以您没有正确登录。
顺便说一句,让脚本等待每个提示不会有什么坏处 - 如果您在 RPi 之前启动程序,登录将会丢失。
编辑:如果这不起作用,请尝试 运行ning a serial line sniffer 或 运行 Wireshark 并检查 USB 协议(更难)这样你就可以监控到底是什么正在发生。
我不得不在 cmdline.txt 文件中注释掉任何对 ttyAMA0 的引用,这样我就不会被提示输入串行控制台。无需尝试传递凭据。
是的,您必须注释掉告诉 raspi 使用 ttyAMA0 的行。
看,默认情况下终端绑定到 ttyAMA0,因此您不能将它用于任何其他用途。我的意思是,即使您以编程方式对它执行 'talk',您也将 'speaking' 与 OS,而不是您的 Python 过程。
在“/etc/inittab”底部的某处,您会看到有问题的行。
当您将其注释掉并重新启动时,您将能够将其用作带有 pyserial 的普通 COM 端口(从两端)。虽然我会在你的地方小心,因为正常的 RS232 按规格给出 10V 而 raspi 上的输出引脚为 3.5V 如果我没有严重错误的话。它可能工作正常,或者在您打开它一段时间后可能会造成灾难,或者它根本无法使用更长的电缆。
您需要一些 IC,例如 maxcom 或其他东西来为您调节电压。或者,只需使用两个 USB2Serial 转换器,一个在 PC 上,另一个在 raspi 上,你不需要做任何特别的事情就可以正常工作。
你好 Whosebug 社区,我一直在做一个个人项目,我需要一些帮助。我有一个 RaspberryPi,用于通过 USB 转串口连接存储来自 PC 的消息。目前,我可以使用 Putty 通过 COM 端口 3 连接到 RPi(请求用户 id/password)并给我一个 shell (ttyAMA0)。我的最终目标是在 python 中编写一段代码来监听来自 PC 的通信(也在 Python 中),这样当我输入一条消息时(即 "hello world"),它会将它发送到 COM3 上的 RPi,RPi 将接收它并将其保存到文件。
我的方法可能是错误的(显然因为它不起作用)但这是我目前所拥有的:
此 Python 脚本在 RPi 上 运行(我通过网络连接 (SSH) 登录)并且它正在通过 ttyAMA0 侦听来自 PC 的消息
import serial
import time
def readlineCR(port):
rv = ""
while True:
ch = port.read()
rv += ch
if ch=="\r' or ch=='';
return rv
port = serial.Serial("/dev/ttyAMA0", baudrate=115200, timeout = 3.0)
while True:
rcv = readlineCR(port)
print 'message received: ' + repr(rcv)
此 Python 脚本在 PC 上 运行
import serial
ser = 0
def init_serial():
COMNUM = 3
global see
ser = serial.Serial()
ser.baudrate = 115200
ser.port = COMNUM - 1 #this makes it COM3
ser.timeout = 10
ser.open()
if ser.isOpen():
print 'Open: ' + ser.portstr
init_serial()
ser.write(‘root’ + '\n')
ser.write(‘<PASWORD HERE>’ + '\n')
while True:
msg = raw_input(“message: \r\n“)
ser.write(msg)
print ‘sent: ‘+ msg +’\r\n’
如有任何建议,我们将不胜感激!
init_serial()
ser.write('root')
ser.write('<PASSWORD HERE>')
如果我没记错的话(不能在这里测试),你不会在 root 的末尾发送 \n
和密码(ser.write()
不会将它们添加为 print()
会),所以您没有正确登录。
顺便说一句,让脚本等待每个提示不会有什么坏处 - 如果您在 RPi 之前启动程序,登录将会丢失。
编辑:如果这不起作用,请尝试 运行ning a serial line sniffer 或 运行 Wireshark 并检查 USB 协议(更难)这样你就可以监控到底是什么正在发生。
我不得不在 cmdline.txt 文件中注释掉任何对 ttyAMA0 的引用,这样我就不会被提示输入串行控制台。无需尝试传递凭据。
是的,您必须注释掉告诉 raspi 使用 ttyAMA0 的行。 看,默认情况下终端绑定到 ttyAMA0,因此您不能将它用于任何其他用途。我的意思是,即使您以编程方式对它执行 'talk',您也将 'speaking' 与 OS,而不是您的 Python 过程。 在“/etc/inittab”底部的某处,您会看到有问题的行。 当您将其注释掉并重新启动时,您将能够将其用作带有 pyserial 的普通 COM 端口(从两端)。虽然我会在你的地方小心,因为正常的 RS232 按规格给出 10V 而 raspi 上的输出引脚为 3.5V 如果我没有严重错误的话。它可能工作正常,或者在您打开它一段时间后可能会造成灾难,或者它根本无法使用更长的电缆。 您需要一些 IC,例如 maxcom 或其他东西来为您调节电压。或者,只需使用两个 USB2Serial 转换器,一个在 PC 上,另一个在 raspi 上,你不需要做任何特别的事情就可以正常工作。