【问题标题】:Sending and receiving more lines via a serial port通过串口发送和接收更多线路
【发布时间】:2015-03-19 21:52:16
【问题描述】:

(编者注。可能相关: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 是个好主意。

【问题讨论】:

  • port.WriteLine("S"); 也许?

标签: c# serial-port


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 感谢您的回答。 (按回车键将保存这篇文章..很高兴知道:D)我尝试的另一种方法是我将 port.Write(comman) 和 .ReadLine 放入 port_DataReceived(object sender, SerialDataReceivedEventArgs e) 并进行计数 var 和一件事。例如:case 0: .write("S") count++ break;案例1:.write("r01") count++ break;等等以及保存信息的字符串[]。字符串[计数] = .ReadLine();希望你知道我的意思,因为我不知道如何正确格式化这篇文章。我也会尝试异步方法。我一试用就发帖。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多