(编者注。可能相关: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
。
答案 0 :(得分:1)
当DataReceived事件触发时,除非有更多数据到达,否则它不会再次触发。发生的事情是串口缓冲区包含所有三个响应,而你只读一个。
如果您有一个必须解析的消息结构(您执行此操作,每条消息都以EOL终结符结束),则使用DataRecived会很复杂。有很多方法可以解决这个问题。
您可以将所有可用字节读入缓冲区并提取完整消息,然后触发另一个事件,每个消息一个。如果缓冲区中存在部分消息,请将其保留到下一个DataReceived事件。
您可以执行整个操作(在上面的示例中为sendandreceive)作为异步操作,该操作在完成时发出信号。这是最简单的方法。请记住,如果SerialPort.ReadLine没有及时获得完整的“行”,它可以超时并抛出TimeoutException。因此,它不是最强大的解决方案。如果操作超时(缓冲区中可能存在不完整的消息),您必须考虑该怎么做。
您使用哪种方法取决于应用程序的性质。协议总是“发送命令,得到响应”吗?或者某些命令会导致连续响应吗?
正确地(强力地)进行串行通信很困难。我会从最简单的解决方案开始,仔细测试。
答案 1 :(得分:0)
如果我使用sendandreceive
方法,它就可以了,所以我会使用它,不会使用SerialDataReceivedEventHandler
。
我有点困惑,因为在每个串口使用了示例SerialDataReceivedEventHandler
。
尽管如此,我还是需要对它进行测试才能说它没有任何问题。也就是说,我对其他建议持开放态度。