NET CF2, странно ведет себя COM порт
От: stanru1  
Дата: 25.06.07 11:10
Оценка:
Добрый день! Помогите, пожалуйста, разобраться, что я делаю не так!
Имеем: HP iPaq 1950; самолично спаянный кабель для iPaq`а на COM порт; принтер этикеток Зебра, тоже, как ни странно, с COM-портовым входом.
Кабель проверен с помощью внешнего модема — iPaq успешно звонит интернет-провайдеру и устанавливает соединение.
Работ с COM портом отлажена на эмуляторе.
Вот код:

SerialPort p = new SerialPort("COM1", 19200);
p.DataBits = 8;
p.Parity = Parity.None;
p.StopBits = StopBits.One;
p.Handshake = Handshake.None;
p.Encoding = Encoding.GetEncoding(1251);
p.WriteTimeout = 500;
p.ReadTimeout = 500;
try
{
p.Open();
}
catch (Exception ex)
{

}
p.Write("! 0 200 200 215 1\r\n");
// другие команды принтеру
p.Write("PRINT\r\n");
p.Close();
p.Dispose();


Эмулятор исправно посылает данные принтеру, который печатает этикетку.
Теперь о том, что происходит на живом КПК.

Программа 1 (ОДИН) раз печатает одну этикетку. После этого, хотя какие-то данные и отправляются в COM порт, принтер не печатает. Стоит программу закрыть и открыть заново — опять печатает только 1 этикетка.

Заранее спасибо за помощь!
Re: NET CF2, странно ведет себя COM порт
От: stanru1  
Дата: 26.06.07 08:57
Оценка:
Что делает с COM портами .NET при завершении .NET программы? Это бы решило мою проблему.. Пробовал искать Гуглом, Яндексом и пр. и пр. безрезультатно Пробовал (в коде это видно) руками уничтожать экземпляр класса SerialPort, но видимо что-то не до конца уничтожается. Очень не хочется пользоваться pInvoke и winapi вызовами для работы с этим портом...

Спасибо!
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: NET CF2, странно ведет себя COM порт
От: vepd  
Дата: 26.06.07 11:21
Оценка:
Здравствуйте, stanru1, Вы писали:

S>Добрый день! Помогите, пожалуйста, разобраться, что я делаю не так!

S>Имеем: HP iPaq 1950; самолично спаянный кабель для iPaq`а на COM порт; принтер этикеток Зебра, тоже, как ни странно, с COM-портовым входом.
S>Кабель проверен с помощью внешнего модема — iPaq успешно звонит интернет-провайдеру и устанавливает соединение.
S>Работ с COM портом отлажена на эмуляторе.
S>Вот код:

S>
S>SerialPort p = new SerialPort("COM1", 19200);
S>p.DataBits = 8;
S>p.Parity = Parity.None;
S>p.StopBits = StopBits.One;
S>p.Handshake = Handshake.None;
S>p.Encoding = Encoding.GetEncoding(1251);
S>p.WriteTimeout = 500;
S>p.ReadTimeout = 500;
S>try
S>{
S>p.Open();
S>}
S>catch (Exception ex)
S>{

S>}
S>p.Write("! 0 200 200 215 1\r\n");
S>// другие команды принтеру
S>p.Write("PRINT\r\n");
S>p.Close();
S>p.Dispose();
S>


S>Эмулятор исправно посылает данные принтеру, который печатает этикетку.

S>Теперь о том, что происходит на живом КПК.

S>Программа 1 (ОДИН) раз печатает одну этикетку. После этого, хотя какие-то данные и отправляются в COM порт, принтер не печатает. Стоит программу закрыть и открыть заново — опять печатает только 1 этикетка.


S>Заранее спасибо за помощь!


Может попробовать так

using(SerialPort p = new SerialPort("COM1", 19200))
{
  p.DataBits = 8;
  p.Parity = Parity.None;
  p.StopBits = StopBits.One;
  p.Handshake = Handshake.None;
  p.Encoding = Encoding.GetEncoding(1251);
  p.WriteTimeout = 500;
  p.ReadTimeout = 500;
  try
  {
     p.Open();
     p.Write("! 0 200 200 215 1\r\n");
     // другие команды принтеру
     p.Write("PRINT\r\n");
  }
  catch (Exception ex)
  {

  }
  finally
  {
     p.Close();
  }
}
Re[2]: NET CF2, странно ведет себя COM порт
От: stanru1  
Дата: 26.06.07 13:48
Оценка:
Здравствуйте, vepd, Вы писали:


