.NET中的串口通信

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

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

     ReadExisting()
    读()
     Readbyte() 
     Readchar()
    的ReadLine()
     Readto()
    
  2. 如何从该端口的输入流中获取所需的数据?

    我有静态大小的协议。 我是否可以使用特殊字符来指定协议数据的限制,哪个适用于此?

  3. 我该如何处理这个exception:

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

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

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

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

关闭表单但不确保设备停止发送数据时,您将获得ObjectDisposedexception。 确保在DataReceived事件中仅使用BeginInvoke,而不是Invoke。 如果表单的IsDisposed属性为true,则不要调用BeginInvoke。

我不能在汉斯的回答中添加任何内容,只是说我见过的最大陷阱之一是人们倾向于期望当DataReceived事件触发时,他们想要接收的所有字节都存在。

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

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

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

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

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