Сергей Половинкин
6 июля 2010

В кассовый аппарат необходимо ввести информацию: товары, отделы, оформление чека и т. д. Это можно сделать с помощью специальной программы, подключив аппарат к компьютеру через КОМ-порт. Но в программе нужно указать номер порта и скорость обмена с устройством.

Цитата из книги А. Купера «Об интерфейсе»:

Существуют действия, в которых не нуждается никто — ни новички, ни специалисты. Это и есть наглые налоги. Операции, связанные с настройкой аппаратной части, например указание программе, какой КОМ-порт она должна использовать, компьютер мог бы выполнить и самостоятельно. Подобные аспекты следует убирать из пользовательского интерфейса и заменять интеллектуальным поведением программы, скрытым от пользователя.

Т. е. нужно убрать настройку порта. Как читатель книги я согласен с Купером, а как программист — не согласен. Почему?

  • В некоторых кассовых аппаратах весьма гибко настраивается скорость обмена. Возможные значения: 4800, 9600, 14400, 19200, 38400, 56000, 57600, 115200. Более того, некоторые ПК после установки блутуса имеют запредельное количество КОМ-портов, например 18. Так вот, мне как программисту чтобы определить на какой же порт подключен кассовый аппарат, придётся выполнить следующее:
  • получить все существующие порты;
  • открывать каждый порт;
  • установить скорость обмена (каждую по очереди: 4800, 9600, 14400…);
  • послать пакет устройству и ждать ответа.

Как правильно спроектировать интерфейс программы? Оставить всё как есть или использовать «интеллектуальное поведение» (и иногда терять до 5 минут на определение)?

Понятно, что после успешного перебора я буду запоминать номер порта и скорость, чтобы не определять заново.



Сергей!

Если вы уже согласны «как читатель книги», то дальше нужно программиста в себе тоже убедить. Знаю не понаслышке, сам через это проходил не раз, да и до сих пор бывает. Давайте попробуем улучшить ваш алгоритм, чтобы он работал быстро.

Во-первых, для того, чтобы определить, подключен ли кассовый аппарат в порт, нам не нужно перебирать все скорости, достаточно попробовать обменяться с ним на минимальной. Постепенно ускоряться можно потом, уже во время передачи данных. Это даёт ускорение в 8 раз, то есть 5 минут превращаются в 38 секунд (если мы исходим из 8 разных скоростей).

Во-вторых, я полагаю, нам не обязательно ждать ответа от каждого порта перед тем, как попробовать отправить запрос на другой. Мы можем сделать несколько потоков и отправить из каждого по тестовому пакету на порт, а потом остановить их все, как только придёт устраивающий нас ответ с любого. Так 38 секунд превратятся в 2 (если мы исходим из 18 портов).

Наконец, в-третьих, и это важнее всего, пользователю скорее всего понадобится больше времени на то, чтобы в самой программе ввести все те данные, ради которых он её запустил, и при этом совершенно не важно, будет ли в это время установлено соединение с кассовым аппаратом. Оно понадобится только для передачи этих данных в аппарат. Поэтому порт можно искать в фоновом режиме, пока пользователь добавляет мясной и молочный отделы в список.

P. S.

Я веду практический курс «Пользовательский интерфейс и представление информации». Дата следующего курса пока неизвестна.

 
Мы напишем вам, когда будет открыта запись. Без спама.

Поделиться

Комментарии

Алексей Блинов
6 июля 2010

Если процесс автоопределения действительно занимает 5 минут, и сократить это время никак нельзя, то можно определять всё автоматически по умолчанию, но добавить кнопку «Остановить автоопределение, я сам введу параметры».

Александр Смердов
6 июля 2010

Прямо сейчас в одном проекте точно также убеждал разработчиков.
«А если подключить несколько программируемых устройств к одному компьютеру?»
«А если какой-то КОМ-порт замкнут на какой-то программный драйвер и обмен с ним вообще непредсказуем?»
Брр!

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

Кстати, пользуясь случаем, попрошу привести примеры удачно переделанных программ-конфигураторов. Мне кажется, что это весьма самостоятельный жанр и многие из этих программ чем-то похожи. Главное окно похоже на диалог, постраничное чтение/запись, обмен через волшебный кабель программирования (или аналогичный беспроводной интерфейс). И неизменно — визуализированная модель реализации во всей своей ужасной красоте.
С удовольствием почерпал бы идей из успешного опыта.

