Seite 2 von 2

Re: bondrucker epson tm-t88v

Verfasst: 16.12.2015 01:35
von 5mware
klingt nicht schlecht, kannst du mir das etwas anschaulicher erklären?

ich habe jetzt zwei tage um die ohren gehauen und mich durch die dokumentation von epson durchgearbeitet und habe das ganze auch zum laufen gebracht, auch wenn nicht wirklich so, wie ich es wollte.

nun ja, entweder ich bin blöd oder die epson doku ist richtig schlecht dokumentiert und ich gehe davon aus das irgendwie die verschiedenen befehle in einer bestimmten wahrscheinlich kombination wirksam werden.

auf jeden fall haben die meisten befehle, egal wie ich es hin und her gedreht habe, nicht funktioniert. nicht mal die, die angeblich für diesen drucker sind. ich habe es immerhin hinbekommen, die schrift in verschiedenen varianten sauber dazustellen und habe linksbündigkeit, rechtsbündig und zentrierung manuell per funktion programmiert.

es läuft jetzt. dein ansatz ist cool, würde ich gerne machen. und wenn ich wüste wie ich die scheiß befehle wirksam machen kann, würde ich wohl besser resultate erzielen. aber ohne konkrete beispiele die funktionieren, fehlt mir jetzt der letzte nerv.

Code: Alles auswählen

Enumeration
  #schrift_normal
  #schrift_winzig
  #schrift_dick_klein
  #schrift_dick_gross
  #schrift_dick_linie
  ; ***
  #schrift_linksbundig
  #schrift_zentriert
  #schrift_rechtsbundig
  #schrift_teilen
EndEnumeration

Global  Dim schrift.s(16)

