Python3中呈现奇怪行为的PySerial
我有以下通过AT命令与3G调制解调器通信的类(非常基本):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
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
在上面的代码中,我有两件奇怪的事情:
- 清除缓冲区
- 将休眠设置为等待波特率,以便将命令应用于调制解调器
- 始终以结束命令\r\n
如果使用
\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