Форум сайта python.su
Контроля четности нету, работает по интерфейсу RS-232C, переделан на RS-485, т.к. длина трассы большая. Суть в том, что даже если он запишет не верное значение, то особо проблемы нет, через 30 сек идет повторный опрос. Этот мусор бывает очень редко. Просто в данный момент при значении например b' 118\x98' - получается ошибка записи в БД и программа вылетает.
Офлайн
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 >>>
[code python][/code]
Отредактировано PEHDOM (Апрель 5, 2021 11:33:38)
Офлайн
> Контроля четности нету
Что за железка?
> получается ошибка записи в БД и программа вылетает
Ну так обработай её через try/except
Офлайн
вот так будет работать?
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 (Апрель 5, 2021 13:47:28)
Офлайн
xam1816поскольку у там может быть любой мусор то data = out.decode() может вызвать DecodeError, я бы его еще в тру-ексепт decode() заключил.
вот так будет работать?
b' 1180'если это валидные данные то isdigit() выдаст False. В таком случае пробелы перед проверкой нужно обрезать.
[code python][/code]
Отредактировано PEHDOM (Апрель 5, 2021 14:36:21)
Офлайн
PEHDOMЭто как пример,если данные будут числовое значение но выходящее из диапазона,т.е если это вес, но он не может быть по существу,его отсеять.А так вообще нужно почитать если это весы,как там устроено это общение, потому что мне кажется в сообщении от оборудования есть проверка на корректность данных в каких нибудь байтах
вот в этой проверке if 0 <= int(data) <= 100000 я вообще не вижу смысла
Офлайн
> потому что мне кажется в сообщении от оборудования есть проверка на корректность данных в каких нибудь байтах
Я о чём тебе и говорю. Там должна быть контрольная сумма (CRC). Ты должен вычислить её у полученного сообщения и сравнить с тем что к тебе с ним пришло. Если они одинаковые то всё норм, иначе данные не верны.
Офлайн
Это весы CAS2001A, в документации про корректность данных ни слова.
Сейчас вообще вот такой мусор вылез
b' \xb2980'
Офлайн
пришлите все 22 байта и скажите какой вес был на весах, у вас данные с 10 по 17 байты должны быть
Отредактировано xam1816 (Апрель 5, 2021 21:49:36)
Офлайн
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'
Офлайн