Procedure.s bon_tabs( schriftg.a, zeichenfolge.s, len1.l = 10, len2.l = 0, len3.l = 10 )

  Define tt.s = "", text.s = "", textstrom.s = zeichenfolge
  Define sc.s = "", zm.w = 0

  textstrom = ReplaceString( textstrom, "Ü", "U" )
  textstrom = ReplaceString( textstrom, "ü", "u" )
  textstrom = ReplaceString( textstrom, "Ö", "O" )
  textstrom = ReplaceString( textstrom, "ö", "o" )
  textstrom = ReplaceString( textstrom, "Ä", "A" )
  textstrom = ReplaceString( textstrom, "ä", "a" )
  textstrom = ReplaceString( textstrom, "ß", "ss" )
  textstrom + Chr(9)

  Select schriftg
    Case #schrift_normal
      sc = Chr($1B) + "!" + Chr(32)
      zm = Len("EEeeFFggHHhhJiJiKKllWwWWW  QWA")
    Case #schrift_winzig
      sc = Chr($1B) + "!" + Chr(145)
      zm = Len("DDDWDDDADDDQDDDWDDDdDDDEdddFDDDmDDDHDDDTDDD  DDxDDDWWwwPDDDA")
    Case #schrift_dick_klein
      sc = Chr($1B) + "!" + Chr(24)
      zm = Len("DDDWDDDADDDQDDDWDDDdDDDEdddFDDDmDDDHDDDTDDD  DDxDDDWWwwPDDDD")
    Case #schrift_dick_gross
      sc = Chr($1B) + "!" + Chr(40)
      zm = Len("FFddQQeWEWPORTZTR  RTFERFay039")
    Case #schrift_dick_linie
      sc = Chr($1B) + "!" + Chr(177)
      zm = Len("FFddQQeWEWPORTZTR  RTFERFay039nk ERG")
  EndSelect

  Define z1.s = "", z2.s = "", z3.s = "", zz.a = 0

  For p = 1 To Len(textstrom)
    Select Mid( textstrom, p, 1 )
      Case Chr(9)
        zz + 1
      Default
        Select zz
          Case 0 : z1 + Mid( textstrom, p, 1 )
          Case 1 : z2 + Mid( textstrom, p, 1 )
          Case 2 : z3 + Mid( textstrom, p, 1 )
        EndSelect
    EndSelect
  Next

  Select len1
    Case 0 ; Nix tun, so belassen wie es ist
    Default
      If Len(z1) > len1
        z1 = Mid( z1, 1, len1 )
      ElseIf Len(z1) < len1
        zr = len1 - Len(z1)
        ; ***
        For g = 1 To zr
          z1 + " "
        Next
      EndIf
  EndSelect

  Select len2
    Case 0 ; Nix tun, so belassen wie es ist
    Default
      If Len(z2) > len2
        z2 = Mid( z2, 1, len2 )
      ElseIf Len(z2) < len2
        zr = len2 - Len(z2)
        ; ***
        For g = 1 To zr
          z2 + " "
        Next
      EndIf
  EndSelect

  Select len3
    Case 0 ; Nix tun, so belassen wie es ist
    Default
      ;If Len(z3) > len3
      ;  z3 = Mid( z3, 1, len3 )
      ;ElseIf Len(z3) < len3
      ;  zr = len3 - Len(z3)
      ;  ; ***
      ;  For g = 1 To zr
      ;    z3 + " "
      ;  Next
      ;EndIf
  EndSelect
  z3 = Trim(z3)
  len3 = Len(z3)

  cc = zm - Len(z1) - Len(z2) - Len(z3) - 4 ; Die vier um jeweils 2 Leerzeichen zwicshen den Feldern zu legen

  If cc = 0
    ProcedureReturn sc + z1 + "  " + z2 + "  " + z3 + Chr(10)
  ElseIf cc > 0
    text + z1 + " " +  z2
    ; ***
    cc = zm - Len(z1) - Len(z2) - 2 - Len(z3)
    ; ***
    For p = 1 To cc
      text + " "
    Next
    ; ***
    text + " " + z3
    ; ***
    ProcedureReturn sc + text + Chr(10)
  ElseIf cc < 0
    If len1 = 0
      For p = 1 To Len(z1)
        cc = Len(Mid( z1, 1, p ) + "  " + z2 + "  " + z3) - zm
        ; ***
        If cc = 1
          text + sc + Trim(Mid( z1, 1, p )) + "  " + z2 + "  " + z3 + Chr(10)
          text + sc + Trim(Mid( z1, p + 1 )) + Chr(10)
          ; ***
          Break
        EndIf
      Next
    ElseIf len2 = 0
      For p = 1 To Len(z2)
        cc = Len(z1 + "  " + Mid( z2, 1, p ) + z3) - zm
        ; ***
        If cc = 0
          text + sc
          ; ***
          tt = Trim(z1 + " " + Trim(Mid( z2, 1, p - 1 )))
          ; ***
          If Len(tt) + Len(z3) + Len("  ") < zm
            For g = 1 To zm - (Len(tt) + Len(z3) + Len("  "))
              tt + " "
            Next
          EndIf
          ; ***
          text + tt + "  " + z3
          ; ***
          text + Chr(10) + sc
          ; ***
          For g = 1 To Len(z1)
            text + " "
          Next
          ; ***
          text + " "
          text + Trim(Mid( z2, p )) + Chr(10)
          ; ***
          Break
        EndIf
      Next
    EndIf
    ; ***
    ProcedureReturn text
  EndIf

EndProcedure

