Практическая проблема в том, что указанные временные параметры (25 мс) нужно соблюдать с точностью 1 мс, иначе блок не распознает попытку начала соединения и ничего не ответит. На уровне отдельной железяки со своим микропроцессором в этом нет сложности (почему проще для соединения использовать ELM327 или тому подобное), а вот при прикладном программировании возникают небольшие проблемы.
Сейчас я применяю два практических способа fast initialization:
1. Управление через break. Во многих API последовательного порта есть возможность управления сигналом break. Break сигнал - это как раз нужный перевод линии в состояние логического нуля. Тогда алгоритм инициализации упрощенно выглядит так:
a) set break
b) sleep 25 ms
c) clear break
d) sleep 25 ms
e) write start message
Основная практическая проблема в том, что та же ОС Windows гуляет сама по себе: то свопится, то чешет спину. Выдержать нужные задержки в 25 мс с требуемой точностью сложно и нестабильно. Еще хуже, если PC медленный, а язык программирования высокоуровневый с промежуточными слоями библиотек.
2. Альтернативным способом без использования управления break является способ с отправкой данных на низкой скорости с дальнейшем переходом на 10400.
Поясню идею. Нужно отправить некие данные, которые бы дали 25 мс логического нуля, а затем 25 мс логической единицы. Если отправлять данные в конфигурации 8-N-1, то каждый отправленный байт состоит из последовательности битов: один старт-бит (логический ноль), восемь бит данных, один стоп-бит (логическая единица). Если отправляемые биты данных будут состоять из 4 нулевых битов и 4 единичных битов, то получается общая последовательность из 5 нулевых битов и 5 единичных. Каждые из этих 5 бит должны передаваться требуемые 25 мс, что дает скорость 1000/25*5=200 (бод). Поскольку данные передаются в "обратном" порядке, то требуемым байтом с 4 нулями и 4 единицами будет F0h. Тогда алгоритм инициализации упрощенно выглядит так:
a) set 200 baud rate
b) write F0h
c) set 10400 baud rate
d) write start message
Но проблема в том, что пункты c-d нужно выполнять только после физической передачи F0h. Практически для этого приходится между шагами б и в добавлять sleep 50 ms (в идеальном случае). Но здесь опять та же проблема с временными задержками.
Но не все так плохо. На практике эти способы работают, хотя и наблюдается сильная зависимость от PC, операционной системы и даже адаптера K-Line (хорошо, что их у меня два для тестирования). Результаты опыта:
1. Ноутбук Lenovo T60 c Windows XP. Старый, но по тем временам не такой медленный.
С адаптером VAG 409 достаточно надежно работают оба способа соединения (и управление break, и отправка F0h@200). Но для break-метода паузу приходится чуть уменьшать.
С адаптером Орион работает break-метод (тоже с уменьшением паузы), но не хочет стабильно работать метод F0h@200.
2. Ноутбук Asus Eee Pc T91MT с Windows 7. Поновее, но жутко медленный (тогдашние процессоры Intel Atom были редкостным барахлом), еще и Windows 7 "способствует".
Ни с одним из двух адаптеров не удается стабильно соединяться методом break (сильно плавает задержка). Но с обоими адаптерами работает метод F0h@200. С Орионовским даже получше, а для VAG 409 приходится чуть задержку увеличивать.
Поэтому в своей программе встроил автоподбор способа соединения. В результате первоначальные соединения не такие шустрые, как могли бы быть, но, надеюсь, будут работать на широком спектре ноутбуков.
А что касается 5-бодовой инициализации ISO 14230, то она, судя по разным источникам, используется, но с редкими видами блока SRS (DELCO и т.п. экзотикой). У меня нет такого блока, поэтому нет возможности тестирования.
Еще по этой теме:
- SZ Viewer W1-2019-03-26 (Windows) (2019-03-27)
- SZ Viewer A1-2019-03-25 (Android) (2019-03-26)
- CASCADE 0.9.4 (2015-03-22)
- Диагностические адаптеры для SZ Viewer (2015-03-15)
- Диагностические USB-адаптеры и Android (теория) (2014-04-11)
- Vgate iCar 2 (Wi-Fi ELM327 адаптер) (2014-03-28)
- Чем плох ELM327. И почему его приходится поддерживать (2014-03-02)
- SZ Viewer 2014-02-01: диагностика через K-Line (первая версия) (2014-02-01)
0 comments:
Post a Comment