Python3中呈现奇怪行为的PySerial

Python3中呈现奇怪行为的PySerial,python,pyserial,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

我有以下通过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
在上面的代码中,我有两件奇怪的事情:

  • getIMEI()仅当我连续执行语句self.sendCommand(“AT+CGSN\r”)两次时才有效getIMEIErro()显示在发送单个命令时不会返回IMEI

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

  • 有人知道错误的原因吗

    PS:我正在使用python 3 e pySerial 2.7

    试试这个

    • 清除缓冲区
    • 将休眠设置为等待波特率,以便将命令应用于调制解调器
    • 始终以结束命令\r\n
    类似于(基于pyatapi.py中我的类中的):


    如果使用
    \n
    而不是
    \r
    作为终止字符,结果是否相同?是的,结果相同。当您通过串行终端(如超级终端)发送AT+CGSN时,响应是什么?
    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