使用python可靠地写入和读取串行

时间:2016-02-25 18:20:31

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

我正在与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语句根据它接收的输入发送不同的命令。

这有点奏效,但非常不可靠。有时我得到完整的信息。其他时候我一无所获。然后下一次双重消息,依此类推。

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

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

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

干杯!