我正在尝试以编程方式配置 Zebra QLn220 打印机,以将其“media.sense_mode”设置为“bar”或“gap”(取决于用户选择的内容)。
但是,这些命令工作的可靠性似乎非常低(有时有效,有时无效)。
为了测试各种可能的命令,我当然使用了 Zebra Setup Utilities,并将 PC 插入打印机。
我从 util 发送了这个命令:
! U1 setvar "media.sense_mode" "gap"
有效; 我知道这一点,因为通过以下方式对其进行测试:
! U1 getvar "media.sense_mode"
...向我展示了“差距”的预期/希望(在发送上述命令之前它一直是“栏”)。
但是尝试在代码中完成相同的事情适用于“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 Setup Utility 中返回“ V68.19.7Z ”。
那么这是否意味着我的固件是最新的(V68.19.7Z > v68.18.0Z),或者这是否意味着由于我的“应用程序”更新,我需要将固件升级到V68.19.7Z?如果我确实需要更新固件,我该怎么做?是找到最新固件并将其下载到我的电脑上,然后在电脑和打印机通过 USB 连接时运行其安装应用程序,还是......?
更新 2
从这里,搜索 QLn220,我看到 V68.18.0Z 是唯一可供下载的固件版本。因此,既然我的打印机上似乎有更新版本,我很困惑......为什么他们不提供似乎是更新版本(V68.19.7Z)的东西?
更新 3
如果我在上面引用的页面上单击“自解压存档”链接,我只会得到一个包含一些通用但无法操作(看起来如此)方向的页面。
如果我点击那里的下载链接,我会得到一个页面,上面写着“这个网页有一个重定向循环”
更新 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();
...正在完成同样的事情吗?