.NET中的串口通信

时间:2010-06-03 12:41:03

标签: c# serial-port

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

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

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

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

  3. 如何处理此异常:

      

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

2 个答案:

答案 0 :(得分:7)

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

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

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

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

答案 1 :(得分:7)

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

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

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

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

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

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