0

我在 Windows 移动设备上使用 Zebra iMZ320 打印机和 vb.net。用于 MZ320 的代码。

我正在尝试使用 CPCL 打印图形。

私有子 Print_Label()

Try

  Dim zebraPrinterConnection As ZebraPrinterConnection = New BluetoothPrinterConnection(MyMacAddress)
  zebraPrinterConnection.Open()

  Dim printer As ZebraPrinter = ZebraPrinterFactory.GetInstance(zebraPrinterConnection)

  cpclData = ""
  cpclData = cpclData & "! 0 200 200 300 1" & vbCr & vbLf
  cpclData = cpclData & "TEXT 4 0 30 40 This is a CPCL test." & vbCr & vbLf
  DrawLogoBitmap(10, 10)
  cpclData = cpclData & vbCr & vbLf
  cpclData = cpclData & "FORM" & vbCr & vbLf
  cpclData = cpclData & "PRINT" & vbCr & vbLf

  txt_TestPrint.Text = cpclData
  Debug_Output()

  ' Send the data to printer as a byte array.
  zebraPrinterConnection.Write(Encoding.[Default].GetBytes(cpclData))

  Thread.Sleep(500)

  zebraPrinterConnection.Close()

Catch e As ZebraPrinterConnectionException
  Console.Write(e.StackTrace)
End Try

结束子

Public Sub DrawLogoBitmap(ByVal xPosition As Integer, ByVal yPosition As Integer)

Try

  Dim bmp As Bitmap
  bmp = New System.Drawing.Bitmap(GetLogo)

  If bmp Is Nothing Then
    Throw New ArgumentNullException("bmp")
  End If

  'Make sure the width is divisible by 8   
  Dim loopWidth As Integer = 8 - (bmp.Width Mod 8)
  If loopWidth = 8 Then
    loopWidth = bmp.Width
  Else
    loopWidth += bmp.Width
  End If

  cpclData = cpclData & (String.Format("EG {0} {1} {2} {3} ", loopWidth / 8, bmp.Height, xPosition, yPosition))

  For y As Integer = 0 To bmp.Height - 1
    Dim bit As Integer = 128
    Dim currentValue As Integer = 0
    For x As Integer = 0 To loopWidth - 1
      Dim intensity As Integer
      If x < bmp.Width Then
        Dim color As Color = bmp.GetPixel(x, y)

        Dim MyR As Integer = color.R
        Dim MyG As Integer = color.G
        Dim MyB As Integer = color.B
        intensity = 255 - ((MyR + MyG + MyB) / 3)
      Else
        intensity = 0
      End If
      If intensity >= 128 Then
        currentValue = currentValue Or bit
      End If
      bit = bit >> 1
      If bit = 0 Then
        cpclData = cpclData & (currentValue.ToString("X2"))
        bit = 128
        currentValue = 0
      End If
      'x   
    Next

  Next
  'y  

Catch ex As Exception
  MsgBox("Error - Creating Logo" & vbCrLf & Err.Number & " " & Err.Description, MsgBoxStyle.Critical, "Database Error")
End Try

结束子

公共函数 GetLogo() 作为字符串

Try
  Return System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase) & "\logo.bmp"

Catch ex As Exception
  MsgBox("Error - Locating Logo" & vbCrLf & Err.Number & " " & Err.Description, MsgBoxStyle.Critical, "Image Error")
  Return 0
End Try

结束功能

这将为 80px x 80px 位图生成下面的输出 当将 CPCL 代码发送到打印机时,表示已建立链接的蓝灯亮起,但没有打印任何内容。

我可以打印更小的图形,所以正如你所说的 EG 声明有问题,或者刺痛本身太大而无法通过蓝牙发送。

!0 200 200 300 1 TEXT 4 0 30 40 这是 CPCL 测试。

4

2 回答 2

0

我假设大图形失败导致第一个数据行不完整:

 cpclData = cpclData & "EG 10 80 10 10 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"

“FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF”不会计算到偶数字节!

The EG command syntax:
Command width height x y data

宽度和高度必须以点计算,并且数据必须可除以 8。

EG 10

指定 0x10 * 8 点 = 每行 128 点

EG 10 80

定义一个 128 点宽和 128 (0x80) 点高的图形。

