Hello stackoverflow社区,我一直致力于个人项目,我需要一些帮助。我有一个RaspberryPi,用于通过USB到串行连接从PC存储消息。目前,我可以使用Putty使用COM端口3连接到RPi(请求用户ID /密码)并给我一个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’
任何建议都将不胜感激!
答案 0 :(得分:1)
是的,你必须注释掉告诉raspi使用ttyAMA0的那一行。 默认情况下,终端绑定到ttyAMA0,因此您无法将其用于其他任何内容。我的意思是,即使你以编程方式与它进行“对话”,你也会与操作系统“说话”,而不是用Python进程。 在“/ etc / inittab”底部的某个位置,您将看到有问题的行。 当你注释掉它并重新启动时,你将能够将它作为普通的COM端口使用pyserial(来自两端)。虽然我会小心你的位置,因为正常的RS232规格给出10V,并且如果我没有严重错误,raspi上的输出引脚为3.5V。它可能工作正常,或者在您将其保留一段时间之后可能是一场灾难,或者根本不能使用更长的电缆。 您需要一些IC,如maxcom或其他东西来为您调节电压。或者,只需使用两个USB2Serial转换器,一个在PC上,另一个在raspi上,你需要做一些特别的工作。
答案 1 :(得分:0)
init_serial()
ser.write('root')
ser.write('<PASSWORD HERE>')
如果我没有弄错(无法在此处测试),您不会在root的末尾发送\n
而密码(ser.write()
不会将其添加为print()
所以你没有正确登录。
顺便说一句,让脚本等待每个提示都不会有什么坏处 - 如果你在RPi之前启动程序,登录将会丢失。
编辑:如果这不起作用,请尝试运行a serial line sniffer或运行Wireshark并检查USB协议(更难)这样就可以监控到底发生了什么。
答案 2 :(得分:0)
我必须在cmdline.txt文件中注释掉对ttyAMA0的任何引用,这样我才不会被提示输入串行控制台。无需尝试传递凭据。