Procedure.s bon_text( schriftg.a, zeichenfolge.s, ausrichtung.a = #schrift_linksbundig )

  Define tt.s = "", text.s = "", textstrom.s = zeichenfolge
  Define sc.s = "", zm.w = 0

  textstrom = ReplaceString( textstrom, "Ü", "U" )
  textstrom = ReplaceString( textstrom, "ü", "u" )
  textstrom = ReplaceString( textstrom, "Ö", "O" )
  textstrom = ReplaceString( textstrom, "ö", "o" )
  textstrom = ReplaceString( textstrom, "Ä", "A" )
  textstrom = ReplaceString( textstrom, "ä", "a" )
  textstrom = ReplaceString( textstrom, "ß", "ss" )

  Select schriftg
    Case #schrift_normal
      sc = Chr($1B) + "!" + Chr(32)
      zm = Len("EEeeFFggHHhhJiJiKKllWwWWW  QWA")
    Case #schrift_winzig
      sc = Chr($1B) + "!" + Chr(145)
      zm = Len("DDDWDDDADDDQDDDWDDDdDDDEdddFDDDmDDDHDDDTDDD  DDxDDDWWwwPDDDA")
    Case #schrift_dick_klein
      sc = Chr($1B) + "!" + Chr(24)
      zm = Len("DDDWDDDADDDQDDDWDDDdDDDEdddFDDDmDDDHDDDTDDD  DDxDDDWWwwPDDDD")
    Case #schrift_dick_gross
      sc = Chr($1B) + "!" + Chr(40)
      zm = Len("FFddQQeWEWPORTZTR  RTFERFay039")
    Case #schrift_dick_linie
      sc = Chr($1B) + "!" + Chr(177)
      zm = Len("FFddQQeWEWPORTZTR  RTFERFay039nk ERG")
  EndSelect

  Select Mid( textstrom, 1, 1 )
    Case "\"
      For p = 1 To zm
        Select Mid( textstrom, 2, 1 )
          Case "-" : text + "-"
          Case "_" : text + "_"
          Case "=" : text + "="
          Case "#" : text + "#"
          Case "*" : text + "*"
          Case "+" : text + "+"
          Case "~" : text + "~"
        EndSelect
      Next
    Default
      Select ausrichtung
        Case #schrift_teilen
          lf$ = "" : rg$ = "" : ca.a = 0
          ; ***
          For p = 1 To Len(textstrom)
            If Mid( textstrom, p, 1 ) = Chr(9)
              Break
            EndIf
            ; ***
            lf$ + Mid( textstrom, p, 1 )
          Next
          ; ***
          For p = 1 To Len(textstrom)
            If ca = 1
              rg$ + Mid( textstrom, p, 1 )
            EndIf
            ; ***
            If Mid( textstrom, p, 1 ) = Chr(9)
              ca = 1
            EndIf
          Next
          ; ***
          lf$ = Trim(lf$)
          rg$ = Trim(rg$)
          ; ***
          ll = zm - Len(lf$) - Len(rg$)
          ; ***
          text + lf$
          ; ***
          For p = 1 To ll
            text + " "
          Next
          ; ***
          text + rg$
        Case #schrift_linksbundig
          text = textstrom
        Case #schrift_zentriert
          ll = Len(textstrom)
          ; ***
          cc = zm - ll
          ; ***
          If cc <= 1
            text = textstrom
          Else
            cc / 2
            ; ***
            If cc <= 0
              text = textstrom
            Else
              For m = 1 To cc
                text + " "
              Next
              ; ***
              text + textstrom
            EndIf
          EndIf
        Case #schrift_rechtsbundig
          ll = Len(textstrom)
          ; ***
          zm - ll
          ; ***
          If zm <= 0
            text = textstrom
          Else
            For m = 1 To zm
              text + " "
            Next
            ; ***
            text + textstrom
          EndIf
      EndSelect
  EndSelect

  tt = sc + text + Chr(10)

  ProcedureReturn tt

EndProcedure

Procedure.s bon_sprung(sprungMenge.a = 1)
  Define tt.s
  ; ***
  For p = 1 To sprungMenge
    tt + Chr($1B) + "!" + Chr(32) + Chr(9) + Chr(10)
  Next
  ; ***
  ProcedureReturn tt
EndProcedure

Procedure   bon_datei( dateiNummer.l, strom.s )
  WriteString( dateiNummer, strom, #PB_Ascii )
EndProcedure

Procedure drucken_bon()

  Define bonjob.s = ""

  bonjob = "C:\temp\bonjob.bin"
  ; ***
  If FileSize( bonjob ) > 0
    DeleteFile( bonjob )
  EndIf
  ; ***
  bonid = CreateFile( #PB_Any, bonjob )
  ; ***
  If bonid
    WriteString( bonid, Chr(27) + Chr(97) + Chr(1), #PB_Ascii )
    WriteString( bonid, Chr(27) + Chr(83) + Chr(10), #PB_Ascii )
    ; ***
    bon_datei( bonid, bon_text( #schrift_normal, "\-" ) )
    bon_datei( bonid, bon_text( #schrift_normal, "Linksbündiger Text", #schrift_linksbundig ) )
    bon_datei( bonid, bon_text( #schrift_normal, "\+" ) )
    bon_datei( bonid, bon_text( #schrift_normal, "Zentrierter Text", #schrift_zentriert ) )
    bon_datei( bonid, bon_text( #schrift_normal, "\=" ) )
    bon_datei( bonid, bon_text( #schrift_normal, "Rechtsbündiger Text", #schrift_rechtsbundig ) )
    bon_datei( bonid, bon_text( #schrift_normal, "\~" ) )
    bon_datei( bonid, bon_text( #schrift_normal, "Artikel" + Chr(9) + "Preis", #schrift_teilen ) )
    bon_datei( bonid, bon_text( #schrift_normal, "\+" ) )
    bon_datei( bonid, bon_text( #schrift_dick_gross, "Beispiel", #schrift_zentriert ) )
    bon_datei( bonid, bon_text( #schrift_normal, "\#" ) )
    bon_datei( bonid, bon_sprung(2) )
    bon_datei( bonid, bon_text( #schrift_dick_klein, "Alles wird gut", #schrift_zentriert ) )
    bon_datei( bonid, bon_sprung(2) )
    bon_datei( bonid, bon_text( #schrift_normal, "\_" ) )
    bon_datei( bonid, bon_tabs( #schrift_dick_gross, "Pos" + Chr(9) + "Artikel" + Chr(9) + "Preis", 4, 0, 0 ) )
    bon_datei( bonid, bon_tabs( #schrift_normal, "1" + Chr(9) + "Bügelmappe mit Extras und Handschuhe und Besen" + Chr(9) + "1,25", 4, 0, 0 ) )
    bon_datei( bonid, bon_tabs( #schrift_normal, "2" + Chr(9) + "Planam Highline Hose" + Chr(9) + "39,25", 4, 0, 0 ) )
    bon_datei( bonid, bon_tabs( #schrift_normal, "3" + Chr(9) + "BP Latzhose" + Chr(9) + "22,90", 4, 0, 0 ) )
    bon_datei( bonid, bon_tabs( #schrift_normal, "4" + Chr(9) + "Schere" + Chr(9) + "43,45", 4, 0, 0 ) )
    bon_datei( bonid, bon_sprung(3) )
    ; ***
    CloseFile(bonid)
    ; ***
    RunProgram( "DOSPrinter.exe", "C:\temp\bonjob.bin", "" )
  EndIf

EndProcedure

drucken_bon()

Re: bondrucker epson tm-t88v

Verfasst: 16.12.2015 14:17
von hoerbie
Hi,

ich weiß nicht, ob Du mich meintest, ich stelle hier einfach mal zwei Testprogramme rein, die beide mit einem TM88V funktionieren:

1. Serieller Port:

Code: Alles auswählen

Global *druckpuffer = AllocateMemory(1024)

ConnectionID = OpenSerialPort(#PB_Any, "COM1", 19200, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_RtsCtsHandshake, 1024, 1024)
If ConnectionID
  druckpos = 0
  
  PokeS(*druckpuffer+druckpos,Chr(27) + Chr(64),2,#PB_Ascii | #PB_String_NoZero) ; Reset Printer
  druckpos + 2
  PokeS(*druckpuffer+druckpos,Chr(27) + Chr(116) + Chr(45),3,#PB_Ascii | #PB_String_NoZero) ; Umlaute deutscher Zeichensatz
  druckpos + 3
  
  PokeS(*druckpuffer+druckpos,"Hallo äöüßÄÖÜ, wie gehts?" + Chr(13) + Chr(10),27,#PB_Ascii | #PB_String_NoZero) ; Text ausgeben
  druckpos + 27
  
  PokeS(*druckpuffer+druckpos,Chr(27)+Chr(45)+Chr(49),3,#PB_Ascii | #PB_String_NoZero) ; Unterstreichen an
  druckpos + 3
  PokeS(*druckpuffer+druckpos,"Hallo äöüßÄÖÜ, wie gehts?" + Chr(13) + Chr(10),27,#PB_Ascii | #PB_String_NoZero) ; Text ausgeben
  druckpos + 27
  PokeS(*druckpuffer+druckpos,Chr(27)+Chr(45)+Chr(48),3,#PB_Ascii | #PB_String_NoZero) ; Unterstreichen aus
  druckpos + 3
  PokeS(*druckpuffer+druckpos,Chr(13)+Chr(10)+Chr(13)+Chr(10)+Chr(13)+Chr(10)+Chr(13)+Chr(10)+Chr(13)+Chr(10),10,#PB_Ascii | #PB_String_NoZero) ; Papier vorschieben
  druckpos + 10
  PokeS(*druckpuffer+druckpos,Chr(29) + Chr(86) + Chr(1),3,#PB_Ascii | #PB_String_NoZero) ; Papier abschneiden
  druckpos + 3
  
  WriteSerialPortData(ConnectionID, *druckpuffer, druckpos)
  CloseSerialPort(ConnectionID)
Else
  MessageRequester("PureBasic - Client", "Can't find the Serial Port.", 0)
EndIf
2. Ethernet Port:

Code: Alles auswählen

Global *druckpuffer = AllocateMemory(65536)

If InitNetwork() = 0
  MessageRequester("Error", "Can't initialize the network !", 0)
Else
  ConnectionID = OpenNetworkConnection("192.168.1.15", 9100, #PB_Network_TCP)
  If ConnectionID
    druckpos = 0
    
    PokeS(*druckpuffer+druckpos,Chr(27) + Chr(64),2,#PB_Ascii | #PB_String_NoZero) ; Reset Printer
    druckpos + 2
    PokeS(*druckpuffer+druckpos,Chr(27) + Chr(116) + Chr(45),3,#PB_Ascii | #PB_String_NoZero) ; Umlaute deutscher Zeichensatz
    druckpos + 3
    
    PokeS(*druckpuffer+druckpos,"Hallo äöüßÄÖÜ, wie gehts?" + Chr(13) + Chr(10),27,#PB_Ascii | #PB_String_NoZero) ; Text ausgeben
    druckpos + 27
    
    PokeS(*druckpuffer+druckpos,Chr(27)+Chr(45)+Chr(49),3,#PB_Ascii | #PB_String_NoZero) ; Unterstreichen an
    druckpos + 3
    PokeS(*druckpuffer+druckpos,"Hallo äöüßÄÖÜ, wie gehts?" + Chr(13) + Chr(10),27,#PB_Ascii | #PB_String_NoZero) ; Text ausgeben
    druckpos + 27
    PokeS(*druckpuffer+druckpos,Chr(27)+Chr(45)+Chr(48),3,#PB_Ascii | #PB_String_NoZero) ; Unterstreichen aus
    druckpos + 3
    PokeS(*druckpuffer+druckpos,Chr(13)+Chr(10)+Chr(13)+Chr(10)+Chr(13)+Chr(10)+Chr(13)+Chr(10)+Chr(13)+Chr(10),10,#PB_Ascii | #PB_String_NoZero) ; Papier vorschieben
    druckpos + 10
    PokeS(*druckpuffer+druckpos,Chr(29) + Chr(86) + Chr(1),3,#PB_Ascii | #PB_String_NoZero) ; Papier abschneiden
    druckpos + 3
    
    SendNetworkData(ConnectionID, *druckpuffer, druckpos)
    CloseNetworkConnection(ConnectionID)
  Else
    MessageRequester("PureBasic - Client", "Can't find the server (Is it launched ?).", 0)
  EndIf
EndIf
So habe ich mal angefangen, das Ding direkt anzusteuern. Zur Sicherheit sollte man dann bei der Ausgabe die Anzahl der gesendetes Bytes kontrollieren, ggfls. einen SerialPortError abfangen.
Ferner bitte berücksichtigen, daß Du per Tcp/IP direkt in einem Rutsch bis zu 65536 Bytes schicken kannst, an einer serielle Schnittstelle aber nur die vorher definierte Puffergrösse, wenn Du über 1KB gehst, also bitte gestückelt senden. Ich mache es bei seriell meist so, daß ich eine Zeile komplett inklusive aller ihrer Steuerzeichen auf einmal schicke, umso schneller bemerkt man dann auch, wenn der Drucker hakt.
Bitte beachte auch, daß mit dem von mir eingestellten Zeichensatz auch Umlaute korrekt gedruckt werden, es besteht also kein Grund, diese umzuwandeln. (Diesen Zeichensatz kennen ältere Epson-Modelle aber unter Umständen noch nicht.)

Den VirtualComPort-Treiber findest Du hier: https://download.epson-biz.com/modules/ ... =36&pcat=3

Wie gesagt, es sind nur Testprogramme, da ginge einiges noch optimierter. Statt immer die Länge beim Poke anzugeben, könnte man auch -1 schreiben und das druckpos + Länge wegnehmen und stattdessen einfach druckpos + Poke... schreiben, denn Poke liefert die Länge der geschriebenen Bytes zurück.

Gruß, Hoerbie

Re: bondrucker epson tm-t88v

Verfasst: 20.12.2015 23:31
von 5mware
danke für deine beispiele, ich werde mir die mal durcharbeiten. fände das schon gut.

das wäre auf jedenfall hilfreich.

danke erstmal.