[VB.NET] Smartdevice Printen HP H470

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Josvds
  • Registratie: November 2004
  • Laatst online: 26-08 20:42
Ik ben bezig met het printen vanaf een smart device naar een mobiele printer van HP.
Nu heeft deze printer een bluetooth verbinding met de PDA en werkt het vrijwel allemaal, echter een probleem waar ik mee zit is dat wanneer ik veel paginas print zijn buffer vol slipt.

Ik heb toen een handshake methode van VB.NET standaard gebruikt Handshake.RequestToSendXOnXOff en Handshake.XOnXOff, daarop reageerde de scanner dat hij wachten zolang de buffer weer ruimte heeft of de timeout is bereikt.

Echter print hij dan nog steeds de laatste paginas niet goed uit..
Heeft iemand hiervoor een goede methode?

Enkele details:

' Verbinding maken
tSerieleVerbinding = New SerialPort("COM9:")
tSerieleVerbinding.WriteTimeout = 30000
tSerieleVerbinding.Handshake = Handshake.RequestToSendXOnXOff
tSerieleVerbinding.Open()

' Pagina invullen & Nieuwe pagina beginnen
tSerieleVerbinding.Write(tPagina & ChrW(27) & ChrW(38) & ChrW(108) & ChrW(48) & ChrW(72))


http://www.hpprinter.nl/P...aspx?BidPartnumber=337990 staan de specs van de printer.
Drive, omvang buffer: 16 MB staat hier maar dat klopt niet volgens mij want het document is 9 paginas en stopt halverwege pagina 6. (TXT document)

Thanx.

[ Voor 32% gewijzigd door Josvds op 01-07-2010 15:31 ]


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Josvds schreef op donderdag 01 juli 2010 @ 15:28:
Ik ben bezig met het printen vanaf een smart device naar een mobiele printer van HP.
Nu heeft deze printer een bluetooth verbinding met de PDA en werkt het vrijwel allemaal, echter een probleem waar ik mee zit is dat wanneer ik veel paginas print zijn buffer vol slipt.
Dan zul je moeten kijken of er een manier is om te detecteren dat de buffer wel of niet vol is!
Ik heb toen een handshake methode van VB.NET standaard gebruikt Handshake.RequestToSendXOnXOff en Handshake.XOnXOff, daarop reageerde de scanner dat hij wachten zolang de buffer weer ruimte heeft of de timeout is bereikt.
De handshaking heeft alleen te maken met het seriele protocol, en niet met de printer zelf.
http://www.hpprinter.nl/P...aspx?BidPartnumber=337990 staan de specs van de printer.
Drive, omvang buffer: 16 MB staat hier maar dat klopt niet volgens mij want het document is 9 paginas en stopt halverwege pagina 6. (TXT document).
Je weet natuurlijk niet hoe de printer zijn buffer gebruikt. Dat jij er text heenstuurt zegt natuurlijk niks over de interne representatie in de printer. Voor hetzelfde geld representeert hij de pagina wel als bitmap, dan zit die 16 MB natuurlijk snel vol.

Ik zou eerst eens kijken of je kunt detecteren of en wanneer de buffer van de printer vol zit, dan kun je gewoon even pauzeren totdat er weer ruimte over is.

Verder loop je hier al wat langer rond dus je zou ondertussen moeten weten dat je code in [code] tags hoort te posten.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Josvds
  • Registratie: November 2004
  • Laatst online: 26-08 20:42
Thnx voor je reactie. Dat heb ik inderdaad ook bekeken maar ik krijg geen manier gevonden om het geheugen uit te lezen. Heb nu het volgende geprobeerd:

http://h20000.www2.hp.com...ual/bpl13210/bpl13210.pdf (Pagina 344)
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
tSerieleVerbinding.WriteLine(ChrW(27) & ChrW(27) & ChrW(115) & ChrW(49) & ChrW(77))
Me.wBtnSluiten.Visible = True
Application.DoEvents()
Dim test As String = Nothing
Dim nr As Integer = 0
Do While test = Nothing And nr < 20
   test = tSerieleVerbinding.ReadLine
   Thread.Sleep(1000)
   nr += 1
Loop
mLogboek(New Melding(Melding.EType.FOUT, "READER: " & test))

Hierbij loopt hij er telkens uit na die 20 seconden


