staxbelЭ-э, а какой смысл тогда вообще чтото писать? эти же цифры чтото означают, если там нету мусора, статус работы или данные измерения. И наверное нужно понимать если “чтото пошло не так”.
Тут родилась другая идея, может ее проще реализовать? При получении данных, сравниваем с предыдущим значением, если значения совпадают - записываем в БД если нет - отправляем запрос еще раз.
staxbelвы таки видать не там ставите. Не должно оно вам такого говорить если вы просто строку декодируете, максимум вы можете получить DecodeError если там совсем мусор-мусор. попробуйте без кодировки указать, просто decode(). и вобще покажите весь код что вы там наисправляли.
Если ставлю utf-8, получаю ошибку
def check_data(data): correct_set = [32, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57 ] for x in data: if x not in correct_set: return False else: return True print(check_data(b' 118\x98')) print(check_data(b' 1180')) print(check_data(b' 1q80')) print(check_data(b' 118<')) print(check_data(b' 1234')) >>> False True False False True >>>
def check_data(data): # проверяем данные if data.isdigit(): if 0 <= int(data) <= 100000: return True else: return False else:return False def hold_session(): with db.getConnection() as connection: # подключились к базе данных with serial.Serial('COM3', timeout=1) as ser: # подключились к порту last_value = None # последние записанные данные данные if last_value is None: pass # здесь достаем последние записаные значения из бд while True: # запустили поток cmd = bytearray([0x3]) ser.write(cmd) # отправили байты оборудованию (скорее всего весы в силосе) reply = ser.read(22) # прочитали ответ 22 байта out = reply[11:16] # из них выбрали с 11 по 16 байты data = out.decode()#раскодировали данные if check_data(data) and last_value != data:#если валидны и не равны последним try: cursor = connection.cursor() sql = "Update silos3 set weight = %s, date = %s where id = %s " # вот сюда нужно записать вес newHireDate = datetime.today() cursor.execute(sql, (data, newHireDate, 1 ) )#вот здесь id всегда будет 1 непонятно connection.commit() print ("Данные изменены",data, newHireDate) last_value = data except Exception as e: print(e, f" данные >>> {data} <<< не записались в бд") else: print('шлак какой-то пришел') hold_session()
xam1816поскольку у там может быть любой мусор то data = out.decode() может вызвать DecodeError, я бы его еще в тру-ексепт decode() заключил.
вот так будет работать?
b' 1180'если это валидные данные то isdigit() выдаст False. В таком случае пробелы перед проверкой нужно обрезать.
PEHDOMЭто как пример,если данные будут числовое значение но выходящее из диапазона,т.е если это вес, но он не может быть по существу,его отсеять.А так вообще нужно почитать если это весы,как там устроено это общение, потому что мне кажется в сообщении от оборудования есть проверка на корректность данных в каких нибудь байтах
вот в этой проверке if 0 <= int(data) <= 100000 я вообще не вижу смысла
b' \xb2980'
b'ST,NT,\x03\xc0, 1565 kg\r\n'
b'ST,NT,\x03\xc0, 1565 kg\x0f\n'
b'ST,NT,\x03\xc0, 1565 k\x7f\r\n'
b'ST,NT,\x03\xc0, 1565 {g\r\n'
b'ST,NT,\x03\xc0, 156\xb5 og\r\n'