MacOS Big Sur 版本11.2.3 安装8266串口问题-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1344|回复: 1

MacOS Big Sur 版本11.2.3 安装8266串口问题

[复制链接]
发表于 2021-4-4 23:19 | 显示全部楼层 |阅读模式
我在网上找了很多教程,依然无法打开USB串口,路过的大神给个指点

USB Serial

  产品ID:        0x7523
  厂商ID:        0x1a86
  版本:        2.64
  速度:        最高可达12 Mb/秒
  位置ID:        0x14200000 / 10
  可用电流(mA):        500
  所需电流(mA):        98
  额外的操作电流(mA):        0



jason-mac:~ oct$ ls /dev/tty*
/dev/tty                                /dev/ttyse
/dev/tty.Bluetooth-Incoming-Port        /dev/ttysf
/dev/tty.Little3-WirelessiAP                /dev/ttyt0
/dev/tty.usbserial-1420                        /dev/ttyt1
/dev/ttyp0                                /dev/ttyt2
/dev/ttyp1                                /dev/ttyt3
/dev/ttyp2                                /dev/ttyt4
/dev/ttyp3                                /dev/ttyt5
/dev/ttyp4                                /dev/ttyt6
/dev/ttyp5                                /dev/ttyt7
/dev/ttyp6                                /dev/ttyt8
/dev/ttyp7                                /dev/ttyt9
/dev/ttyp8                                /dev/ttyta
/dev/ttyp9                                /dev/ttytb
/dev/ttypa                                /dev/ttytc
/dev/ttypb                                /dev/ttytd
/dev/ttypc                                /dev/ttyte
/dev/ttypd                                /dev/ttytf
/dev/ttype                                /dev/ttyu0
/dev/ttypf                                /dev/ttyu1
/dev/ttyq0                                /dev/ttyu2
/dev/ttyq1                                /dev/ttyu3
/dev/ttyq2                                /dev/ttyu4
/dev/ttyq3                                /dev/ttyu5
/dev/ttyq4                                /dev/ttyu6
/dev/ttyq5                                /dev/ttyu7
/dev/ttyq6                                /dev/ttyu8
/dev/ttyq7                                /dev/ttyu9
/dev/ttyq8                                /dev/ttyua
/dev/ttyq9                                /dev/ttyub
/dev/ttyqa                                /dev/ttyuc
/dev/ttyqb                                /dev/ttyud
/dev/ttyqc                                /dev/ttyue
/dev/ttyqd                                /dev/ttyuf
/dev/ttyqe                                /dev/ttyv0
/dev/ttyqf                                /dev/ttyv1
/dev/ttyr0                                /dev/ttyv2
/dev/ttyr1                                /dev/ttyv3
/dev/ttyr2                                /dev/ttyv4
/dev/ttyr3                                /dev/ttyv5
/dev/ttyr4                                /dev/ttyv6
/dev/ttyr5                                /dev/ttyv7
/dev/ttyr6                                /dev/ttyv8
/dev/ttyr7                                /dev/ttyv9
/dev/ttyr8                                /dev/ttyva
/dev/ttyr9                                /dev/ttyvb
/dev/ttyra                                /dev/ttyvc
/dev/ttyrb                                /dev/ttyvd
/dev/ttyrc                                /dev/ttyve
/dev/ttyrd                                /dev/ttyvf
/dev/ttyre                                /dev/ttyw0
/dev/ttyrf                                /dev/ttyw1
/dev/ttys0                                /dev/ttyw2
/dev/ttys000                                /dev/ttyw3
/dev/ttys1                                /dev/ttyw4
/dev/ttys2                                /dev/ttyw5
/dev/ttys3                                /dev/ttyw6
/dev/ttys4                                /dev/ttyw7
/dev/ttys5                                /dev/ttyw8
/dev/ttys6                                /dev/ttyw9
/dev/ttys7                                /dev/ttywa
/dev/ttys8                                /dev/ttywb
/dev/ttys9                                /dev/ttywc
/dev/ttysa                                /dev/ttywd
/dev/ttysb                                /dev/ttywe
/dev/ttysc                                /dev/ttywf
/dev/ttysd
jason-mac:~ oct$

 楼主| 发表于 2021-4-5 00:13 | 显示全部楼层
