Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 24, 2015 05:34:57

MAGRA
Зарегистрирован: 2015-02-20
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Протокол обмена данных Honda 3-pin

Все с этим разобрался.

a = bytearray([0x20, 0x05, 0x00, 0x10, 0xCB])
    ser.write(a)# write a string
    print ('20 05 00 10 CB')
    sa=ser.readline()
    print (sa.encode('hex'))

>>>20 05 00 10 CB
a8100000000000001000000100000001

Как теперь выдергивать из каждой пары значений данные, их как то в столбец преобразовывать надо?

Офлайн

#2 Фев. 24, 2015 05:37:56

MAGRA
Зарегистрирован: 2015-02-20
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Протокол обмена данных Honda 3-pin

Все с этим разобрался.

 a = bytearray([0x20, 0x05, 0x00, 0x10, 0xCB])
ser.write(a)# write a string
print ('20 05 00 10 CB')
sa=ser.readline()
print (sa.encode('hex'))

>>>20 05 00 10 CB
10a80000000000001000000100000001
Как теперь выдернуть из каждой пары значения? Надо в столбец преобразовывать?

Офлайн

#3 Фев. 24, 2015 06:01:33

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9890
Репутация: +  854  -
Профиль   Отправить e-mail  

Протокол обмена данных Honda 3-pin

MAGRA
a = bytearray([0x20, 0x05, 0x00, 0x10, 0x100-(0x20+0x05+0x00+0x10)])

Для вычисления контрольной суммы можно использовать преимущество bytearray():
>>> a = bytearray([0x20, 0x05, 0x00, 0x10])
>>> a.append(0x100 - sum(a))
>>> a
bytearray(b' \x05\x00\x10\xcb')
>>>

Там ещё надо добавить кое-что:
>>> a = bytearray([0x20, 0x05, 0x00, 0x10])
>>> a.append((0x100 - sum(a)) & 0xFF)
>>> a
bytearray(b' \x05\x00\x10\xcb')
>>>
Контрольная сумма однобайтовая, а сумма байт может получиться больше байта.

Для приёма тоже bytearray() используй, чтобы оперировать числами, а не строками.
>>> b = bytearray('abc')
>>> list(b)
[97, 98, 99]
>>>



Отредактировано py.user.next (Фев. 24, 2015 06:17:05)

Офлайн

#4 Фев. 24, 2015 06:54:31

MAGRA
Зарегистрирован: 2015-02-20
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Протокол обмена данных Honda 3-pin

 a = bytearray([0x20, 0x05, 0x00, 0x10])
a.append((0x100 - sum(a)) & 0xFF)
ser.write(a)
print ('20 05 00 10 CB')
sa=ser.readline()
print (sa.encode('hex'))

>>>20 05 00 10 CB
10a80000000000001000000100000001

Не могу понять как bytearray() запилить в прием.

Офлайн

#5 Фев. 24, 2015 06:59:10

MAGRA
Зарегистрирован: 2015-02-20
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Протокол обмена данных Honda 3-pin

Ну что то типо такого.

 a = bytearray([0x20, 0x05, 0x00, 0x10])
    a.append((0x100 - sum(a)) & 0xFF)
    ser.write(a)
    print ('20 05 00 10 CB')
    sa=ser.readline()
    aa=bytearray(sa)
    print (sa.encode('hex'))
    print list(aa)

>>>20 05 00 10 CB
10a80000000000001000000100000001
[16, 168, 0, 0, 0, 0, 0, 0, 16, 0, 0, 1, 0, 0, 0, 1]

Отредактировано MAGRA (Фев. 24, 2015 07:11:59)

Офлайн

#6 Фев. 24, 2015 07:18:39

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9890
Репутация: +  854  -
Профиль   Отправить e-mail  

Протокол обмена данных Honda 3-pin

Дальше можно извлечь команду:

>>> b = bytearray([16, 168, 0, 0, 0, 0, 0, 0, 16, 0, 0, 1, 0, 0, 0, 1])
>>> b
bytearray(b'\x10\xa8\x00\x00\x00\x00\x00\x00\x10\x00\x00\x01\x00\x00\x00\x01')
>>> cmd = b.pop(0)
>>> cmd
16
>>> b
bytearray(b'\xa8\x00\x00\x00\x00\x00\x00\x10\x00\x00\x01\x00\x00\x00\x01')
>>>



Офлайн

#7 Фев. 24, 2015 07:39:01

MAGRA
Зарегистрирован: 2015-02-20
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Протокол обмена данных Honda 3-pin

cmd = b.pop(0)
Как я понимаю это нулевой байт?
\x10
а второй байт будет
cmd = b.pop(1)
.

написал так
sa=ser.readline()
    aa=bytearray(sa)
    a0 = aa.pop(0)
    a1 = aa.pop(1)
    print (a0)
    print (a1)

И он мне выдал значение не 168 , а 0

20 05 00 10 CB
10a80000000000001000000100000001
[168, 0, 0, 0, 0, 0, 16, 0, 0, 1, 0, 0, 0, 1]
16
0

Офлайн

#8 Фев. 24, 2015 07:57:09

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9890
Репутация: +  854  -
Профиль   Отправить e-mail  

Протокол обмена данных Honda 3-pin

MAGRA
И он мне выдал значение не 168 , а 0
cmd = a.pop(0)
arg = a.pop(0)

MAGRA
а второй байт будет
Ты как бы обратно разбираешь то, что на той стороне составляли. Сначала там выбрали команду - сначала ты берёшь команду. Потом там выбрали аргумент - затем ты берёшь аргумент. Потом там добавили данные - затем ты берёшь данные.
По команде определяешь соответствующую ветвь программы.

def func1(arg):
    pass
 
def func2(arg):
    pass
 
d = {0x10: func1,
     0x20: func2}
 
f = d[cmd]
f(arg)



Отредактировано py.user.next (Фев. 24, 2015 08:03:52)

Офлайн

#9 Фев. 24, 2015 14:11:58

MAGRA
Зарегистрирован: 2015-02-20
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Протокол обмена данных Honda 3-pin

py.user.next Спасибо тебе большое за помощь, всё получилось!

Маленько по другому написал

 sa=ser.readline()
    aa=bytearray(sa)
    H00 = int(aa[2])
    H01 = int(aa[3])
    ...
    H0n = int(aa[n])

Офлайн

#10 Фев. 24, 2015 14:50:19

MAGRA
Зарегистрирован: 2015-02-20
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Протокол обмена данных Honda 3-pin

Блин, ещё вопрос возник
Как это зациклить, и как сделать так что бы не каждый раз строчки выводились, а просто менялись значения.

a = bytearray([0x20, 0x05, 0x00, 0x10])
    a.append((0x100 - sum(a)) & 0xFF)
    ser.write(a)  
    sa=ser.readline()
    aa=bytearray(sa)
    H00 = int(aa[2])
    H01 = int(aa[3])
    H02 = int(aa[4])
    print ("RPM",(H00*256+H01)/4)
    print ("Speed",(H02))

('RPM', 8128)
('Speed', 127)
('RPM', 8128)
('Speed', 127)
('RPM', 8128)
('Speed', 127)
('RPM', 8128)
('Speed', 127)
('RPM', 8128)
('Speed', 127)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version