【发布时间】:2014-07-31 23:46:43
【问题描述】:
我正在尝试以编程方式配置 Zebra QLn220 打印机,以将其“media.sense_mode”设置为“bar”或“gap”(取决于用户选择的内容)。
不过,这些命令工作的可靠性似乎很低(有时有效,有时无效)。
为了测试各种可能的命令,我使用了 Zebra Setup Utilities,当然,PC 已插入打印机。
我从 util 发送了这个命令:
! U1 setvar "media.sense_mode" "gap"
成功了;我知道这一点,因为测试它:
! U1 getvar "media.sense_mode"
...向我展示了“gap”的预期/希望(在发送上述命令之前它是“bar”)。
但是尝试在代码中完成相同的事情对于“bar”(几乎总是)有效,但对于“gap”几乎没有
代码如下:
const string quote = "\"";
string advanceToBlackBar = string.Format("! U1 setvar {0}media.sense_mode{0} {0}bar{0}\r\n", quote);
string advanceToGap = string.Format("! U1 setvar {0}media.sense_mode{0} {0}gap{0}\r\n", quote);
. . .
if (radbtnBar.Checked)
{
PrintUtils.SendCommandToPrinter(advanceToBlackBar);
}
else if (radbtnGap.Checked)
{
PrintUtils.SendCommandToPrinter(advanceToGap);
}
如您所见,除了“bar”与“gap”之外,代码完全相同
附加的“\r\n”是否可能导致问题?似乎添加这些是必要的,或者使命令更可靠,但我对任何事情都持开放态度。
我总是测试替代命令来完成同样的事情,看看它们是否更可靠,但其他两个替代方法都不起作用,即不是这个:
! U1 setvar "ezpl.media_type" "web"
-也不是这个:
{} {"media.sense_mode" "gap"}
...在将这些命令发送到打印机后,通过 getvar 检查 val 继续显示“bar”(设置回“bar”后,发送这两个命令后,“media.sense_mode”的值仍为“bar”命令)。
是否可能需要设置某些其他打印机设置才能使打印机对发送的命令更加敏感?不仅以编程方式设置命令不可靠,而且即使通过 Zebra 设置实用程序,它有时会在命令发送和返回之前“沙漏”很长一段时间 - 有时它比 Johnny Quick 和 Flash 组合更快。
查看此命令的大量输出:
! U1 getvar "allcv"
....以下是最有趣/最有可能的候选人。需要更改哪些(如果有)以及更改为什么值?
wlan.ip.dhcp.request_timeout : 2 , Choices: 2-30
wlan.ip.dhcp.session_interval : 10 , Choices: 0-60
. . .
wlan.ip.timeout.enable : on , Choices: on,off
wlan.ip.timeout.value : 300 , Choices: 1-3600
. . .
wlan.keep_alive.enable : on , Choices: on,off
wlan.keep_alive.timeout : 15 , Choices: 5-300
. . .
netmanage.avalanche.interval : 60000 , Choices: 0-4294967295
netmanage.avalanche.startup_update : off , Choices: on,off
netmanage.avalanche.interval_update : off , Choices: on,off
. . .
netmanage.avalanche.udp_timeout : 3000 , Choices: 0-4294967295
netmanage.avalanche.tcp_connection_timeout : 3000 , Choices: 0-4294967295
. . .
netmanage.avalanche.realtime_update_int : 300 , Choices: 0-4294967295
. . .
zpl.zpl_mode : zpl II , Choices: zpl II,zpl
. . .
internal_wired.ip.arp_interval : 0 , Choices: 0-30
. . .
internal_wired.ip.dhcp.requests_per_session : 2 , Choices: 1-10
internal_wired.ip.dhcp.request_timeout : 2 , Choices: 2-30
internal_wired.ip.dhcp.session_interval : 10 , Choices: 0-60
. . .
internal_wired.ip.timeout.enable : on , Choices: on,off
internal_wired.ip.timeout.value : 300 , Choices: 1-3600
. . .
internal_wired.ip.wins.permanent_source : off , Choices: on,off
. . .
interface.network.active.arp_interval : 0
. . .
interface.network.active.speed : 0
. . .
weblink.printer_reset_required : no
. . .
weblink.ip.conn1.retry_interval : 10 , Choices: 1-600
. . .
weblink.ip.conn1.maximum_simultaneous_connections : 10 , Choices: 1-100
. . .
weblink.ip.conn1.test.retry_interval : 900 , Choices: 1-1800
weblink.ip.conn1.num_connections : 0
. . .
capture.channel1.port : off , Choices: serial,usb,bt,parallel,off
capture.channel1.count : 0 , Choices: 0-4294967295
有人知道吗?
更新
这是发送命令的代码:
public static bool SendCommandToPrinter(string cmd)
{
bool success; // init'd to false by default
try
{
using (SerialPort serialPort = new SerialPort())
{
serialPort.BaudRate = 19200;
serialPort.Handshake = Handshake.XOnXOff;
serialPort.Open();
serialPort.Write(cmd);
serialPort.Close(); // <= should be redundant within a using statement, but still getting "File 55" err...
}
success = true;
}
catch // may not need a try/catch block, as success defaults to false
{
success = false;
}
MessageBox.Show(success.ToString()); //TODO: Remove after testing
return success;
}
有问题的 SerialPort 来自 OpenNETCF.IO.Ports.SerialPort
注意: SerialPort.Write() 返回 void。
命令:
! U1 getvar "appl.name"
在 Zebra 设置实用程序中返回“V68.19.7Z”。
这是否意味着我的固件是最新的(V68.19.7Z > v68.18.0Z),或者这是否意味着因为我的“应用程序”更新,我需要升级固件到 V68.19.7Z?如果我确实需要更新固件,我该怎么做?是找到最新的固件并将其下载到我的电脑上,然后在电脑和打印机通过 USB 连接时运行其安装应用程序,还是...???
更新 2
来自here,搜索QLn220,我看到V68.18.0Z 是唯一可供下载的固件版本。因此,既然我的打印机上似乎有更新版本,我很困惑......为什么他们不提供似乎是更新版本 (V68.19.7Z) 的东西?
更新 3
如果我在上面引用的页面上单击“自解压存档”链接,我只会得到a page 一些通用但无法操作(看起来如此)的指示。
如果我点击那里的下载链接,我会看到一个页面,上面写着“这个网页有一个重定向循环”
更新 4
添加一些调试字符串后可以使用;在打印代码中:
MessageBox.Show(success.ToString()); //TODO: Remove after testing
return success;
...在设置代码中:
if (radbtnBar.Checked)
{
MessageBox.Show(advanceToBlackBar);
PrintUtils.SendCommandToPrinter(advanceToBlackBar);
}
else if (radbtnGap.Checked)
{
MessageBox.Show(advanceToGap);
PrintUtils.SendCommandToPrinter(advanceToGap);
}
难道这个小小的“行动中的休息”在某种程度上是有益的吗?
更新 5
注意:没有“SerialPort.Flush”可能:
serialPort.Close();
...正在完成同样的事情吗?
【问题讨论】:
标签: c# printing zebra-printers printer-control-language zpl