V>Может попробовать так


V>
V>using(SerialPort p = new SerialPort("COM1", 19200))
V>{
V>  p.DataBits = 8;
V>  p.Parity = Parity.None;
V>  p.StopBits = StopBits.One;
V>  p.Handshake = Handshake.None;
V>  p.Encoding = Encoding.GetEncoding(1251);
V>  p.WriteTimeout = 500;
V>  p.ReadTimeout = 500;
V>  try
V>  {
V>     p.Open();
V>     p.Write("! 0 200 200 215 1\r\n");
V>     // другие команды принтеру
V>     p.Write("PRINT\r\n");
V>  }
V>  catch (Exception ex)
V>  {

V>  }
V>  finally
V>  {
V>     p.Close();
V>  }
V>}

V>


К сожалению, такой же результат, как и у меня.
Принтер позволяет сделать дамп — выходит, что почему-то не уходят в ком порт последние 2 строки с командами. На эмуляторе, подключенному к этому же принтеру, все работает.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: NET CF2, странно ведет себя COM порт
От: vepd  
Дата: 27.06.07 06:52
Оценка:
Здравствуйте, stanru1, Вы писали:

S>К сожалению, такой же результат, как и у меня.

S>Принтер позволяет сделать дамп — выходит, что почему-то не уходят в ком порт последние 2 строки с командами.

1. Что значит не уходят? p.Write генерит Exception? Если так, то тогда какой?
2. Может поиграть с Timeout-ами?
3. Еще я бы рекомендовал пользоваться функциями или Writeline() (для записи целой строки),
или Write(Byte[], Int32, Int32),
или Wtite(Char[], Int32, Int32)

хотя на вкус и цвет...
Re[4]: NET CF2, странно ведет себя COM порт
От: stanru1  
Дата: 27.06.07 09:28
Оценка:
Здравствуйте, 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 сек., а быстродействие критично...
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: NET CF2, странно ведет себя COM порт
От: MBo  
Дата: 28.06.07 03:52
Оценка:
Здравствуйте, stanru1, Вы писали:

S>Программа 1 (ОДИН) раз печатает одну этикетку. После этого, хотя какие-то данные и отправляются в COM порт, принтер не печатает. Стоит программу закрыть и открыть заново — опять печатает только 1 этикетка.


Я правильно понял, что объект компорта создается для печати каждой этикетки и уничтожается после этого?
Если да, то зачем?
Re[2]: NET CF2, странно ведет себя COM порт
От: stanru1  
Дата: 02.07.07 08:01
Оценка:
Здравствуйте, MBo, Вы писали:

MBo>Я правильно понял, что объект компорта создается для печати каждой этикетки и уничтожается после этого?

MBo>Если да, то зачем?

Это следствие экспериментов. В процессе отладки на живой машинке было установлено, что если не уничтожать объект СОМ порта, то принтер не печатает 2ю и более этикеток. Только одну. Если же закрыть программу и открыть ее заново, опять можно напечатать одну этикетку. Из чего был сделан вывод (т.к. при закрытии программы объект по любому уничтожается), что если объект уничтожить руками, он — теоретически — должен печатать этикетки каждый раз нормально. Однако теория с практикой разошлись
Все-таки, что же происходит с СОМ портом при закрытии программы и можно ли это повторить, не закрывая программу?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: NET CF2, странно ведет себя COM порт
От: g.kostik  
Дата: 03.07.07 17:30
Оценка:
Здравствуйте, stanru1.

Сдается мне драйвер COM порта на КПК HP iPaq реализован совсем не фонтан....и NET CF2 тут не причем
у меня проблема чуть другая — к КПК iPaq 2490 подключен девайс,он льет данные блоками, если размер блока >32 байт,то в определенный
момент я теряю пару байтиков из этого блока...а иногда все блоки доходят нормално — закономерность не выявил
Связываю это с тем, что размер буфера чтения 16 байт и увеличить его не получается

Мне кажется на другой машинке (не HP) твой код будет работать на ура.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.