Добрый день! Помогите, пожалуйста, разобраться, что я делаю не так!
Имеем: HP iPaq 1950; самолично спаянный кабель для iPaq`а на COM порт; принтер этикеток Зебра, тоже, как ни странно, с COM-портовым входом.
Кабель проверен с помощью внешнего модема — iPaq успешно звонит интернет-провайдеру и устанавливает соединение.
Работ с COM портом отлажена на эмуляторе.
Вот код:
Эмулятор исправно посылает данные принтеру, который печатает этикетку.
Теперь о том, что происходит на живом КПК.
Программа 1 (ОДИН) раз печатает одну этикетку. После этого, хотя какие-то данные и отправляются в COM порт, принтер не печатает. Стоит программу закрыть и открыть заново — опять печатает только 1 этикетка.
Что делает с COM портами .NET при завершении .NET программы? Это бы решило мою проблему.. Пробовал искать Гуглом, Яндексом и пр. и пр. безрезультатно Пробовал (в коде это видно) руками уничтожать экземпляр класса SerialPort, но видимо что-то не до конца уничтожается. Очень не хочется пользоваться pInvoke и winapi вызовами для работы с этим портом...
Здравствуйте, stanru1, Вы писали:
S>Добрый день! Помогите, пожалуйста, разобраться, что я делаю не так! S>Имеем: HP iPaq 1950; самолично спаянный кабель для iPaq`а на COM порт; принтер этикеток Зебра, тоже, как ни странно, с COM-портовым входом. S>Кабель проверен с помощью внешнего модема — iPaq успешно звонит интернет-провайдеру и устанавливает соединение. S>Работ с COM портом отлажена на эмуляторе. S>Вот код:
S>
S>Эмулятор исправно посылает данные принтеру, который печатает этикетку. S>Теперь о том, что происходит на живом КПК.
S>Программа 1 (ОДИН) раз печатает одну этикетку. После этого, хотя какие-то данные и отправляются в COM порт, принтер не печатает. Стоит программу закрыть и открыть заново — опять печатает только 1 этикетка.
S>Заранее спасибо за помощь!
К сожалению, такой же результат, как и у меня.
Принтер позволяет сделать дамп — выходит, что почему-то не уходят в ком порт последние 2 строки с командами. На эмуляторе, подключенному к этому же принтеру, все работает.
Здравствуйте, stanru1, Вы писали:
S>К сожалению, такой же результат, как и у меня. S>Принтер позволяет сделать дамп — выходит, что почему-то не уходят в ком порт последние 2 строки с командами.
1. Что значит не уходят? p.Write генерит Exception? Если так, то тогда какой?
2. Может поиграть с Timeout-ами?
3. Еще я бы рекомендовал пользоваться функциями или Writeline() (для записи целой строки),
или Write(Byte[], Int32, Int32),
или Wtite(Char[], Int32, Int32)
Здравствуйте, vepd, Вы писали:
V>1. Что значит не уходят? p.Write генерит Exception? Если так, то тогда какой? V>2. Может поиграть с Timeout-ами? V>3. Еще я бы рекомендовал пользоваться функциями или Writeline() (для записи целой строки), V>или Write(Byte[], Int32, Int32), V>или Wtite(Char[], Int32, Int32)
V>хотя на вкус и цвет...
Пробовал и WriteLine, мне показалось не принципиальным, что использовать.
Write() не генерит экзепшена, с точки зрения программы на КПК данные нормально уходят в порт. Спасибо за совет с таймаутами, попробую с ними провести эксперимент
Однако же все равно не понятно, почему первая этикетка всегда печатается?
На данный момент единственное придуманное мной (правда, кривое) решение — коснольная утилита, которой в кач. параметра передаются код товара. Т.к. консольная утилита запускается каждый раз заново при печати очередного штрих-кода, принтер нормально печатает этикетки. Но из-за того, что это .NET, консольное приложение запускается 2 сек., а быстродействие критично...
Здравствуйте, stanru1, Вы писали:
S>Программа 1 (ОДИН) раз печатает одну этикетку. После этого, хотя какие-то данные и отправляются в COM порт, принтер не печатает. Стоит программу закрыть и открыть заново — опять печатает только 1 этикетка.
Я правильно понял, что объект компорта создается для печати каждой этикетки и уничтожается после этого?
Если да, то зачем?
Здравствуйте, MBo, Вы писали:
MBo>Я правильно понял, что объект компорта создается для печати каждой этикетки и уничтожается после этого? MBo>Если да, то зачем?
Это следствие экспериментов. В процессе отладки на живой машинке было установлено, что если не уничтожать объект СОМ порта, то принтер не печатает 2ю и более этикеток. Только одну. Если же закрыть программу и открыть ее заново, опять можно напечатать одну этикетку. Из чего был сделан вывод (т.к. при закрытии программы объект по любому уничтожается), что если объект уничтожить руками, он — теоретически — должен печатать этикетки каждый раз нормально. Однако теория с практикой разошлись
Все-таки, что же происходит с СОМ портом при закрытии программы и можно ли это повторить, не закрывая программу?
Сдается мне драйвер COM порта на КПК HP iPaq реализован совсем не фонтан....и NET CF2 тут не причем
у меня проблема чуть другая — к КПК iPaq 2490 подключен девайс,он льет данные блоками, если размер блока >32 байт,то в определенный
момент я теряю пару байтиков из этого блока...а иногда все блоки доходят нормално — закономерность не выявил
Связываю это с тем, что размер буфера чтения 16 байт и увеличить его не получается
Мне кажется на другой машинке (не HP) твой код будет работать на ура.