使用 SerialPort 丢弃 RF Device Buffer

Using SerialPort to discard RF Device Buffer

我正在编写一个小应用程序,它通过发送命令列表自动连接到正确的串行端口,然后等待串行设备(RF 发射器)返回的响应。串行端口对象以十进制格式发送某些命令、重置、登录然后是查询命令。

发送查询命令后,设备会回复一个响应 - 当收到此响应时,我知道我的串行端口连接正确。

所有这些工作正常,但有时我从设备收到错误消息 - Error 130: TX Queue Overflow。这个错误可以通过简单地重启设备(RF Transmitter)来解决,但是这个错误的频率只是愚蠢的。

我认为当硬件上的缓冲区变满时会导致 TX 溢出错误是否正确?我认为在打开与设备的连接后只需一个简单的 DiscardInBuffer 即可解决此问题 - 但事实并非如此。

我什么时候应该使用 DiscardInBuffer,我在正确的上下文中使用它吗?

-- 编辑

经过更多的评论和思考,我得出的结论是 SerialPort.DiscardInBuffer 不会对我目前的情况做任何事情,我需要丢弃实际 RF 设备上的缓冲区 - 因此为什么插入它有效。

您向设备发送了太多数据,其输出队列已溢出,这意味着它无法像您提供的那样快地转发数据。

没有任何方法可以调用 SerialPort class 来解决这个问题,我们正在谈论的是两个完全不同的缓冲区。调用 SerialPort.DiscardOutBuffer 只会丢弃 您的串行端口 的输出数据,而不是设备。

要暂时解决问题,手册中指出您可以:

Use the command “reset txqueue” to clear the queue.

但是,更好的解决方案是防止出现此问题,而不是让设备充满数据。执行此操作的确切方法取决于您的硬件。

一种方法可能是引入某种 CommandQueue class,它具有关联的 SerialPort 对象以将命令推送到硬件。在此 class 中,您可以将要发送的命令排队,并以可配置的最大速率发送它们。您将使用计时器,并且仅在最后 X 毫秒内未发送命令时才发送命令。

另一种方法是实施某种软件流控制。您的设备似乎支持使用 "?STATE" 命令 (page 13) 查询队列长度。它将响应:

 STATE x1/x2 x3 x4

 x1: Number of datapackets in TX queue
 x2: Size of TX queue
 x3: Status byte (8 bit hexadecimal)
 Normal state: status byte = 0
 Bit 0 = 1: Error in transceiver
 Bit 1 = 1: Error in EEPROM
 x4: Current value of the dataset counter (number of last received and saved datapacket) 

您可以在尝试发送数据包之前查询它,并在队列已满时简单地休眠。​​


我已经用 C# 编写了大量代码来与挑剔的硬件(串行、以太网等)交互,我可以提供以下建议:

  • 实现一个 abstract class TN9000DeviceBase,它有 abstract 方法用于设备支持的所有命令。
  • 派生一个class TN9000SerialDevice : TN9000DeviceBase使用串口执行命令

这将允许您在需求发生变化时返回并通过以太网实施它。