Найти - Пользователи
Полная версия: Протокол обмена данных Honda 3-pin
Начало » Центр помощи » Протокол обмена данных Honda 3-pin
1 2 3
MAGRA
День добрый. Подскажите пожалуйста, в питоне не силен, но задача стоит.
Имеется автомобиль Honda протокол обмена данными с ECU автомобиля нестандартный, но его раскрыли и выложили вот Your text to link here… . Подключается все это дело к PC через COM-USB адаптер. дак вот вопрос. Как передать в com-порт команду типо 20 05 00 10 CB и т.д? И как потом обратно считать данные которые выдаст ECU. С чего начать.
py.user.next
pyserial. примеры
MAGRA
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()
doza_and
https://docs.python.org/2.0/ref/strings.html
>>> "\x20\x21"
' !'
py.user.next
Во втором питоне используй 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]
>>>
doza_and
py.user.next
Во втором питоне используй bytearray():
А в чем смысл для ТС использовать bytearray или bytes? Ему нужно просто передать правильный литерал. А ваша запись длиннее и похоже никакого полезного для данной задачи дополнительного функционала не дает.
py.user.next
doza_and
Ему нужно просто передать правильный литерал.
Когда он начнёт формировать команды, а делать это надо будет не руками, вот тогда это и станет заметно.
Я когда-то давно пытался написать клиент для icq, вот там протокол такой, что нельзя было задать константные значения, потому что нужно было принимать ответ, выделять из него пришедшие данные, а потом вставлять их в следующий запрос и отправлять.

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

А bytes() в пример привёл, чтобы показать, что bytes() в третьем питоне - это набор чисел, а не строк, как во втором.
MAGRA
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….
py.user.next
Чтобы код передавать точно, используй теги кода. Если пишешь без тегов, движок форума преобразует символы.

такие
MAGRA
 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.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB