【问题标题】:Reliably write and read to serial using python使用python可靠地写入和读取到串行
【发布时间】:2016-02-26 03:30:13
【问题描述】:

我正在与 Raspberry Pi 中的 Fona 808 模块通信,我可以发出 AT 命令,是的!

现在我想制作一个 python 程序,在其中我可以使用诸如“b”之类的快捷命令可靠地发出 AT 命令,以获取电池电量等。

这是我目前所拥有的:

import serial
con = serial.Serial('/dev/ttyAMA0',timeout=0.2,baudraute=115200)
def sendAtCommand(command):
    if command == 'b':
        con.write("at+cbc\n".encode())
        reply = ''
        while con.inWaiting():
            reply = reply + con.read(1)
        return reply

while True:
    x = raw_input("At command: ")
    if x.strip() == 'q':
        break
    reply = sendAtCommand(x)
    print(reply)


con.close()

在 sendAtCommand 中,我将有一堆 if 语句,它们根据接收到的输入发送不同的 at 命令。

这有点工作,但非常不可靠。有时我会收到完整的信息。其他时候我什么也得不到。然后下次发双信息,以此类推。

我想创建一种方法,向 Fona 模块发出命令,然后读取完整的响应并返回它。

有什么建议吗?

【问题讨论】:

    标签: python-2.7 serial-port raspberry-pi at-command


    【解决方案1】:

    如果“调制解调器”尚未对您的 at 命令做出任何响应,您的循环将退出。您应该继续阅读串行输入,直到获得换行符或直到某个时间过去,例如1 秒左右。

    【讨论】:

    • 超时时间为 0.2 秒。这应该足以让模块返回电池电量等信息。在读取电池电量的情况下,调制解调器的输出是 4 行数据。如果我使用 con.readline() 四次,那么它每次都能可靠地读取它。
    • 我不认为 inWaiting() 关心超时。如果还没有收到数据,则立即返回 false。
    【解决方案2】:

    好的。事实证明这是非常微不足道的。 由于 at 命令在成功查询后总是返回 OK,因此只需阅读这些行,直到其中一个最终包含“OK\r\n”。 像这样:

    def readUntilOK():
        reply=''
        while True:
            x = con.readline()
            reply += x
            if x == 'OK\r\n':
                return reply
    

    这没有超时,并且除了 OK 响应之外不检查任何其他内容。这使得它非常有限。添加错误处理取决于读者。像 if x == 'ERROR\r\n' 这样的东西会是一个好的开始。

    干杯!

    【讨论】:

    • 你不应该只等待OK,你必须等待所有可能的最终结果代码。这并不难,你的整体代码结构几乎就位,但并不完全。有关详细信息,请参阅this answer
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    相关资源
    最近更新 更多