Python serial.read() Examples
The following are 30
code examples of serial.read().
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example.
You may also want to check out all available functions/classes of the module
serial
, or try the search function
.
Example #1
Source File: cyton.py From OpenBCI_Python with MIT License | 7 votes |
def print_incoming_text(self): """ When starting the connection, print all the debug data until we get to a line with the end sequence '$$$'. """ line = '' # Wait for device to send data time.sleep(1) if self.ser.inWaiting(): line = '' c = '' # Look for end sequence $$$ while '$$$' not in line: # we're supposed to get UTF8 text, but the board might behave otherwise c = self.ser.read().decode('utf-8', errors='replace') line += c print(line) else: self.warn("No Message")
Example #2
Source File: cyton.py From OpenBCI_Python with MIT License | 7 votes |
def openbci_id(self, serial): """ When automatically detecting port, parse the serial return for the "OpenBCI" ID. """ line = '' # Wait for device to send data time.sleep(2) if serial.inWaiting(): line = '' c = '' # Look for end sequence $$$ while '$$$' not in line: # we're supposed to get UTF8 text, but the board might behave otherwise c = serial.read().decode('utf-8', errors='replace') line += c if "OpenBCI" in line: return True return False
Example #3
Source File: esptool.py From phatsniffer with MIT License | 7 votes |
def flash_digest(self, addr, length, digest_block_size=0): self._esp.write(struct.pack(b'<B', self.CMD_FLASH_DIGEST)) self._esp.write(struct.pack(b'<III', addr, length, digest_block_size)) digests = [] while True: p = self._esp.read() if len(p) == 16: digests.append(p) elif len(p) == 1: status_code = struct.unpack('<B', p)[0] if status_code != 0: raise FatalError('Write failure, status: %x' % status_code) break else: raise FatalError('Unexpected packet: %s' % hexify(p)) return digests[-1], digests[:-1]
Example #4
Source File: esptool.py From phatsniffer with MIT License | 7 votes |
def command(self, op=None, data=None, chk=0): if op is not None: pkt = struct.pack(b'<BBHI', 0x00, op, len(data), chk) + data self.write(pkt) # 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 body = p[8:] if op is None or op_ret == op: return val, body # valid response received raise FatalError("Response doesn't match request")
Example #5
Source File: esptool.py From esptool with GNU General Public License v2.0 | 5 votes |
def dump_mem(esp, args): with open(args.filename, 'wb') as f: for i in range(args.size // 4): d = esp.read_reg(args.address + (i * 4)) f.write(struct.pack(b'<I', d)) if f.tell() % 1024 == 0: print_overwrite('%d bytes read... (%d %%)' % (f.tell(), f.tell() * 100 // args.size)) sys.stdout.flush() print_overwrite("Read %d bytes" % f.tell(), last_line=True) print('Done!')
Example #6
Source File: esptool.py From EspBuddy with GNU General Public License v3.0 | 5 votes |
def LoadFirmwareImage(chip, filename): """ Load a firmware image. Can be for ESP8266 or ESP32. ESP8266 images will be examined to determine if they are original ROM firmware images (ESP8266ROMFirmwareImage) or "v2" OTA bootloader images. Returns a BaseFirmwareImage subclass, either ESP8266ROMFirmwareImage (v1) or ESP8266V2FirmwareImage (v2). """ with open(filename, 'rb') as f: if chip.lower() == 'esp32': return ESP32FirmwareImage(f) else: # Otherwise, ESP8266 so look at magic to determine the image type magic = ord(f.read(1)) f.seek(0) if magic == ESPLoader.ESP_IMAGE_MAGIC: return ESP8266ROMFirmwareImage(f) elif magic == ESPBOOTLOADER.IMAGE_V2_MAGIC: return ESP8266V2FirmwareImage(f) else: raise FatalError("Invalid image magic number: %d" % magic)
Example #7
Source File: esptool.py From EspBuddy with GNU General Public License v3.0 | 5 votes |
def dump_mem(esp, args): with open(args.filename, 'wb') as f: for i in range(args.size // 4): d = esp.read_reg(args.address + (i * 4)) f.write(struct.pack(b'<I', d)) if f.tell() % 1024 == 0: print('\r%d bytes read... (%d %%)' % (f.tell(), f.tell() * 100 // args.size), end=' ') sys.stdout.flush() print('Done!')
Example #8
Source File: esptool.py From EspBuddy with GNU General Public License v3.0 | 5 votes |
def sha256(self): # return SHA256 hash of the input ELF file sha256 = hashlib.sha256() with open(self.name, 'rb') as f: sha256.update(f.read()) return sha256.digest()
Example #9
Source File: esptool.py From EspBuddy with GNU General Public License v3.0 | 5 votes |
def __init__(self, load_file=None): super(ESP32FirmwareImage, self).__init__() self.secure_pad = False self.flash_mode = 0 self.flash_size_freq = 0 self.version = 1 self.wp_pin = self.WP_PIN_DISABLED # SPI pin drive levels self.clk_drv = 0 self.q_drv = 0 self.d_drv = 0 self.cs_drv = 0 self.hd_drv = 0 self.wp_drv = 0 self.min_rev = 0 self.append_digest = True if load_file is not None: start = load_file.tell() segments = self.load_common_header(load_file, ESPLoader.ESP_IMAGE_MAGIC) self.load_extended_header(load_file) for _ in range(segments): self.load_segment(load_file) self.checksum = self.read_checksum(load_file) if self.append_digest: end = load_file.tell() self.stored_digest = load_file.read(32) load_file.seek(start) calc_digest = hashlib.sha256() calc_digest.update(load_file.read(end - start)) self.calc_digest = calc_digest.digest() # TODO: decide what to do here? self.verify()
Example #10
Source File: esptool.py From EspBuddy with GNU General Public License v3.0 | 5 votes |
def save(self, filename): with open(filename, 'wb') as f: # Save first header for irom0 segment f.write(struct.pack(b'<BBBBI', ESPBOOTLOADER.IMAGE_V2_MAGIC, ESPBOOTLOADER.IMAGE_V2_SEGMENT, self.flash_mode, self.flash_size_freq, self.entrypoint)) irom_segment = self.get_irom_segment() if irom_segment is not None: # save irom0 segment, make sure it has load addr 0 in the file irom_segment = irom_segment.copy_with_new_addr(0) irom_segment.pad_to_alignment(16) # irom_segment must end on a 16 byte boundary self.save_segment(f, irom_segment) # second header, matches V1 header and contains loadable segments normal_segments = self.get_non_irom_segments() self.write_common_header(f, normal_segments) checksum = ESPLoader.ESP_CHECKSUM_MAGIC for segment in normal_segments: checksum = self.save_segment(f, segment, checksum) self.append_checksum(f, checksum) # calculate a crc32 of entire file and append # (algorithm used by recent 8266 SDK bootloaders) with open(filename, 'rb') as f: crc = esp8266_crc32(f.read()) with open(filename, 'ab') as f: f.write(struct.pack(b'<I', crc)) # Backwards compatibility for previous API, remove in esptool.py V3
Example #11
Source File: esptool.py From EspBuddy with GNU General Public License v3.0 | 5 votes |
def read_checksum(self, f): """ Return ESPLoader checksum from end of just-read image """ # Skip the padding. The checksum is stored in the last byte so that the # file is a multiple of 16 bytes. align_file_position(f, 16) return ord(f.read(1))
Example #12
Source File: esptool.py From EspBuddy with GNU General Public License v3.0 | 5 votes |
def load_common_header(self, load_file, expected_magic): (magic, segments, self.flash_mode, self.flash_size_freq, self.entrypoint) = struct.unpack('<BBBBI', load_file.read(8)) if magic != expected_magic: raise FatalError('Invalid firmware image magic=0x%x' % (magic)) return segments
Example #13
Source File: esptool.py From EspBuddy with GNU General Public License v3.0 | 5 votes |
def load_extended_header(self, load_file): def split_byte(n): return (n & 0x0F, (n >> 4) & 0x0F) fields = list(struct.unpack(self.EXTENDED_HEADER_STRUCT_FMT, load_file.read(16))) self.wp_pin = fields[0] # SPI pin drive stengths are two per byte self.clk_drv, self.q_drv = split_byte(fields[1]) self.d_drv, self.cs_drv = split_byte(fields[2]) self.hd_drv, self.wp_drv = split_byte(fields[3]) chip_id = fields[4] if chip_id != self.ROM_LOADER.IMAGE_CHIP_ID: print(("Unexpected chip id in image. Expected %d but value was %d. " + "Is this image for a different chip model?") % (self.ROM_LOADER.IMAGE_CHIP_ID, chip_id)) # reserved fields in the middle should all be zero if any(f for f in fields[6:-1] if f != 0): print("Warning: some reserved header fields have non-zero values. This image may be from a newer esptool.py?") append_digest = fields[-1] # last byte is append_digest if append_digest in [0, 1]: self.append_digest = (append_digest == 1) else: raise RuntimeError("Invalid value for append_digest field (0x%02x). Should be 0 or 1.", append_digest)
Example #14
Source File: cyton.py From OpenBCI_Python with MIT License | 5 votes |
def ser_read(self): """Access serial port object for read""" return self.ser.read()
Example #15
Source File: esptool.py From esptool with GNU General Public License v2.0 | 5 votes |
def expand_file_arguments(): """ Any argument starting with "@" gets replaced with all values read from a text file. Text file arguments can be split by newline or by space. Values are added "as-is", as if they were specified in this order on the command line. """ new_args = [] expanded = False for arg in sys.argv: if arg.startswith("@"): expanded = True with open(arg[1:],"r") as f: for line in f.readlines(): new_args += shlex.split(line) else: new_args.append(arg) if expanded: print("esptool.py %s" % (" ".join(new_args[1:]))) sys.argv = new_args
Example #16
Source File: esptool.py From esptool with GNU General Public License v2.0 | 5 votes |
def make_image(args): image = ESP8266ROMFirmwareImage() if len(args.segfile) == 0: raise FatalError('No segments specified') if len(args.segfile) != len(args.segaddr): raise FatalError('Number of specified files does not match number of specified addresses') for (seg, addr) in zip(args.segfile, args.segaddr): with open(seg, 'rb') as f: data = f.read() image.segments.append(ImageSegment(addr, data)) image.entrypoint = args.entrypoint image.save(args.output)
Example #17
Source File: esptool.py From nodemcu-pyflasher with MIT License | 5 votes |
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)
Example #18
Source File: esptool.py From esptool with GNU General Public License v2.0 | 5 votes |
def sha256(self): # return SHA256 hash of the input ELF file sha256 = hashlib.sha256() with open(self.name, 'rb') as f: sha256.update(f.read()) return sha256.digest()
Example #19
Source File: esptool.py From esptool with GNU General Public License v2.0 | 5 votes |
def _read_sections(self, f, section_header_offs, section_header_count, shstrndx): f.seek(section_header_offs) len_bytes = section_header_count * self.LEN_SEC_HEADER section_header = f.read(len_bytes) if len(section_header) == 0: raise FatalError("No section header found at offset %04x in ELF file." % section_header_offs) if len(section_header) != (len_bytes): raise FatalError("Only read 0x%x bytes from section header (expected 0x%x.) Truncated ELF file?" % (len(section_header), len_bytes)) # walk through the section header and extract all sections section_header_offsets = range(0, len(section_header), self.LEN_SEC_HEADER) def read_section_header(offs): name_offs,sec_type,_flags,lma,sec_offs,size = struct.unpack_from("<LLLLLL", section_header[offs:]) return (name_offs, sec_type, lma, size, sec_offs) all_sections = [read_section_header(offs) for offs in section_header_offsets] prog_sections = [s for s in all_sections if s[1] == ELFFile.SEC_TYPE_PROGBITS] # search for the string table section if not (shstrndx * self.LEN_SEC_HEADER) in section_header_offsets: raise FatalError("ELF file has no STRTAB section at shstrndx %d" % shstrndx) _,sec_type,_,sec_size,sec_offs = read_section_header(shstrndx * self.LEN_SEC_HEADER) if sec_type != ELFFile.SEC_TYPE_STRTAB: print('WARNING: ELF file has incorrect STRTAB section type 0x%02x' % sec_type) f.seek(sec_offs) string_table = f.read(sec_size) # build the real list of ELFSections by reading the actual section names from the # string table section, and actual data for each section from the ELF file itself def lookup_string(offs): raw = string_table[offs:] return raw[:raw.index(b'\x00')] def read_data(offs,size): f.seek(offs) return f.read(size) prog_sections = [ELFSection(lookup_string(n_offs), lma, read_data(offs, size)) for (n_offs, _type, lma, size, offs) in prog_sections if lma != 0 and size > 0] self.sections = prog_sections
Example #20
Source File: esptool.py From esptool with GNU General Public License v2.0 | 5 votes |
def load_extended_header(self, load_file): def split_byte(n): return (n & 0x0F, (n >> 4) & 0x0F) fields = list(struct.unpack(self.EXTENDED_HEADER_STRUCT_FMT, load_file.read(16))) self.wp_pin = fields[0] # SPI pin drive stengths are two per byte self.clk_drv, self.q_drv = split_byte(fields[1]) self.d_drv, self.cs_drv = split_byte(fields[2]) self.hd_drv, self.wp_drv = split_byte(fields[3]) chip_id = fields[4] if chip_id != self.ROM_LOADER.IMAGE_CHIP_ID: print(("Unexpected chip id in image. Expected %d but value was %d. " + "Is this image for a different chip model?") % (self.ROM_LOADER.IMAGE_CHIP_ID, chip_id)) # reserved fields in the middle should all be zero if any(f for f in fields[6:-1] if f != 0): print("Warning: some reserved header fields have non-zero values. This image may be from a newer esptool.py?") append_digest = fields[-1] # last byte is append_digest if append_digest in [0, 1]: self.append_digest = (append_digest == 1) else: raise RuntimeError("Invalid value for append_digest field (0x%02x). Should be 0 or 1.", append_digest)
Example #21
Source File: esptool.py From esptool with GNU General Public License v2.0 | 5 votes |
def __init__(self, load_file=None): super(ESP32FirmwareImage, self).__init__() self.secure_pad = None self.flash_mode = 0 self.flash_size_freq = 0 self.version = 1 self.wp_pin = self.WP_PIN_DISABLED # SPI pin drive levels self.clk_drv = 0 self.q_drv = 0 self.d_drv = 0 self.cs_drv = 0 self.hd_drv = 0 self.wp_drv = 0 self.min_rev = 0 self.append_digest = True if load_file is not None: start = load_file.tell() segments = self.load_common_header(load_file, ESPLoader.ESP_IMAGE_MAGIC) self.load_extended_header(load_file) for _ in range(segments): self.load_segment(load_file) self.checksum = self.read_checksum(load_file) if self.append_digest: end = load_file.tell() self.stored_digest = load_file.read(32) load_file.seek(start) calc_digest = hashlib.sha256() calc_digest.update(load_file.read(end - start)) self.calc_digest = calc_digest.digest() # TODO: decide what to do here? self.verify()
Example #22
Source File: esptool.py From esptool with GNU General Public License v2.0 | 5 votes |
def save(self, filename): with open(filename, 'wb') as f: # Save first header for irom0 segment f.write(struct.pack(b'<BBBBI', ESPBOOTLOADER.IMAGE_V2_MAGIC, ESPBOOTLOADER.IMAGE_V2_SEGMENT, self.flash_mode, self.flash_size_freq, self.entrypoint)) irom_segment = self.get_irom_segment() if irom_segment is not None: # save irom0 segment, make sure it has load addr 0 in the file irom_segment = irom_segment.copy_with_new_addr(0) irom_segment.pad_to_alignment(16) # irom_segment must end on a 16 byte boundary self.save_segment(f, irom_segment) # second header, matches V1 header and contains loadable segments normal_segments = self.get_non_irom_segments() self.write_common_header(f, normal_segments) checksum = ESPLoader.ESP_CHECKSUM_MAGIC for segment in normal_segments: checksum = self.save_segment(f, segment, checksum) self.append_checksum(f, checksum) # calculate a crc32 of entire file and append # (algorithm used by recent 8266 SDK bootloaders) with open(filename, 'rb') as f: crc = esp8266_crc32(f.read()) with open(filename, 'ab') as f: f.write(struct.pack(b'<I', crc)) # Backwards compatibility for previous API, remove in esptool.py V3
Example #23
Source File: esptool.py From esptool with GNU General Public License v2.0 | 5 votes |
def read_checksum(self, f): """ Return ESPLoader checksum from end of just-read image """ # Skip the padding. The checksum is stored in the last byte so that the # file is a multiple of 16 bytes. align_file_position(f, 16) return ord(f.read(1))
Example #24
Source File: esptool.py From esptool with GNU General Public License v2.0 | 5 votes |
def load_segment(self, f, is_irom_segment=False): """ Load the next segment from the image file """ file_offs = f.tell() (offset, size) = struct.unpack('<II', f.read(8)) self.warn_if_unusual_segment(offset, size, is_irom_segment) segment_data = f.read(size) if len(segment_data) < size: raise FatalError('End of file reading segment 0x%x, length %d (actual length %d)' % (offset, size, len(segment_data))) segment = ImageSegment(offset, segment_data, file_offs) self.segments.append(segment) return segment
Example #25
Source File: esptool.py From esptool with GNU General Public License v2.0 | 5 votes |
def LoadFirmwareImage(chip, filename): """ Load a firmware image. Can be for any supported SoC. ESP8266 images will be examined to determine if they are original ROM firmware images (ESP8266ROMFirmwareImage) or "v2" OTA bootloader images. Returns a BaseFirmwareImage subclass, either ESP8266ROMFirmwareImage (v1) or ESP8266V2FirmwareImage (v2). """ chip = chip.lower().replace("-", "") with open(filename, 'rb') as f: if chip == 'esp32': return ESP32FirmwareImage(f) elif chip == "esp32s2": return ESP32S2FirmwareImage(f) else: # Otherwise, ESP8266 so look at magic to determine the image type magic = ord(f.read(1)) f.seek(0) if magic == ESPLoader.ESP_IMAGE_MAGIC: return ESP8266ROMFirmwareImage(f) elif magic == ESPBOOTLOADER.IMAGE_V2_MAGIC: return ESP8266V2FirmwareImage(f) else: raise FatalError("Invalid image magic number: %d" % magic)
Example #26
Source File: esptool.py From esptool with GNU General Public License v2.0 | 5 votes |
def read_flash_slow(self, offset, length, progress_fn): BLOCK_LEN = 64 # ROM read limit per command (this limit is why it's so slow) data = b'' while len(data) < length: block_len = min(BLOCK_LEN, length - len(data)) r = self.check_command("read flash block", self.ESP_READ_FLASH_SLOW, struct.pack('<II', offset + len(data), block_len)) if len(r) < block_len: raise FatalError("Expected %d byte block, got %d bytes. Serial errors?" % (block_len, len(r))) data += r[:block_len] # command always returns 64 byte buffer, regardless of how many bytes were actually read from flash if progress_fn and (len(data) % 1024 == 0 or len(data) == length): progress_fn(len(data), length) return data
Example #27
Source File: esptool.py From esptool with GNU General Public License v2.0 | 5 votes |
def get_flash_crypt_config(self): """ For flash encryption related commands we need to make sure user has programmed all the relevant efuse correctly so before writing encrypted write_flash_encrypt esptool will verify the values of flash_crypt_config to be non zero if they are not read protected. If the values are zero a warning will be printed bit 3 in efuse_rd_disable[3:0] is mapped to flash_crypt_config this bit is at position 19 in EFUSE_BLK0_RDATA0_REG """ word0 = self.read_efuse(0) rd_disable = (word0 >> 19) & 0x1 if rd_disable == 0: """ we can read the flash_crypt_config efuse value so go & read it (EFUSE_BLK0_RDATA5_REG[31:28]) """ word5 = self.read_efuse(5) word5 = (word5 >> 28) & 0xF return word5 else: # if read of the efuse is disabled we assume it is set correctly return 0xF
Example #28
Source File: esptool.py From esptool with GNU General Public License v2.0 | 5 votes |
def is_flash_encryption_key_valid(self): """ Bit 0 of efuse_rd_disable[3:0] is mapped to BLOCK1 this bit is at position 16 in EFUSE_BLK0_RDATA0_REG """ word0 = self.read_efuse(0) rd_disable = (word0 >> 16) & 0x1 # reading of BLOCK1 is NOT ALLOWED so we assume valid key is programmed if rd_disable: return True else: # reading of BLOCK1 is ALLOWED so we will read and verify for non-zero. # When ESP32 has not generated AES/encryption key in BLOCK1, the contents will be readable and 0. # If the flash encryption is enabled it is expected to have a valid non-zero key. We break out on # first occurance of non-zero value key_word = [0] * 7 for i in range(len(key_word)): key_word[i] = self.read_efuse(14 + i) # key is non-zero so break & return if key_word[i] != 0: return True return False
Example #29
Source File: esptool.py From esptool with GNU General Public License v2.0 | 5 votes |
def get_crystal_freq(self): # Figure out the crystal frequency from the UART clock divider # Returns a normalized value in integer MHz (40 or 26 are the only supported values) # # The logic here is: # - We know that our baud rate and the ESP UART baud rate are roughly the same, or we couldn't communicate # - We can read the UART clock divider register to know how the ESP derives this from the APB bus frequency # - Multiplying these two together gives us the bus frequency which is either the crystal frequency (ESP32) # or double the crystal frequency (ESP8266). See the self.XTAL_CLK_DIVIDER parameter for this factor. uart_div = self.read_reg(self.UART_CLKDIV_REG) & self.UART_CLKDIV_MASK est_xtal = (self._port.baudrate * uart_div) / 1e6 / self.XTAL_CLK_DIVIDER norm_xtal = 40 if est_xtal > 33 else 26 if abs(norm_xtal - est_xtal) > 1: print("WARNING: Detected crystal freq %.2fMHz is quite different to normalized freq %dMHz. Unsupported crystal in use?" % (est_xtal, norm_xtal)) return norm_xtal
Example #30
Source File: esptool.py From esptool with GNU General Public License v2.0 | 5 votes |
def run_stub(self, stub=None): if stub is None: if self.IS_STUB: raise FatalError("Not possible for a stub to load another stub (memory likely to overlap.)") stub = self.STUB_CODE # Upload print("Uploading stub...") for field in ['text', 'data']: if field in stub: offs = stub[field + "_start"] length = len(stub[field]) blocks = (length + self.ESP_RAM_BLOCK - 1) // self.ESP_RAM_BLOCK self.mem_begin(length, blocks, self.ESP_RAM_BLOCK, offs) for seq in range(blocks): from_offs = seq * self.ESP_RAM_BLOCK to_offs = from_offs + self.ESP_RAM_BLOCK self.mem_block(stub[field][from_offs:to_offs], seq) print("Running stub...") self.mem_finish(stub['entry']) p = self.read() if p != b'OHAI': raise FatalError("Failed to start stub. Unexpected response: %s" % p) print("Stub running...") return self.STUB_CLASS(self)