December 20, 2006

Последовательные порты и параллельное исполнение

Так уж вышло, что текущая работа связала меня одновременно с Microsoft .Net Framework и последовательными портами (COM-порты в простонародии). И вот с ними я заимел много-много хлопот в последнее время. Но, обо всём по-порядку.

Сначала была библиотека, писаная давным давно на C++. Эта библиотека обеспечивала требуемую функциональность, но найти, а тем более исправить в ней ошибки, которые периодически возникали, было делом непростым. Я не утверждаю, что она была написана плохо, прото она написана не мной, а человеком, который уже давно сменил место работы, и, по всей видимости, писалась долго, так что нагромождения кода разобрать было сложновато. Взаимодействие с этой библиотекой происходило через PInvoke.

Окунёмся ещё глубже в историю. Год назад вышел .Net Framework 2.0, в котором наконец-то появились инструменты для работы с последовательными портами. И с самого начала работы над текущим проектом я намеревался упросить-таки начальство переписать описанную выше библиотеку на C#. Как оказалось доигрался...

Решение было принято. Библиотеку переписали. Всё стало по-новому. Только вот появилась одна неприятная ошибочка, отловить которую никак не удавалось. Где только можно были поставлены try-catch блоки. Все ошибки логировались. Но приложение всё равно падало. Чтобы этого добиться достаточно было удалить из системы COM-порт в момент отправки на него чего-либо. Исключение вываливалось прямо из внутреннего потока исполнения и обрабатывалось нигде. А потом наш тестер Тестер ввёл текст ошибки в Google, или не знаю уж куда, вобщем в поисковик и нашёл вот это. Если вкратце, то разработчики из Microsoft (которые, как известно, самые обиженные люди, потому что им пенять не на кого), реализовывавшие SerialPort и сопутствующие классы, решили, что последовательные порты в системе - понятие статичное и появляться, а уж тем более исчезать, не могут. Слегка странное решение, если учесть, что сейчас каждый второй (если не первый) телефон снабжён модемом и подключается через USB, не говоря уже про всякие Bluetooth модемы.

Шок от этой новости был ещё тот. Через 4 дня релиз, а тут одна из ключевых фич не работает. Я, как предложивший использовать .Net для всего, вообще хотел забиться в дальний угол (shame on me). Выручил снова молодец Тестер. Тем же своим поисковиком он нашёл возможные решения. Пришлось в срочном порядке подменять стандартную .Net реализацию SerialPort'а самописной. Что интересно -- заработало.

Мораль сей басни такова: если ошибку не удалось отловить быстро - ищи в интернете. Ну и ещё на память заметочка: проверять возможность реализации чего-бы то ни было прежде чем браться за реализацию :-)


Comments:
Ну, по моему личному опыту работы со всеми unix (2 года), так и происходит. Стал собирать/запускать - выдало ошибку (если конечно выдало :D) скопировал и вставил в google. в 90% случаях находишь описание проблемы и решения.в 10% - ты уникум, и извратился так, как никто не мог :)

 


Иногда Google Code Search помогает

 


2Terol: У меня была уже похожая ситуация. Сервер с клиентом общались через .Net Remoting. Иногда получлось так, что после нормального завершения клиента нормальное завершение сервера приводило к краху. Ситуёвина была странная. Тогда вобщем-то и альтерантив кроме как искать в интеренете не было. Ответ нашёлся. Оказалось, что это тоже known issue, которую никто не хочет исправлять (с оговорками, конечно, в виде workaround). Но почему-то такой положиетльный опыт решения проблем у меня в голове не отложился :-) Странная штука человеческая память...

 


Про Code Search... Он по определению не даст мне ответа на вопрос о том, как что-то реализовано в проприетарном софте :-)
Но идея хороша... Спасибо. Учту.
(В глубинах сознания появилось воспоминание о krugle.com)

 


Post a Comment



<< Home

This page is powered by Blogger. Isn't yours?