ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
15 июля
1530390 Топик полностью
Cкpипaчпророк (Вчера, 17:37, просмотров: 72) ответил Vit на контрольная сумма на всю длину должна дать ноль. и нормально именно это проверять. а тут сначала закат Солнца вручную, потом вызов табличного расчёта - вроде как для проверки на равно
У них CRC проверяется "в цикле" на несколько вариантов окончания приема. Напрочь не понял что ты считаешь "закатом вручную". 
    def decode(self, data: bytes) -> tuple[int, int, int, bytes]:
        """Decode ADU."""
        data_len = len(data)
        for used_len in range(data_len):
            if data_len - used_len < self.MIN_SIZE:
                Log.debug("Short frame: {} wait for more data", data, ":hex")
                return 0, 0, 0, self.EMPTY
            dev_id = int(data[used_len])
            if not (pdu_class := self.decoder.lookupPduClass(data[used_len:])):
                continue
            if not (size := pdu_class.calculateRtuFrameSize(data[used_len:])):
                size = data_len +1
            if data_len < used_len +size:
                Log.debug("Frame - not ready")
                return 0, dev_id, 0, self.EMPTY
            for test_len in range(data_len, used_len + size - 1, -1):
                start_crc = test_len -2
                crc = data[start_crc : start_crc + 2]
                crc_val = (int(crc[0]) << 8) + int(crc[1])
                if not FramerRTU.check_CRC(data[used_len : start_crc], crc_val):
                    Log.debug("Frame check failed, possible garbage after frame, testing..")
                    continue
                return start_crc + 2, dev_id, 0, data[used_len + 1 : start_crc]
        return 0, 0, 0, self.EMPTY
... но не любой ценой.