【问题标题】:Using Python to communicate to Raspberry Pi via serial使用 Python 通过串口与树莓派通信
【发布时间】:2015-06-28 22:59:47
【问题描述】:

你好 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’ 

任何建议将不胜感激!

【问题讨论】:

  • 您是否收到任何Traceback error 消息,或者您没有收到来自serial 端口的任何消息?

标签: python serial-port raspberry-pi pyserial


【解决方案1】:

是的,您必须注释掉告诉 raspi 使用 ttyAMA0 的行。 看,默认情况下终端绑定到 ttyAMA0,所以你不能将它用于其他任何事情。我的意思是,即使您以编程方式与它“交谈”,您也将与操作系统“交谈”,而不是与您的 Python 进程。 在“/etc/inittab”底部的某处,您会看到有问题的行。 当您将其注释掉并重新启动时,您将能够将其用作带有 pyserial 的普通 COM 端口(从两端)。虽然我会在你的位置上小心,因为如果我没有严重错误的话,规范中的正常 RS232 会发出 10V 电压,而 raspi 上的输出引脚会发出 3.5V 电压。它可能工作正常,或者在您将其打开一段时间后可能会成为一场灾难,或者它根本无法使用更长的电缆。 您将需要一些 IC,例如 maxcom 或其他东西来为您调节电压。或者,只需使用两个 USB2Serial 转换器,一个在 PC 上,另一个在 raspi 上,您不需要做任何特别的事情来使事情正常工作。

【讨论】:

    【解决方案2】:

    我必须在 cmdline.txt 文件中注释掉任何对 ttyAMA0 的引用,这样就不会提示我输入串行控制台。无需尝试传递凭据。

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

    【讨论】:

      【解决方案3】:
      init_serial()
      ser.write('root')
      ser.write('<PASSWORD HERE>')
      

      如果我没记错的话(不能在这里测试),你没有在 root 的末尾发送 \n 和密码(ser.write() 不会像 print() 那样添加它们),所以你没有正确登录。

      顺便说一句,让脚本等待每个提示并没有什么坏处 - 如果您在 RPi 之前启动程序,登录将会丢失。

      编辑:如果这不起作用,请尝试运行 a serial line sniffer 或运行 Wireshark 并检查 USB 协议(更难)这样您就可以监控到底发生了什么。

      【讨论】:

      • 在用户 ID 和密码中添加了 \n。我认为我的方法不正确。
      • 在答案中添加了另一个建议
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      相关资源
      最近更新 更多