コード例 #1
0
ファイル: pbstx.py プロジェクト: sempreemcima/miniecu
    def receive(self):
        seq = 0
        len_ = 0
        payload = bytearray()
        crc = 0
        rx_crc = 0
        hdr_len = struct.calcsize(PBStx.DHEADER)
        crc_len = struct.calcsize(PBStx.CRCFMT)

        while not self.terminate.is_set():
            # 1. wait start marker
            c = self.ser.read(1)
            if len(c) == 0 or ord(c[0]) != PBStx.STX:
                continue

            # 2. read header
            buf = self._read_or_die(hdr_len)
            rx_crc = xmodem_crc16(buf)
            seq, len_ = struct.unpack(PBStx.DHEADER, buf)

            # 3. read payload
            payload = self._read_or_die(len_)
            rx_crc = xmodem_crc16(payload, rx_crc)

            # 4. read crc
            buf = self._read_or_die(crc_len)
            crc, = struct.unpack(PBStx.CRCFMT, buf)

            # 5. check crc
            if crc == rx_crc:
                return self._deserialize(seq, payload)
            else:
                raise ReceiveError("CRC mismatch: 0x{:04x} != 0x{:04x}".format(crc, rx_crc))
コード例 #2
0
ファイル: pbstx.py プロジェクト: sumchege/miniecu
    def receive(self):
        seq = 0
        len_ = 0
        payload = bytearray()
        crc = 0
        rx_crc = 0
        hdr_len = struct.calcsize(PBStx.DHEADER)
        crc_len = struct.calcsize(PBStx.CRCFMT)

        while not self.terminate.is_set():
            # 1. wait start marker
            c = self.ser.read(1)
            if len(c) == 0 or ord(c[0]) != PBStx.STX:
                continue

            # 2. read header
            buf = self._read_or_die(hdr_len)
            rx_crc = xmodem_crc16(buf)
            seq, len_ = struct.unpack(PBStx.DHEADER, buf)

            # 3. read payload
            payload = self._read_or_die(len_)
            rx_crc = xmodem_crc16(payload, rx_crc)

            # 4. read crc
            buf = self._read_or_die(crc_len)
            crc, = struct.unpack(PBStx.CRCFMT, buf)

            # 5. check crc
            if crc == rx_crc:
                return self._deserialize(seq, payload)
            else:
                raise ReceiveError("CRC mismatch: 0x{:04x} != 0x{:04x}".format(
                    crc, rx_crc))
コード例 #3
0
ファイル: pbstx.py プロジェクト: sempreemcima/miniecu
    def send(self, pbobj):
        if not isinstance(pbobj, msgs.Message):
            raise ValueError("Unknown object: " + repr(pbobj))

        payload = pbobj.SerializeToString()
        if len(payload) > PBStx.MAX_LEN:
            raise ValueError("Serialized {} too long: {}".format(repr(pbobj), len(payload)))

        buf = struct.pack(PBStx.EHEADER, PBStx.STX, self._tx_seq, len(payload))
        buf += payload

        tx_crc = xmodem_crc16(buf[1:])
        buf += struct.pack(PBStx.CRCFMT, tx_crc)

        self._tx_seq += 1
        self.ser.write(buf)
コード例 #4
0
ファイル: pbstx.py プロジェクト: sumchege/miniecu
    def send(self, pbobj):
        if not isinstance(pbobj, msgs.Message):
            raise ValueError("Unknown object: " + repr(pbobj))

        payload = pbobj.SerializeToString()
        if len(payload) > PBStx.MAX_LEN:
            raise ValueError("Serialized {} too long: {}".format(repr(pbobj), len(payload)))

        buf = struct.pack(PBStx.EHEADER, PBStx.STX, self._tx_seq, len(payload))
        buf += payload

        tx_crc = xmodem_crc16(buf[1:])
        buf += struct.pack(PBStx.CRCFMT, tx_crc)

        self._tx_seq += 1
        self.ser.write(buf)