Python 2.7 使用python可靠地写入和读取串行数据

Python 2.7 使用python可靠地写入和读取串行数据,python-2.7,serial-port,raspberry-pi,at-command,Python 2.7,Serial Port,Raspberry Pi,At Command,我正在与一个来自树莓Pi的Fona 808模块通信,我可以发出AT命令,耶 现在我想制作一个python程序,在这个程序中,我可以可靠地使用快捷命令发出AT命令,比如“b”来获取电池电量等等 这就是我到目前为止所做的: import serial con = serial.Serial('/dev/ttyAMA0',timeout=0.2,baudraute=115200) def sendAtCommand(command): if command == 'b': co

我正在与一个来自树莓Pi的Fona 808模块通信,我可以发出AT命令,耶

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

这就是我到目前为止所做的:

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模块发出命令,然后读取完整响应并返回它


有什么建议吗?

如果“调制解调器”尚未对at命令做出任何响应,则循环将退出。您应该一直读取串行输入,直到收到换行符或经过特定时间,例如1秒左右。

好的。事实证明,这是相当琐碎的。 由于at命令总是在成功查询后返回OK,因此只需读取这些行,直到其中一行最终包含“OK\r\n”。 像这样:

这没有超时,也不会检查除OK响应之外的任何内容。这使得它非常有限。添加错误处理由读者决定。类似于if x=='ERROR\r\n'的内容将是一个好的开始


干杯

超时时间为0.2秒。这应该足以让模块返回电池电量等信息。在读取电池电量的情况下,调制解调器的输出为4行数据。如果我使用con.readline()四次,那么每次它都会可靠地读取它。我认为inWaiting()不关心超时。如果尚未收到任何数据,它将立即返回false。您不应该只等待
确定
,您必须等待所有可能的最终结果代码。这并不难,总体代码结构已经基本就绪,但还不是很完善。有关更多详细信息,请参阅。
def readUntilOK():
    reply=''
    while True:
        x = con.readline()
        reply += x
        if x == 'OK\r\n':
            return reply