所以你必须发送 8 个字节乘 128 行,但你的数据甚至没有填满 100 行 8 个字节!

另见CPCL EG 命令

=============================== 第二个数据帖子也只包含 100 条点线,而您声明您将发送 128 条点线:

    EG 10 80 10 10
FFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFF
FFFFFFFFFFFF7FFF
FFFFFFFF800FFF80
01FFFFFFFFFE0001
FC00007FFFFFFFF8
00007000001FFFFF
FFF01F80703FF80F
FFFFFFE07FF800FF
FE07FFFFFFC1FFFC
01FFFF87FFFFFFC3
FFFC01FFFF83FFFF
FF87FFFC01FFFFC3
FFFFFF87FFFC11FF
FFC3FFFFFF87FFFC
39FFFFC1FFFFFF87
FFFC7FFFFFC1FFFF
FF87FFFCFFFFFFC1
FFFFFF87FFFFFFFF
FFC1FFFFFFC3FFFF
FFFFFFC3FFFFFFC1
FFFFFFFFFF83FFFF
FFE1FFFFFFFFFF07
FFFFFFE1FFFFFFFF
FE07FFFFFFE1FFFF
FFFFFC0FFFFFFFE1
FFFFCF0FF81FFFFF
FFC3FFFF8001C03F
FFFFFFC3FFCF8000
00FFFFFFFFC1FF87
C04003FFFFFFFFE0
FF07FFF81FFFFFFF
FFE0780FFFFC3FFF
FFFFFFF0001FFFF8
3FFFFFFFFFFC003F
FFF87FFFFFFFFFFF
803FFFF87FFFFFFF
FFFFFC1FFFF87FFF
FFFFFFFFFC1FFFF0
7FFFFFFFFFFFFE0F
FFF0FFFFFFFFFFFF
FE0FC020FFFFFFFF
FFFFFF000000FFFF
FFFFFFFFFF000001
FFFFFFFFFFFFFF80
01C1FFFFFFFFFFFF
FF83E3F9FFFFFFFF
FFFFFFCFE3FFFFFF
FFFFFFFFFFF9C39F
FFFFFFFFFFFFFFF8
C70FFFFFFFFFFFFF
FFF9879FFFFFFFFF
FFFFFFFF8FFFFFFF
FFFFFFFFF7FF807F
FFFFFFFFFFFFEFFF
00FFF7FFFFFFFFFF
CFFF03FFF3FFFFFF
FFFFCFFFFFFFF3FF
FFFFFFFFCFFC001F
F3FFFFFFFFFFC7F8
000FE3FFFFFFFFFF
C1F0000783FFFFFF
FFFFC000FF0003FF
FFFFFFFFE001FF80
07FFFFFFFFFFF003
FFC00FFFFF3FFFFF
FC07FFF03FFFFE1F
FF7FFFFFFFFFFFFF
C61FFE0FFFFFFFFF
FFFC023FFE01FFFF
FFFFFFF803FFFF00
3FFFFFFFFF0C0FFF
FF800FFFFFFFF00C
1FFFFF02041FFC7F
E00C3FFFFF070000
E001E0183FFFFE07
0400C001F4183FFF
FE000F008001FE00
1FFFFE001F0783C1
FE000FFFFC083F07
83C1FF0003FFC01C
1E0F07E3FF03007F
C01E1E0F0700FF83
803FE00C1E0F0600
7F80C07FF0001E0F
06007F8043FFFF00
3E0F83C1FF007FFF
FFE0700F83C1FE00
FFFFFFFFE0038001
FF0FFFFFFFFFF003
C001FFFFFFFFFFFF
FE03E001FFFFFFFF
FFFFFFFFFCFFFFFF
FFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFF

尝试使用匹配的 EG 10 64 10 10 。

为什么可能会在其他打印机上打印?可能其他打印机的解释器没有那么严格。或者它只使用以下数据来填充最多 128 行。

于 2013-07-01T05:01:50.350 回答
0

这些数据有多大?该ZebraPrinterConnection.write()方法只是传递到低级流代码。通常,蓝牙缓冲区比 TCP 或 USB 缓冲区小,因此您不想让它们过载。我建议将您的数据分成较小的块(1024 字节左右)并在写入之间等待 100 毫秒。

于 2013-07-01T13:39:22.217 回答