Виктор Наумик
6 июля 2010

Я бы просто добавил там галочку «Авто», по умолчанию включенную. Или кнопку «Настроить вручную», по которой появляется настройка порта вручную.

Просто иногда что-то не работает. И очень плохо, когда в программе всего одна кнопка «Сделать красиво!», но она не работает, а других кнопок, чтобы что-то настроить, нет…

Дима Бирман
6 июля 2010

А что делать, если к другим портам подключены тоже приборы, и они могут реагировать на наши телеграммы? Я бы как программист просто использовал переходник с КОМа на на УСБ. Тогда сразу видно, что приконнектился наш прибор. А брутфорсить порты — дело самое последнее.

Михаил Едошин
6 июля 2010

Даже если не заморачиваться ускорением работы алгоритма, а просто сделать кнопку «Определить» с прогресс-баром и указанием, что это может занять несколько минут, это будет вполне приемлемый вариант. Виндоус Экс-пи ставится сорок минут, проводя при этом кучу тестов, и ничего. Наверное, можно было бы этот процес несколько ускорить, если дать пользователю самому выставить конкретную конфигурацию оборудования, но 99,9% лучше подождут.

Сергей Киров
6 июля 2010

Настройку совсем убирать нельзя. Например, касса может определяться на 115200, но глючить при скоростях выше 14400.

Параметры по умолчанию (которые должны быть корректными) — 115200, без четности, 1 бит — позволяют совершенно спокойно на нормальном компьютере с одним КОМ-портом обойтись без «Авто». При двух КОМах тоже сложностей нет.

Блютус на кассах — фантастика.

И расскажите мне, как программа должна угадать, какой из 2 подключенных фискальников ей положено использовать?


6 июля 2010

Я бы шёл не от минимальной, а от максимальной скорости, так как цель «найти максимальную работоспособную скорость» будет достигнута быстрее.

Ну и моё любимое. Не стоит забывать, что по какой-то причине номер порта уже подключённого устройства может измениться (например, Экс-пи решит перепутать номера при появлении нового порта в компьютере). В этом случае можно не пугать пользователя сообщением о том, что устройство отключено, а попробовать найти его заново. При этом желательно иметь какой-либо уникальный идентификатор кассы (почти уверен, что он есть) и при переподключении первым делом проверить его, чтобы убедиться, что поменялось не устройство.

Павел Малинников
6 июля 2010

Я работал с несколькими видами весов и кассовых аппаратов.

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

Ни на большей, ни на меньшей скорости порт не открывался.

Сергей Половинкин
6 июля 2010

Илья, вы не правы, когда говорите, что не нужно перебирать все скорости, а достаточно попробовать обменяться с аппаратом лишь на минимальной. Это что-то из области фантастики. Поймите, что устройство запрограммировано на какой-то скорости и я не могу с ним общаться на другой. В устройстве нет «интеллектуального поведения». Устройство не может само изменить скорость. Т. е. если в аппарате стоит 115200, то только на этой скорости оно будет отвечать.

Оригинал вопроса в моем ЖЖ (там со скриншотами): http://talla2k.livejournal.com/12944.html

Николай Юрченко
14 августа 2010

Даже если порт может работать только на одной конкретной скорости, а на всех других скоростях не работать, всё равно можно ускорить перебор в большинстве случаев, если знать какие скорости предпочитают кассовые аппараты — т. е. цикл перебора строить не от портов, а от скоростей и упорядочить скорости по встречаемости.

Ну и опять же непонятно, почему нельзя сразу запустить столько проверочных потоков, сколько портов?

Замечание выше о том, что делать, если нашлось более одного устройства, решается просто — надо выдать пользователю список найденных устройств, и он уже выберет из списка.


Цель рубрики — обсуждение вопросов дизайна всех видов, текста в дизайне и взаимоотношений дизайнеров с клиентами.

Мы публикуем комментарии, которые добавляют к уже сказанному новые мысли и хорошие примеры. Мы ожидаем, что такие комментарии составят около 20% от общего числа.

Решение о публикации принимается один раз; мы не имеем возможности комментировать или пересматривать свое решение, хотя оно может быть ошибочно. Уже опубликованные комментарии могут быть удалены через некоторое время, если без них обсуждение не становится менее ценным или интересным.

Вот такой веб 2.0.

Недавно всплыло

2 Как сделать плавный переход от общения с администратором к директору? 1 1 7