使用Python通过串口与Raspberry Pi进行通信

时间:2015-06-28 22:59:48

标签: python serial-port raspberry-pi pyserial

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’ 

任何建议都将不胜感激!

3 个答案:

答案 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的任何引用,这样我才不会被提示输入串行控制台。无需尝试传递凭据。

参考: http://elinux.org/Serial_port_programming