这是我正在尝试做的一些背景:
- 打开从移动设备到蓝牙打印机的串行端口。
- 向蓝牙打印机发送 EPL/2 表格,以便它了解如何处理即将接收的数据。
- 收到表格后,将一些数据发送到打印机,这些数据将打印在标签纸上。
- 根据需要对要打印的每个标签重复步骤 3。
第 2 步只发生在第一次,因为表单不需要在每个标签之前。我的问题是,当我发送表格时,如果我发送标签数据太快,它将无法打印。有时我会在标签上打印“蓝牙故障:无线电无法运行”,而不是我发送的数据。
通过执行以下操作,我找到了解决此问题的方法:
for (int attempt = 0; attempt < 3; attempt++)
{
try
{
serialPort.Write(labelData);
break;
}
catch (TimeoutException ex)
{
// Log info or display info based on ex.Message
Thread.Sleep(3000);
}
}
所以基本上,我可以捕获一个 TimeoutException 并在等待一段时间后重试 write 方法(三秒似乎一直有效,但更少,似乎每次尝试都会抛出异常)。经过三次尝试,我只是假设串行端口有问题并让用户知道。
这种方式似乎工作正常,但我确信有更好的方法来处理这个问题。我认为我需要使用 SerialPort 类中的一些属性,但我真的找不到任何好的文档或如何使用它们的示例。我尝试过使用一些属性,但它们似乎都没有达到我想要达到的效果。
这是我玩过的属性列表:
- CD控股
- 中通控股
- Dsr控股
- 启用 Dtr
- 握手
- RtsEnable
我确信这些的一些组合将处理我正在尝试做的更优雅的事情。
我正在使用 C#(2.0 框架)、Zebra QL 220+ 蓝牙打印机和 windows Mobile 6 手持设备,如果这对解决方案有任何影响的话。
任何建议,将不胜感激。
[更新]
我还应该注意到,移动设备使用的是蓝牙 2.0,而打印机只有 1.1 版。我假设速度差异是导致打印机在接收数据方面落后的原因。