PySerial在Python 3中呈现奇怪的行为

时间:2014-05-27 04:18:49

标签: python pyserial

我有以下类(非常基本的)通过AT命令与3G调制解调器进行通信:

import serial
import time

class ATCommands(object):

    def __init__(self, port):
        self.ser = None
        self.port = port
        self.open()

    def open(self):
        self.ser = serial.Serial('/dev/'+ self.port, 115200, timeout=1)

    def sendCommand(self,command):
        self.ser.write(command.encode())
        data = self.ser.readline().strip()
        return data

    def getIMEI(self):
        IMEI = self.sendCommand("AT+CGSN\r")
        IMEI = self.sendCommand("AT+CGSN\r")
        return IMEI

    def getIMEIErro(self):
        IMEI = self.sendCommand("AT+CGSN\r")
        return IMEI

    def getIMEIErro2(self):
        self.ser.write("AT+CGSN\r".encode())
        data = self.ser.readline().strip()
        return data

    def __del__(self):
        self.ser.close()


if __name__ == '__main__':
    print(ATCommands('ttyUSB1').getIMEI()) #OK
    print(ATCommands('ttyUSB1').getIMEIErro()) #erro
    print(ATCommands('ttyUSB1').getIMEIErro2()) #erro

在上面的代码中,我有两件奇怪的事情:

  1. getIMEI()仅在我执行语句 self.sendCommand(" AT + CGSN \ r")两次时才有效行。 getIMEIErro()表示发送的单个命令不会返回IMEI。

  2. 如果我在方法 sendCommand()之外运行命令 self.ser.readline(),则代码也不起作用。 getIMEIErro2()显示此错误

  3. 有人知道错误的原因吗?

    PS:我使用的是python 3 e pySerial 2.7

1 个答案:

答案 0 :(得分:0)

试试这个

  • 清除缓冲区
  • 将睡眠等待波特率将命令应用于调制解调器
  • 始终使用\ r \ n
  • 结束命令

类似的东西(基于我在https://github.com/vhpanisa/misc pyatapi.py中的课程):

def sendCommand(self,command):
    from time import sleep
    while self.ser.inWaiting() > 0:
        self.ser.read()
        sleep(0.1)

    # Maybe ascii encode not needed, just bytes convert

    self.ser.write(bytes(command+"\r\n", encoding='ascii'))
    sleep(0.5)
    data = []
    while self.ser.inWaiting() > 0:
        msg = self.ser.readline().strip()
        sleep(0.1) # Wait for buffer
        msg = msg.replace(b"\r",b"")
        msg = msg.replace(b"\n",b"")
        if msg != b"":
            data.append(str(msg, encoding='ascii'))

    return data