2014-09-04 27 views
5

Sono un programmatore C# per principianti. Ho un progetto che mi richiede di inviare il comando raw alla stampante Zebra LP 2844 tramite USB e farlo funzionare. Ho fatto molte ricerche e ho cercato di capire un modo per farlo. Sto usando il codice da http://support.microsoft.com/kb/322091, ma non ha funzionato. Sulla base del mio test, sembra che ho inviato comandi alla stampante, ma non ha risposto e stampato. Non ne ho idea. Qualcuno mi può aiutare?Come inviare uno ZPL grezzo alla stampante zebra usando C# via USB

sto usando il tasto per inviare il comando direttamente

private void button2_Click(object sender, EventArgs e) 
{ 
    string s = "A50,50,0,2,1,1,N,\"9129302\""; 

    // Allow the user to select a printer. 
    PrintDialog pd = new PrintDialog(); 
    pd.PrinterSettings = new PrinterSettings(); 
    if (DialogResult.OK == pd.ShowDialog(this)) 
    { 
     // Send a printer-specific to the printer. 
     RawPrinterHelper.SendStringToPrinter(pd.PrinterSettings.PrinterName, s); 
     MessageBox.Show("Data sent to printer."); 
    } 
} 
+0

Questo non sembra ZPL, sembra EPL. I comandi ZPL normalmente iniziano con '^' quindi una lettera. –

risposta

12

EDIT: Per affrontare l'aggiornamento, il problema che si sta avendo è che si sta utilizzando SendStringToPrinter che invia una stringa ANSI (un null terminato) stringa alla stampante che non è ciò che la stampante si aspetta. Secondo il funzionario EPL2 programming guide pagina 23 (Che è quello che stai facendo davvero, non ZPL secondo il tuo esempio).

Ogni riga di comando deve essere terminata con un carattere Line Feed (LF) (10 dicembre). La maggior parte dei sistemi basati su PC inviano CR/LF quando il tasto Invio è premuto. Il carattere Carriage Return (CR) viene ignorato dalla stampante e non può essere utilizzato al posto di LF.

Quindi è necessario o modificare SendStringToPrinter per inviare un \n alla fine della stringa, invece di un \0 o si deve costruire la matrice di ASCII di byte se stessi e utilizzare RawPrinterHelper.SendBytesToPrinter te stesso (come ho fatto nella mia risposta originale al di sotto).

Quindi, per risolvere il tuo semplice esempio Ripubblicato cambiamo la vostra chiamata di funzione, anche noi dobbiamo dire la stampante per stampare in realtà con l'invio di un P1\n

private void button2_Click(object sender, EventArgs e) 
{ 
    string s = "A50,50,0,2,1,1,N,\"9129302\"\n"; 
    s += "P1\n"; 

    // Allow the user to select a printer. 
    PrintDialog pd = new PrintDialog(); 
    pd.PrinterSettings = new PrinterSettings(); 
    if (DialogResult.OK == pd.ShowDialog(this)) 
    { 
     var bytes = Encoding.ASCII.GetBytes(s); 
     // Send a printer-specific to the printer. 
     RawPrinterHelper.SendBytesToPrinter(pd.PrinterSettings.PrinterName, bytes, bytes.Length); 
     MessageBox.Show("Data sent to printer."); 
    } 
} 

//elsewhere 
public static class RawPrinterHelper 
{ 
    //(Snip) The rest of the code you already have from http://support.microsoft.com/kb/322091 

    [DllImport("winspool.Drv", EntryPoint="WritePrinter", SetLastError=true, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)] 
    public static extern bool WritePrinter(IntPtr hPrinter, byte[] pBytes, Int32 dwCount, out Int32 dwWritten); 


    private static bool SendBytesToPrinter(string szPrinterName, byte[] bytes, Int32 dwCount) 
    { 
     Int32 dwError = 0, dwWritten = 0; 
     IntPtr hPrinter = new IntPtr(0); 
     DOCINFOA di = new DOCINFOA(); 
     bool bSuccess = false; 

     di.pDocName = "Zebra Label"; 
     di.pDataType = "RAW"; 


     if (OpenPrinter(szPrinterName.Normalize(), out hPrinter, IntPtr.Zero)) 
     { 
      if (StartDocPrinter(hPrinter, 1, di)) 
      { 
       if (StartPagePrinter(hPrinter)) 
       { 
        bSuccess = WritePrinter(hPrinter, bytes, dwCount, out dwWritten); 
        EndPagePrinter(hPrinter); 
       } 
       EndDocPrinter(hPrinter); 
      } 
      ClosePrinter(hPrinter); 
     } 
     if (bSuccess == false) 
     { 
      dwError = Marshal.GetLastWin32Error(); 
      throw new Win32Exception(dwError); 
     } 
     return bSuccess; 
    } 
} 

ho fatto con più vecchio linguaggio di Zebra EPL2, ma dovrebbe essere molto simile a quello che devi fare con ZPL. Forse ti farà iniziare nella giusta direzione.

public class Label 
{ 
    #region Print logic. Taken from http://support.microsoft.com/kb/322091 

    //Snip stuff unchanged from the KB example. 

