Форум сайта python.su
0
Добрый день, прошу помощи разобраться в написании небольшой функции:
есть простой скрипт
import socket import re HOST = '192.168.100.252' PORT = 2000 # reverse func def reverse_per_two_char(chars): ''' reverse '010203' to '030201' ''' return ''.join(reversed(re.findall('..?', chars))) #есть функция которая собирает из частей строку в 16тиричном формате и отправляет в порт на #указаный IP def write_register(start_digit, digit_num=1, port=PORT, host=HOST, dic=True): client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect((host, port)) cmd = '500000ffff03000e00100001140000'\ + reverse_per_two_char('{:0=6x}'.format(start_digit))\ + 'a8' + reverse_per_two_char('{:0=4x}'.format(digit_num))\ + reverse_per_two_char('{:0=4x}'.format(int('0003'))) msg = bytes.fromhex(cmd) client.send(msg) res = client.recv(1024).hex() if dic: return {start_digit: int(reverse_per_two_char(res[-4*digit_num:]), 16)} else: return int(reverse_per_two_char(res[-4*digit_num:]), 16) testregD1 = write_register(1, 1) print('D1: ', testregD1)
def write_register(start_digit, write_data, digit_num=1, host=HOST, port=PORT, dic=True): client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect((host, port)) cmd = '500000ffff03000e00100001140000'\ + reverse_per_two_char('{:0=6x}'.format(start_digit))\ + 'a8' + reverse_per_two_char('{:0=4x}'.format(digit_num))\ + reverse_per_two_char('{:0=4x}'.format(int[b](write_data[/b], 16))) msg = bytes.fromhex(cmd) client.send(msg) res = client.recv(1024).hex() if dic: return {start_digit: int(reverse_per_two_char(res[-4*digit_num:]), 16)} else: return int(reverse_per_two_char(res[-4*digit_num:]), 16) testregD1 = write_register(1, 1, '0001') print('D1: ', testregD1)
Отредактировано Dmitry_K (Июнь 6, 2020 16:07:15)
Офлайн
857
Передай код точно. Используй тег
[code python][/code]
Офлайн
0
py.user.nextисправил, спасибо за замечание, я тут в первые.
Передай код точно. Используй тег
Офлайн
857
Работай с байтами как с числами, а не как со строками
>>> b = bytearray([1, 2, 3, 4, 5]) >>> b bytearray(b'\x01\x02\x03\x04\x05') >>> >>> b.insert(2, 7) >>> b bytearray(b'\x01\x02\x07\x03\x04\x05') >>> >>> b[2:2] = [10, 11, 12] >>> b bytearray(b'\x01\x02\n\x0b\x0c\x07\x03\x04\x05') >>> >>> b.hex() '01020a0b0c07030405' >>> >>> b.hex().upper() '01020A0B0C07030405' >>> >>> b.reverse() >>> b.hex().upper() '050403070C0B0A0201' >>>
Dmitry_KУ тебя архитектура неправильная. Работа со строками вместо чисел выплыла на формате. Спецификатор формата x применяется только к числам. При этом, если взять число вместо строки, там пропадут ведущие нули. С байтами надо работать с помощью специальных инструментов для этого - байтовые литералы (b'\x01\x02\x03') , bytes, bytearray, модуль struct.видимо я что-то где-то не правильно передаю? подскажите что может быть не так, спасибо.ValueError: Unknown format code 'x' for object of type 'str'
Отредактировано py.user.next (Июнь 6, 2020 19:00:07)
Офлайн
0
спасибо, за рекомендации буду разбираться
Офлайн