我正在研究AT包装,以便通过ACM与Android智能手机进行通信。不幸的是,我注意到在相同情况下(例如,检索IMSI编号-> AT + CIMI ),我没有收到传入的串行数据。我使用超时,波特率和编码进行操作,但没有成功。
请在下面的简短测试脚本中找到有关概念验证的信息。
# KnightWhoSayNi
import logging
import time
import serial
class AtWrapper(object):
logging.basicConfig(level=logging.DEBUG)
def __init__(self):
self.conn = None
self.port_number = None
self.serial_number = None
def init_connection(self, com_port, baudrate=9600, bytesize=serial.EIGHTBITS, parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE, timeout=1,
xonxoff=False, rtcsts=True, dsrdtr=False):
try:
self.conn = serial.Serial(port=com_port, baudrate=baudrate, bytesize=bytesize, parity=parity,
stopbits=stopbits, timeout=timeout, xonxoff=xonxoff, rtscts=rtcsts,
dsrdtr=dsrdtr, write_timeout=1)
logging.info("Connected")
except Exception as e:
logging.error(e)
time.sleep(0.5)
def close_connection(self):
try:
self.conn.close()
logging.info("Disconnected")
except serial.SerialException as e:
logging.error(e)
def send_command(self, cmd, timeout=1):
self.conn.reset_output_buffer()
self.conn.timeout = timeout
if self.conn.in_waiting != 0:
self.conn.reset_input_buffer()
try:
self.conn.write(b'{}\r\n'.format(cmd.encode('utf-8', 'replace')))
except serial.SerialException as e:
logging.error(e)
def send_command_and_wait_for_pattern(self, cmd, pattern, timeout=1):
self.send_command(cmd=cmd)
return self.wait_for_pattern(pattern=pattern, timeout=timeout)
def wait_for_pattern(self, pattern, timeout):
start_timestamp = time.time()
received_stream = ""
while (time.time() - start_timestamp) < timeout:
incoming_data = self.conn.in_waiting
logging.debug("incoming_data: {}".format(incoming_data))
if incoming_data != 0:
received_stream += self.conn.read(incoming_data)
time.sleep(0.01)
if received_stream.lower().rfind(pattern.lower()) != -1:
logging.debug("Pattern [{}] found".format(pattern))
logging.debug("Output: {}".format(received_stream))
return received_stream
elif received_stream.lower().rfind("ERROR".lower()) != -1:
logging.error("Pattern [{}] not found".format(pattern))
logging.debug("Output: {}".format(received_stream))
return "ERROR"
else:
pass
logging.error("Pattern [{}] not found in {}[s]".format(pattern, timeout))
logging.debug("Output: {}".format(received_stream))
return "TIMEOUT"
if __name__ == "__main__":
at = AtWrapper()
at.init_connection(com_port="/dev/ttyACM0")
logging.info("Send: AT")
at.send_command_and_wait_for_pattern(cmd="AT", pattern="OK")
logging.info("Send: AT+CFUN?")
at.send_command_and_wait_for_pattern(cmd="AT+CFUN?", pattern="OK")
logging.info("Send: AT+CIMI")
at.send_command_and_wait_for_pattern(cmd="AT+CIMI", pattern="OK")
logging.info("Send: AT+CGMI")
at.send_command_and_wait_for_pattern(cmd="AT+CGMI", pattern="OK")
# ERROR on purpose
logging.info("Send: wrong command")
at.send_command_and_wait_for_pattern(cmd="FAKE", pattern="ERROR")
at.close_connection()
输出:
INFO:root:Connected
INFO:root:Send: AT
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 10
DEBUG:root:Pattern [OK] found
DEBUG:root:Output: AT
OK
INFO:root:Send: AT+CFUN?
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 28
DEBUG:root:Pattern [OK] found
DEBUG:root:Output: AT+CFUN?
+CFUN: 0
OK
INFO:root:Send: AT+CIMI
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 0
ERROR:root:Pattern [OK] not found in 1[s]
DEBUG:root:Output:
INFO:root:Send: AT+CGMI
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 38
DEBUG:root:Pattern [OK] found
DEBUG:root:Output: AT+CGMI
Samsung Electronics
OK
INFO:root:Send: wrong command
DEBUG:root:incoming_data: 0
DEBUG:root:incoming_data: 15
DEBUG:root:Pattern [ERROR] found
DEBUG:root:Output: FAKE
ERROR
INFO:root:Disconnected