    [DllImport("winspool.Drv", EntryPoint="WritePrinter", SetLastError=true, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)] 
    public static extern bool WritePrinter(IntPtr hPrinter, byte[] pBytes, Int32 dwCount, out Int32 dwWritten);  

    private static bool SendBytesToPrinter(string szPrinterName, byte[] Bytes, Int32 dwCount) 
    { 
     Int32 dwError = 0, dwWritten = 0; 
     IntPtr hPrinter = new IntPtr(0); 
     DOCINFOA di = new DOCINFOA(); 
     bool bSuccess = false; 

     di.pDocName = "Zebra Label"; 
     di.pDataType = "RAW"; 


     if (OpenPrinter(szPrinterName.Normalize(), out hPrinter, IntPtr.Zero)) 
     { 
      if (StartDocPrinter(hPrinter, 1, di)) 
      { 
       if (StartPagePrinter(hPrinter)) 
       { 
        bSuccess = WritePrinter(hPrinter, Bytes, dwCount, out dwWritten); 
        EndPagePrinter(hPrinter); 
       } 
       EndDocPrinter(hPrinter); 
      } 
      ClosePrinter(hPrinter); 
     } 
     if (bSuccess == false) 
     { 
      dwError = Marshal.GetLastWin32Error(); 
      throw new Win32Exception(dwError); 
     } 
     return bSuccess; 
    } 
    #endregion 

    public byte[] CreateCompleteCommand(bool headerAndFooter) 
    { 
     List<byte> byteCollection = new List<byte>(); 

     //Static header content describing the label. 
     if (headerAndFooter) 
     { 
      byteCollection.AddRange(Encoding.ASCII.GetBytes("\nN\n")); 
      byteCollection.AddRange(Encoding.ASCII.GetBytes(String.Format("S{0}\n", this.Speed))); 
      byteCollection.AddRange(Encoding.ASCII.GetBytes(String.Format("D{0}\n", this.Density))); 
      byteCollection.AddRange(Encoding.ASCII.GetBytes(String.Format("q{0}\n", this.LabelHeight))); 
      if (this.AdvancedLabelSizing) 
      { 
       byteCollection.AddRange(Encoding.ASCII.GetBytes(String.Format("Q{0},{1}\n", this.LableLength, this.GapLength))); 
      } 
     } 

     //The content of the label. 
     foreach (var command in this.Commands) 
     { 
      byteCollection.AddRange(command.GenerateByteCommand()); 
     } 

     //The footer content of the label. 
     if(headerAndFooter) 
      byteCollection.AddRange(Encoding.ASCII.GetBytes(String.Format("P{0}\n", this.Pages))); 

     return byteCollection.ToArray(); 
    } 

    public bool PrintLabel(string printer) 
    { 
     byte[] command = this.CreateCompleteCommand(true); 
     return SendBytesToPrinter(printer, command, command.Length); 
    } 

    public List<Epl2CommandBase> Commands { get; private set; } 

    //Snip rest of the code. 
} 

public abstract partial class Epl2CommandBase 
{ 
    protected Epl2CommandBase() { } 

    public virtual byte[] GenerateByteCommand() 
    { 
     return Encoding.ASCII.GetBytes(CommandString + '\n'); 
    } 
    public abstract string CommandString { get; set; } 
} 


public class Text : Epl2CommandBase 
{ 
    public override string CommandString 
    { 
     get 
     { 
      string printText = TextValue; 
      if (Font == Fonts.Pts24) 
       printText = TextValue.ToUpperInvariant(); 
      printText = printText.Replace("\\", "\\\\"); // Replace \ with \\ 
      printText = printText.Replace("\"", "\\\""); // replace " with \" 
      return String.Format("A{0},{1},{2},{3},{4},{5},{6},\"{7}\"", X, Y, (byte)TextRotation, (byte)Font, HorziontalMultiplier, VertricalMultiplier, Reverse, printText); 
     } 
     set 
     { 
      GenerateCommandFromText(value); 
     } 
    } 

    private void GenerateCommandFromText(string command) 
    { 
     if (!command.StartsWith(GetFactoryKey())) 
      throw new ArgumentException("Command must begin with " + GetFactoryKey()); 
     string[] commands = command.Substring(1).Split(','); 
     this.X = int.Parse(commands[0]); 
     this.Y = int.Parse(commands[1]); 
     this.TextRotation = (Rotation)byte.Parse(commands[2]); 
     this.Font = (Fonts)byte.Parse(commands[3]); 
     this.HorziontalMultiplier = int.Parse(commands[4]); 
     this.VertricalMultiplier = int.Parse(commands[5]); 
     this.ReverseImageColor = commands[6].Trim().ToUpper() == "R"; 
     string message = String.Join(",", commands, 7, commands.Length - 7); 
     this.TextValue = message.Substring(1, message.Length - 2); // Remove the " at the beginning and end of the string. 
    } 

    //Snip 
} 
+0

Grazie !! è molto specifico! Ho apprezzato! –

+0

@ShawnLou se ho risposto alla tua domanda contrassegna la risposta come accettata. –

Problemi correlati