通过串口发送和接收更多线路

时间:2012-08-09 20:38:56

标签: c# serial-port

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

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

例如,如果读者可以阅读标记,port.Write("S")port.ReadLine()将收到UID。

我正在使用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

是个好主意

2 个答案:

答案 0 :(得分:1)

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

如果您有一个必须解析的消息结构(您执行此操作,每条消息都以EOL终结符结束),则使用DataRecived会很复杂。有很多方法可以解决这个问题。

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

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

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

正确地(强力地)进行串行通信很困难。我会从最简单的解决方案开始,仔细测试。

答案 1 :(得分:0)

如果我使用sendandreceive方法,它就可以了,所以我会使用它,不会使用SerialDataReceivedEventHandler

我有点困惑,因为在每个串口使用了示例SerialDataReceivedEventHandler

尽管如此,我还是需要对它进行测试才能说它没有任何问题。也就是说,我对其他建议持开放态度。