en

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
mLogboek(New Melding(Melding.EType.FOUT, "STATE Handshake: " & tSerieleVerbinding.Handshake & vbCrLf & _
"STATE CtsHolding: " & tSerieleVerbinding.CtsHolding & vbCrLf & _
"STATE DsrHolding: " & tSerieleVerbinding.DsrHolding & vbCrLf & _
"STATE DtrEnable: " & tSerieleVerbinding.DtrEnable & vbCrLf & _
"STATE RtsEnable: " & tSerieleVerbinding.RtsEnable & vbCrLf & _
"STATE BytesToRead: " & tSerieleVerbinding.BytesToRead & vbCrLf & _
"STATE CDHolding: " & tSerieleVerbinding.CDHolding & vbCrLf & _
"STATE BreakState: " & tSerieleVerbinding.BreakState & vbCrLf & _
"STATE CanWrite: " & tSerieleVerbinding.BaseStream.CanWrite & vbCrLf))

Hier wordt bij elke loop hetzelfde weergegeven

[ Voor 18% gewijzigd door Josvds op 02-07-2010 09:16 ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Josvds schreef op vrijdag 02 juli 2010 @ 09:15:
Thnx voor je reactie. Dat heb ik inderdaad ook bekeken maar ik krijg geen manier gevonden om het geheugen uit te lezen.
Om-dat het totaal niet relevant is. Al stuur je maar 1 letter; je weet niet hoe je printer dat intern opslaat en for all you know heeft 'ie daar al (bij wijze van) 8 Mb voor nodig. Die 16Mb is pure marketingpraat. Sure, het geeft je wel een beetje een indicatie dat 'ie "X grote"-printtaken kan afhandelen maar daar heb je verder niet veel aan voor je probleem. Het zit dan ook niet in een buffer van je printer die overloopt/vol is maar elders. Of krijg je de, in de documentatie genoemde, "control panel error 20, memory overflow" ook?
Josvds schreef op vrijdag 02 juli 2010 @ 09:15:

Hier wordt bij elke loop hetzelfde weergegeven
Dat is de status van de (virtuele) COM pinnen; je zit véél te laag te enken. Status antwoorden van de printer lees je op stream niveau (je krijgt gewoon platte ASCII terug a-la "PCL<crlf>blablabla" etc.

Wat ik me afvraag: Kun je het printen niet veel beter overlaten aan het OS en dus je printtaak gewoon de printqueue induwen? Waarom rechtstreeks met de printer babbelen?

[ Voor 45% gewijzigd door RobIII op 02-07-2010 09:46 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Josvds
  • Registratie: November 2004
  • Laatst online: 26-08 20:42
Ik had op internet (http://h10010.www1.hp.com...63-81408829-81409423.html) gelezen dat deze HP H470 "HP PCL 3 enhanced" ondersteund. De pagina die ik voorheen had gevonden had betrekking op PCL 5.

Ik heb niets kunnen vinden over een printque in een WM5. Dat is de reden waarom ik het zoek in de seriele communicatie.

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Je zult dus moeten gaan kijken hoe "HP PCL 3 enhanced" werkt, en dat moeten implementeren.

Ik weet niet hoe het tegenwoordig staat, echter had je vroeger inderdaad geen native printer ondersteuning. Ik heb destijds gewoon een printer library gebruikt, waarmee ik de printer aan kon sturen ( Printboy of PrinterCE ).

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Josvds
  • Registratie: November 2004
  • Laatst online: 26-08 20:42
Ik ben bezig geweest afgelopen dagen met de printer, maar kom er niet uit heb verschillende commando`s geprobeerd. Het printen lukt me gewoon, maar informatie opvragen lukt me niet.
Ik kan een commando sturen dat de tekst onderstreept, maar een commando "[Esc]z" in hetzelfde document om een testpagina af te drukken werkt weer niet. Zo werken vele commando`s niet als bijvoorbeeld kopies afdrukken automatisch of opvragen van geheugen.

Ik heb ook naar HP gebeld maar zei zeggen dat ze geen ondersteuning geven als je nog niet in het bezit bent van 20+ printers. Dat er eventueel 20+ verkocht gaan worden doet er niet toe, je moet ze al hebben. Dat doen we niet wanneer we niet weten of dat de printers voor onze doel einden geschikt zijn.

Kan iemand me toevallig vertellen of dat PCL5 ook voor PCL3 werkt? Commando`s als opvragen status, etc.
Werken, met PCL3, de PJL commando`s ook of werkt dat niet?
Ik kom er namelijk niet uit.

Thnx.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Heb je uberhaupt bidirectionele communicatie of zit er een el-cheapo printserver oid tussen?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Ik neem aan dat hij via Bluetooth naar de printer verbind, aangezien hij gebruik maakt van een virtuele COM poort. Maar dan nog is het interessant om te weten of je uberhaupt wel informatie terug krijgt van de printer. Anders kan het ook aan de communicatie liggen.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Woy schreef op dinsdag 06 juli 2010 @ 12:57:
Ik neem aan dat hij via Bluetooth naar de printer verbind, aangezien hij gebruik maakt van een virtuele COM poort.
Een virtuele com-poort kan, AFAIK, met whatever verbonden zijn. Dat kan BT zijn maar ook ethernet of tamtam :P Vaak wordt die virtuele COM constructie gebruikt voor (bijv.) compatibiliteit met legacy DOS applicaties e.d.
Woy schreef op dinsdag 06 juli 2010 @ 12:57:
Maar dan nog is het interessant om te weten of je uberhaupt wel informatie terug krijgt van de printer. Anders kan het ook aan de communicatie liggen.
Dat was de strekking idd

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
RobIII schreef op dinsdag 06 juli 2010 @ 13:16:
[...]
Een virtuele com-poort kan, AFAIK, met whatever verbonden zijn. Dat kan BT zijn maar ook ethernet of tamtam :P Vaak wordt die virtuele COM constructie gebruikt voor (bijv.) compatibiliteit met legacy DOS applicaties e.d.
offtopic:
Natuurlijk kan dat ;), maar getuige de text uit de TS
[quote]
Nu heeft deze printer een bluetooth verbinding met de PDA en werkt het vrijwel allemaal
[/]
Is het een BT verbinding die via de virtuele COM poort aangesproken word ;)

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Josvds
  • Registratie: November 2004
  • Laatst online: 26-08 20:42
Woy schreef op dinsdag 06 juli 2010 @ 12:57:
Ik neem aan dat hij via Bluetooth naar de printer verbind, aangezien hij gebruik maakt van een virtuele COM poort. Maar dan nog is het interessant om te weten of je uberhaupt wel informatie terug krijgt van de printer. Anders kan het ook aan de communicatie liggen.
Ik zocht idd naar een commando waarmee ik enige informatie terug kon krijgen. Want ik weet namelijk ook niet of ik iets terug kan krijgen. Heb daarom d.mv. PJL en PCL geprobeerd informatie op te halen maar zonder resultaat. Hebben jullie een commando toevallig dat zeker moet werken zodat ik idd weet of ik uberhaut response krijg?

En idd het is seriele communicatie over Bluetooth

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
http://h20000.www2.hp.com...ual/bpl13210/bpl13210.pdf

Je zou het echo command uit hoofdstuk 16 kunnen proberen.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Josvds
  • Registratie: November 2004
  • Laatst online: 26-08 20:42
Tenzij ik iets verkeerd doe krijg ik geen resultaat:

Visual Basic .NET:
1
2
3
4
5
Dim tPoortVerb As New SerialPort("COM" & iPoort & ":")
tPoortVerb.Open()
tPoortVerb.WriteLine(Chr(27) & "*s9X" & Chr(13) & Chr(10))
Threading.Thread.Sleep(5000)
Me.writeLog(tPoortVerb.ReadExisting)

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Buiten het feit dat ik niet snap waarom je de ":" aan je poortname toevoegt, en waarom je WriteLine doet en dan ook nog eens Chr(13) en Chr(10) schrijft zie ik niet wat er verkeerd aan is.

Ik weet niet wat voor instellingen de virtuele com-port verwacht. Ik verwacht dat de Baudrate e.d. er niet echt toe doen, maar zeker weten doe ik dat niet.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Josvds
  • Registratie: November 2004
  • Laatst online: 26-08 20:42
Woy schreef op dinsdag 06 juli 2010 @ 15:12:
Buiten het feit dat ik niet snap waarom je de ":" aan je poortname toevoegt, en waarom je WriteLine doet en dan ook nog eens Chr(13) en Chr(10) schrijft zie ik niet wat er verkeerd aan is.

Ik weet niet wat voor instellingen de virtuele com-port verwacht. Ik verwacht dat de Baudrate e.d. er niet echt toe doen, maar zeker weten doe ik dat niet.
Volgens een forum gebruiker hier is het niet mogelijk.
http://forums.itrc.hp.com...nswer.do?threadId=1437991

Echter snap ik niet waarom print tools als printboy en printce het wel kunnen.
We willen dit zelf kunnen begrijpen en onderhouden.

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Ik zie, buiten jou om, niemand in die thread beweren dat het niet mogelijk is. De enige opmerking die er staat is dat het geen PCL 5, maar PCL 3 enhanced is. Je zult dus op zoek moeten naar de specs van PCL 3 enhanced, of op zijn minst PCL 3 ( Ik neem aan dat "enhanced" een superset van PCL3 is ).

Al lijkt me het echo command typisch een commando wat ook al in PCL3 zou zitten, maar dat weet ik niet zeker.
Josvds schreef op woensdag 07 juli 2010 @ 09:52:
[...]
Echter snap ik niet waarom print tools als printboy en printce het wel kunnen.
We willen dit zelf kunnen begrijpen en onderhouden.
Dan zou ik als ik jou was eens proberen om een sniffer te zoeken die het verkeer van die applicaties kunnen beluisteren. Dan kun je gewoon kijken wat die versturen/ontvangen.

[ Voor 24% gewijzigd door Woy op 07-07-2010 13:16 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Josvds
  • Registratie: November 2004
  • Laatst online: 26-08 20:42
Ik had gisteren gekeken naar PrintCE, die doet het wel goed dus het is mogelijk. Al gebruikte deze een andere lettertype en ging daardoor onze opmaak er aan maar dat is niet het punt. Je zag de hoeveelheid bytes aftellen.

Nu dacht ik zou dat schelen als ik per byte zend i.p.v. per regel. Dus ik dat uitgeprobeerd en had daarbij de timeout op 60 seconden staan. Het werkte wel, echter werdt aan het eind van de laatste pagina nog wat vergooid omdat de timeout optreden.

Nu dacht ik, kan ik het dan niet oplossen door de timeout zelf af te vangen en dan zo lang door een loop te lopen tot de byte wel verzonden is. Echter verdwijnd de inhoud vanaf dat moment gelijk. Ik weet niet of ik nu iets verkeerd doe, of mijn beredenering onlogisch is.

De onderstaande code voer ik per pagina uit. Dus ik lees een bestand uit, splits deze op form-feed. Doorloop vervolgens elke pagina tenzij enkel één pagina moet worden afgedrukt.

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
' Verbinding maken
Dim tVerbinding As New SerialPort("COM" & tSerielePoort, 57600, Parity.Even, 8, StopBits.One)
tVerbinding.Handshake = Handshake.XOnXOff
tVerbinding.WriteTimeout = 10000
tVerbinding.Open()

' Printer resetten + A4 standaard instellen
tVerbinding.WriteLine(ChrW(27) & ChrW(69)) ' Reset ([Ec]E)
tVerbinding.WriteLine(ChrW(27) & ChrW(38) & ChrW(108) & ChrW(50) & ChrW(54) & ChrW(65)) ' A4 ([Ec]&l6A)

' Pagina naar bytes omzetten
tPagina.Trim(ChrW(12)) ' Verwijder alle form-feed karakters
Dim tBytes() As Byte = Encoding.ASCII.GetBytes(tPagina)

' Pagina verzenden
For i As Integer = 0 To tBytes.Length - 1

' Variable
Dim tPoging As Integer = 0
Dim tVoltooid As Boolean = False

' Verzenden tot het gelukt is
Do Until tVoltooid = True
  Try
    ' Verzenden van gegevens
    tVerbinding.BaseStream.WriteByte(tBytes(i))

    ' Voltooid
    tVoltooid = True
    Catch ex As Exception

    ' Poging ophogen
    tPoging += 1

    ' Poging updaten
    wStatusbalk.Text = "Poging " & tPoging & "/10"
    wStatusbalk.Update()

    ' Als het de 10e poging is
    If tPoging = 10 Then
      Throw ex
    End If
  End Try
Loop
Next

' Formfeed verzenden
tVerbinding.BaseStream.WriteByte(AscW(ChrW(12))) ' Form-feed aan het eind toevoegen

' Verwerken
tVerbinding.BaseStream.Flush()

Acties:
  • 0 Henk 'm!

  • Josvds
  • Registratie: November 2004
  • Laatst online: 26-08 20:42
Dit probleem is opgelost, ik kwam er achter dat als ik aan het printen ben en vervolgens de verbinding verbreek. Dat de printer hier de mist in gaat. Nu heb ik een printer functie die op de achtergrond draait nadat deze de eerste keer gestart wordt. De verbinding blijft open tot de volgende aanroep.

Het probleem waar ik echter nog mee zit is dat wanneer ik de printer uit zet onder het printen dat de serialport met zijn handshake nog niets merkt.
Pagina: 1