【问题标题】:Serial port communication in .NET.NET 中的串行端口通信
【发布时间】:2010-06-03 12:41:03
【问题描述】:

我正在使用 C# 从串行端口接收数据,但存在一些问题。我是新手,所以我需要一些帮助。

  1. 首先我想知道哪些函数是事件驱动的:

    读取现有() 读() 读字节() 读字符() 读取线() 读到()
  2. 如何获取该端口所需的数据形式输入流?

    我有静态大小的协议。我可以使用特殊的 char 来指定协议数据的限制吗?哪个是合适的 char?

  3. 我该如何处理这个异常:

    C# SerialPort System.ObjectDisposedException,安全句柄已在 System.DLL 中关闭

【问题讨论】:

    标签: c# serial-port


    【解决方案1】:

    这些方法都不是“事件驱动的”,您可以在 DataReceived 事件中使用它们。当串口至少有一个字节的数据可供读取时调用。

    不确定“静态大小”是什么意思。如果设备发送固定数量的字节,那么您将使用 Read() 方法来读取它们。注意返回值,你只会得到可用的字节数。将它们存储在一个 byte[] 中,并在下一个 DR 事件中附加到该字节中,直到你得到它们为止。

    如果设备发送字符而不是字节,那么您通常可以利用 NewLine 属性。将其设置为终止响应的字符或字符串。换行符 ("\n") 是迄今为止最典型的选择。使用 ReadLine() 读取响应。在这种情况下不需要缓冲。

    当您关闭表单但不确保设备停止发送数据时,您将收到 ObjectDisposed 异常。请务必在 DataReceived 事件中仅使用 BeginInvoke,而不是 Invoke。如果表单的 IsDisposed 属性为 true,则不要调用 BeginInvoke。

    【讨论】:

      【解决方案2】:

      除了说我见过的最大陷阱之一是人们倾向于期望当 DataReceived 事件触发时,他们想要接收的所有字节都是现在。

      例如如果您的消息协议长度为 20 个字节,则 DataReceived 事件会触发并且您尝试读取 20 个字节。他们可能都在那里,也可能不在那里。很可能不会,具体取决于您的波特率。

      您需要检查正在读取的端口的 BytesToRead 属性,并将该数量读入缓冲区。如果有更多字节可用,DataReceived 事件将再次触发。

      请注意,当要接收的字节数至少等于串行端口的 ReceivedBytesThreshold 属性时,将触发 DataReceived 事件。默认情况下,我认为这设置为值 1。

      例如,如果您将其设置为 10,则当有 10 个或更多字节等待接收时触发事件,但不少于。这可能会也可能不会导致问题,我个人倾向于将此属性值设置为 1,这样接收到的所有数据都会触发事件,即使只接收到 1 个字节。

      不要误以为这会导致事件在接收到的每个字节时触发 - 它不会那样做。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-13
        • 1970-01-01
        • 2016-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多