2010-06-03 92 views
3

我正在使用C#从串口接收数据,但存在一些问题。我是新来的,所以我需要一些帮助。.NET中的串口通信

  1. 首先关闭所有我想知道哪些功能是事件驱动:

     
    ReadExisting() 
    Read() 
    Readbyte() 
    Readchar() 
    ReadLine() 
    Readto() 
    
  2. 我怎么能采取必要的数据形成该端口的输入流?

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

  3. 如何处理这个异常:

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

回答

6

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

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

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

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

6

我不能给汉斯的答案添加任何东西,除非说我看到的最大陷阱之一是人们倾向于期望当DataReceived事件触发时,他们想要接收的所有字节是所有礼物。

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

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

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

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

不要犯这样的错误,这会导致事件触发每接收到一个字节 - 它不会这样做。