0

(编者注。可能相关:SerialPort 类

我正在尝试向 RFID 阅读器发送命令并接收“答案”。

例如,如果阅读器可以读取标签,则会收到 UID port.Write("S")port.ReadLine()

我正在使用这样的SerialDataReceivedEventHandler

port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);

private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    port.ReadLine();  
}

这就是我发送命令的地方:

public void sendData()
{
    port.Write("S");
    port.Write("r01");
    port.Write("r02");
}

现在的问题是我只收到“S”的第一个答案,它不会发送所有 3 行。问题是我不知道如何将所有 3 个命令发送给阅读器。

如果我忽略SerialDataReceivedEventHandler,我发现我可以使用此代码:

public void sendandreceive()
{
    port.Write("S");
    port.ReadLine();
    port.Write("r01");
    port.ReadLine();
}

该代码将发送和接收命令和答案。但我读到使用SerialDataReceivedEventHandler.

4

2 回答 2

1

当 DataReceived 事件触发时,它不会再次触发,除非有更多数据到达。发生的事情是串行端口的缓冲区包含所有三个响应,而您只读取一个。

如果您有一个必须解析的消息结构(您这样做,每条消息都以 EOL 终止符结尾),那么使用 DataRecived 可能会很复杂。有很多方法可以解决这个问题。

您可以将所有可用字节读入缓冲区并提取完整的消息,然后触发另一个事件,每条消息一个。如果缓冲区中有部分消息,请将其保留到下一个 DataReceived 事件。

您可以将整个操作(上面示例中的发送和接收)作为异步操作执行,该操作在完成时发出信号。这是最简单的方法。请记住,如果 SerialPort.ReadLine 没有及时获得完整的“行”,它可能会超时并抛出 TimeoutException。因此,它不是最强大的解决方案。您必须考虑如果操作超时该怎么办(缓冲区中可能有不完整的消息)。

您使用哪种方法取决于应用程序的性质。协议是否总是“发送命令,得到响应”?还是某些命令会导致连续响应?

正确(稳健地)进行串行通信是很困难的。我将从最简单的解决方案开始并仔细测试。

于 2012-08-09T21:59:25.413 回答
0

如果我使用该方法,它工作得很好,sendandreceive所以我将使用它并且不会使用SerialDataReceivedEventHandler.

我有点困惑,因为在每个串行端口示例SerialDataReceivedEventHandler中都使用了。

不过,我需要先对其进行测试,然后才能说它可以正常工作。也就是说,我愿意接受其他建议。

于 2012-08-10T12:04:42.210 回答