gpt4 book ai didi

c# - 如何强制串行端口写入方法在发送数据之前等待线路清除?

转载 作者:可可西里 更新时间:2023-11-01 08:42:49 25 4
gpt4 key购买 nike

这是我正在尝试做的事情的一些背景:

  1. 打开从移动设备到蓝牙打印机的串行端口。
  2. 向蓝牙打印机发送 EPL/2 表格,以便它了解如何处理即将接收的数据。
  3. 收到表格后,将一些数据发送到打印机,这些数据将打印在标签纸上。
  4. 根据需要为每个要打印的标签重复第 3 步。

第 2 步只发生在第一次,因为表单不需要在每个标签之前。我的问题是,当我发送表格时,如果我发送标签数据的速度太快,它将无法打印。有时我会在标签上打印“蓝牙故障: radio 无法运行”,而不是我发送的数据。

我通过执行以下操作找到了解决该问题的方法:

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 并在等待一定时间后重试写入方法(三秒似乎一直有效,但时间更短,似乎每次尝试都会抛出异常)。经过三次尝试后,我假设串口有问题并让用户知道。

这种方法似乎工作正常,但我确信有更好的方法来处理这个问题。我认为我需要使用 SerialPort 类中的一些属性,但我真的找不到任何好的文档或如何使用它们的示例。我试过使用一些属性,但它们似乎都没有达到我想要实现的目的。

这是我玩过的属性列表:

  • CD控股
  • 中旅控股
  • DsrHolding
  • DtrEnable
  • 握手
  • 启用Rts

我确信这些的某些组合将更优雅地处理我正在尝试做的事情。

我正在使用 C#(2.0 框架)、Zebra QL 220+ 蓝牙打印机和 Windows Mobile 6 手持设备,如果这对解决方案有任何影响的话。

如有任何建议,我们将不胜感激。

[更新]

我还应该注意到移动设备使用的是蓝牙 2.0,而打印机只有 1.1 版。我假设速度差异是导致打印机在接收数据方面滞后的原因。

最佳答案

好吧,我已经根据已经给出的两个建议找到了一种方法。我需要使用以下内容设置我的串行端口对象:

serialPort.Handshake = Handshake.RequestToSendXOnXOff;
serialPort.WriteTimeout = 10000; // Could use a lower value here.

然后我只需要进行写入调用:

serialPort.Write(labelData);

由于 Zebra 打印机支持软件流控制,当缓冲区快满时它会向移动设备发送一个 XOff 值。这会导致移动设备等待打印机发送 XOn 值,有效地通知移动设备它可以继续传输。

通过设置写超时属性,我给出了在抛出写超时异常之前允许传输的总时间。正如我在问题的示例代码中所做的那样,您仍然希望捕获写入超时。但是,没有必要循环 3(或任意次数)次,每次都尝试写入,因为软件流控制将启动和停止串行端口写入传输。

关于c# - 如何强制串行端口写入方法在发送数据之前等待线路清除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/222455/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com