PySerial-设备无响应-AT通信

时间:2018-06-27 13:43:52

标签: android python-2.7 serial-port pyserial at-command

我正在研究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

0 个答案:

没有答案