class ESPLoader(object):
    """ Base class providing access to ESP ROM & software stub bootloaders.
    Subclasses provide ESP8266 & ESP32 specific functionality.

    Don't instantiate this base class directly, either instantiate a subclass or
    call ESPLoader.detect_chip() which will interrogate the chip and return the
    appropriate subclass instance.

    """
    CHIP_NAME = "Espressif device"
    IS_STUB = False

    DEFAULT_PORT = "/dev/ttyUSB0"

    # Commands supported by ESP8266 ROM bootloader
    ESP_FLASH_BEGIN = 0x02
    ESP_FLASH_DATA  = 0x03
    ESP_FLASH_END   = 0x04
    ESP_MEM_BEGIN   = 0x05
    ESP_MEM_END     = 0x06
    ESP_MEM_DATA    = 0x07
    ESP_SYNC        = 0x08
    ESP_WRITE_REG   = 0x09
    ESP_READ_REG    = 0x0a

    # Some comands supported by ESP32 ROM bootloader (or -8266 w/ stub)
    ESP_SPI_SET_PARAMS = 0x0B
    ESP_SPI_ATTACH     = 0x0D
    ESP_CHANGE_BAUDRATE = 0x0F
    ESP_FLASH_DEFL_BEGIN = 0x10
    ESP_FLASH_DEFL_DATA  = 0x11
    ESP_FLASH_DEFL_END   = 0x12
    ESP_SPI_FLASH_MD5    = 0x13

    # Some commands supported by stub only
    ESP_ERASE_FLASH = 0xD0
    ESP_ERASE_REGION = 0xD1
    ESP_READ_FLASH = 0xD2
    ESP_RUN_USER_CODE = 0xD3

    # Flash encryption debug more command
    ESP_FLASH_ENCRYPT_DATA = 0xD4

    # Maximum block sized for RAM and Flash writes, respectively.
    ESP_RAM_BLOCK   = 0x1800

    FLASH_WRITE_SIZE = 0x400

    # Default baudrate. The ROM auto-bauds, so we can use more or less whatever we want.
    ESP_ROM_BAUD    = 115200

    # First byte of the application image
    ESP_IMAGE_MAGIC = 0xe9

    # Initial state for the checksum routine
    ESP_CHECKSUM_MAGIC = 0xef

    # Flash sector size, minimum unit of erase.
    FLASH_SECTOR_SIZE = 0x1000

    # This register happens to exist on both ESP8266 & ESP32
    UART_DATA_REG_ADDR = 0x60000078

    UART_CLKDIV_MASK = 0xFFFFF

    # Memory addresses
    IROM_MAP_START = 0x40200000
    IROM_MAP_END = 0x40300000

    # The number of bytes in the UART response that signify command status
    STATUS_BYTES_LENGTH = 2

    def __init__(self, port=DEFAULT_PORT, baud=ESP_ROM_BAUD, trace_enabled=False):
        """Base constructor for ESPLoader bootloader interaction

        Don't call this constructor, either instantiate ESP8266ROM
        or ESP32ROM, or use ESPLoader.detect_chip().

        This base class has all of the instance methods for bootloader
        functionality supported across various chips & stub
        loaders. Subclasses replace the functions they don't support
        with ones which throw NotImplementedInROMError().

        """
        if isinstance(port, basestring):
            self._port = serial.serial_for_url(port)
        else:
            self._port = port
        self._slip_reader = slip_reader(self._port, self.trace)
        # setting baud rate in a separate step is a workaround for
        # CH341 driver on some Linux versions (this opens at 9600 then
        # sets), shouldn't matter for other platforms/drivers. See
        # https://github.com/espressif/esptool/issues/44#issuecomment-107094446
        self._set_port_baudrate(baud)
        self._trace_enabled = trace_enabled
        # set write timeout, to prevent esptool blocked at write forever.
        try:
            self._port.write_timeout = DEFAULT_SERIAL_WRITE_TIMEOUT
        except NotImplementedError:
            # no write timeout for RFC2217 ports
            # need to set the property back to None or it will continue to fail
            self._port.write_timeout = None

    def _set_port_baudrate(self, baud):
        try:
            self._port.baudrate = baud
        except IOError:
            raise FatalError("Failed to set baud rate %d. The driver may not support this rate." % baud)

    @staticmethod
    def detect_chip(port=DEFAULT_PORT, baud=ESP_ROM_BAUD, connect_mode='default_reset', trace_enabled=False):
        """ Use serial access to detect the chip type.

        We use the UART's datecode register for this, it's mapped at
        the same address on ESP8266 & ESP32 so we can use one
        memory read and compare to the datecode register for each chip
        type.

        This routine automatically performs ESPLoader.connect() (passing
        connect_mode parameter) as part of querying the chip.
        """
        detect_port = ESPLoader(port, baud, trace_enabled=trace_enabled)
        detect_port.connect(connect_mode)
        try:
            print('Detecting chip type...', end='')
            sys.stdout.flush()
            date_reg = detect_port.read_reg(ESPLoader.UART_DATA_REG_ADDR)

            for cls in [ESP8266ROM, ESP32ROM]:
                if date_reg == cls.DATE_REG_VALUE:
                    # don't connect a second time
                    inst = cls(detect_port._port, baud, trace_enabled=trace_enabled)
                    print(' %s' % inst.CHIP_NAME, end='')
                    return inst
        finally:
            print('')  # end line
        raise FatalError("Unexpected UART datecode value 0x%08x. Failed to autodetect chip type." % date_reg)

    """ Read a SLIP packet from the serial port """
    def read(self):
        return next(self._slip_reader)

    """ Write bytes to the serial port while performing SLIP escaping """
    def write(self, packet):
        buf = b'\xc0' \
              + (packet.replace(b'\xdb',b'\xdb\xdd').replace(b'\xc0',b'\xdb\xdc')) \
              + b'\xc0'
        self.trace("Write %d bytes: %s", len(buf), HexFormatter(buf))
        self._port.write(buf)

    def trace(self, message, *format_args):
        if self._trace_enabled:
            now = time.time()
            try:

                delta = now - self._last_trace
            except AttributeError:
                delta = 0.0
            self._last_trace = now
            prefix = "TRACE +%.3f " % delta
            print(prefix + (message % format_args))

    """ Calculate checksum of a blob, as it is defined by the ROM """
    @staticmethod
    def checksum(data, state=ESP_CHECKSUM_MAGIC):
        for b in data:
            if type(b) is int:  # python 2/3 compat
                state ^= b
            else:
                state ^= ord(b)

        return state

    """ Send a request and read the response """
    def command(self, op=None, data=b"", chk=0, wait_response=True, timeout=DEFAULT_TIMEOUT):
        saved_timeout = self._port.timeout
        new_timeout = min(timeout, MAX_TIMEOUT)
        if new_timeout != saved_timeout:
            self._port.timeout = new_timeout

        try:
            if op is not None:
                self.trace("command op=0x%02x data len=%s wait_response=%d timeout=%.3f data=%s",
                           op, len(data), 1 if wait_response else 0, timeout, HexFormatter(data))
                pkt = struct.pack(b'<BBHI', 0x00, op, len(data), chk) + data
                self.write(pkt)

            if not wait_response:
                return

            # tries to get a response until that response has the
            # same operation as the request or a retries limit has
            # exceeded. This is needed for some esp8266s that
            # reply with more sync responses than expected.
            for retry in range(100):
                p = self.read()
                if len(p) < 8:
                    continue
                (resp, op_ret, len_ret, val) = struct.unpack('<BBHI', p[:8])
                if resp != 1:
                    continue
                data = p[8:]
                if op is None or op_ret == op:
                    return val, data
        finally:
            if new_timeout != saved_timeout:
                self._port.timeout = saved_timeout

        raise FatalError("Response doesn't match request")
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 10:41 , Processed in 0.177392 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表