Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 20, 2015 04:20:02

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

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

День добрый. Подскажите пожалуйста, в питоне не силен, но задача стоит.
Имеется автомобиль Honda протокол обмена данными с ECU автомобиля нестандартный, но его раскрыли и выложили вот Your text to link here… . Подключается все это дело к PC через COM-USB адаптер. дак вот вопрос. Как передать в com-порт команду типо 20 05 00 10 CB и т.д? И как потом обратно считать данные которые выдаст ECU. С чего начать.

Отредактировано MAGRA (Фев. 20, 2015 04:20:20)

Офлайн

#2 Фев. 20, 2015 05:07:39

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

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

Офлайн

#3 Фев. 21, 2015 09:02:37

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

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

py.user.next Спасибо, с этим разобрался! Теперь возник ещё вопрос. Когда я отправляю на порт строчку 20 05 10 10 CB, он его не понимает что это hex. Как сделать что бы com-порт понял меня правильно, типо что я хочу считать 16 байт из памяти.?

ser = serial.Serial('COM1', 9600, timeout=1)# open first serial port
print ser.name # check which port was really used
#time.sleep(1)
ser.write(“20 05 10 10 CB”)# write a string
print “20 05 10 10 CB”
ser.read()

Офлайн

#4 Фев. 21, 2015 10:07:15

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

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

Офлайн

#5 Фев. 21, 2015 10:19:52

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

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

Во втором питоне используй bytearray():

>>> b = bytearray([0x20, 0x05, 0x10, 0x10, 0xCB])
>>> b
bytearray(b' \x05\x10\x10\xcb')
>>> list(b)
[32, 5, 16, 16, 203]
>>>

В третьем питоне байты проще обрабатывать:
>>> b = bytes([0x20, 0x05, 0x10, 0x10, 0xCB])
>>> b
b' \x05\x10\x10\xcb'
>>> list(b)
[32, 5, 16, 16, 203]
>>>



Офлайн

#6 Фев. 21, 2015 11:23:49

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

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

py.user.next
Во втором питоне используй bytearray():
А в чем смысл для ТС использовать bytearray или bytes? Ему нужно просто передать правильный литерал. А ваша запись длиннее и похоже никакого полезного для данной задачи дополнительного функционала не дает.



Офлайн

#7 Фев. 21, 2015 12:26:39

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

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

doza_and
Ему нужно просто передать правильный литерал.
Когда он начнёт формировать команды, а делать это надо будет не руками, вот тогда это и станет заметно.
Я когда-то давно пытался написать клиент для icq, вот там протокол такой, что нельзя было задать константные значения, потому что нужно было принимать ответ, выделять из него пришедшие данные, а потом вставлять их в следующий запрос и отправлять.

В данном случае у него есть команда в виде числа, аргумент у неё в виде последовательности чисел и контрольная сумма. Вот исходя из того, что аргумент, команда и сумма могут меняться по отдельности, я и предложил ему мутабельный bytearray(), у которого есть все необходимые методы.

А bytes() в пример привёл, чтобы показать, что bytes() в третьем питоне - это набор чисел, а не строк, как во втором.



Отредактировано py.user.next (Фев. 23, 2015 18:07:12)

Офлайн

#8 Фев. 23, 2015 17:40:38

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

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

py.user.next Вроде получилось, комп ответил, только вот какк то странно его понял питон, написал “!!” команда была вот такая.

ser = serial.Serial('COM3', 9600, timeout=1)# open first serial port
print ser.name # check which port was really used
#time.sleep(1)
a = bytearray()
ser.write(a)# write a string
print ('20 05 00 10 CB')
ser.read()
print(ser.read())

>>> 20 05 00 10 CB
!!

Как сделать так, что бы он при приеме данных отображал их в виде 13 03 48 3….

Отредактировано MAGRA (Фев. 23, 2015 17:42:04)

Офлайн

#9 Фев. 23, 2015 18:09:06

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

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

Чтобы код передавать точно, используй теги кода. Если пишешь без тегов, движок форума преобразует символы.

такие



Отредактировано py.user.next (Фев. 23, 2015 18:11:42)

Офлайн

#10 Фев. 24, 2015 03:34:42

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

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

 ser = serial.Serial('COM3', 9600, timeout=1)# open first serial port
    print ser.name # check which port was really used 
    #time.sleep(1)
    a = bytearray([0x20, 0x05, 0x00, 0x10, 0x100-(0x20+0x05+0x00+0x10)])
    ser.write(a)# write a string
    print ('20 05 00 10 CB')
    ser.read()
    print(ser.read())

>>> 20 05 00 10 CB
!!

Хотя я отсылаю вот такой ответ.
10.A8.00.00.00.00.00.00.10.00.00.01.00.00.00.01.

Отредактировано MAGRA (Фев. 24, 2015 04:21:33)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version