有关.NET和RS232设备通讯

    本来想整理一些东西出来的,后来发现没什么需要特别说明的,那篇翻译的文章实在是讲得太清楚了。 
    唯一需要说明的也许是如何使用这个类,其实在控件的源代码里面也可以找到两个很好的实现

  1. CommPingPong
  2. CommLine

    也许值得一提的还有文章中用来举例的 LineTerm.vb ,实在是一个非常简单明了的实现:

 1Imports JH.CommBase
 2
 3Public Class LineTerm
 4    Inherits CommLine
 5
 6    Public Sub SendCommand(ByVal s As String)
 7        Send(s)
 8    End Sub

 9
10    Public Sub TransactCommand(ByVal s As String)
11        Dim r As String
12        r = Transact(s)
13        Console.WriteLine("RESPONSE: " + r)
14        Prompt()
15    End Sub

16
17    Public Sub Prompt()
18        Console.WriteLine("Type string to send and press ENTER. Empty string to close com port.")
19    End Sub

20
21    Protected Overrides Function CommSettings() As CommBaseSettings
22        Dim cs As New CommLineSettings()
23        cs.SetStandard("COM1:"19200, Handshake.none)
24        cs.rxFilter = New ASCII() {ASCII.LF, ASCII.SOH}
25        cs.rxTerminator = ASCII.CR
26        cs.txTerminator = New ASCII() {ASCII.CR}
27        Setup(cs)
28        Return cs
29    End Function

30
31    Protected Overrides Sub OnRxLine(ByVal s As String)
32        Console.WriteLine("RECEIVED: " + s)
33        Prompt()
34    End Sub

35
36    Protected Overrides Sub OnTxDone()
37        Console.WriteLine("TRANSMISSION COMPLETE")
38        Prompt()
39    End Sub

40
41End Class

42Module Module1
43
44    Sub Main()
45        Dim t As New LineTerm()
46        Dim c As String
47        Console.WriteLine("Press ENTER to open com port")
48        Console.ReadLine()
49        If t.Open() Then
50            Console.WriteLine("COM PORT OPEN")
51            t.Prompt()
52            While True
53                c = Console.ReadLine().Trim
54                If c = "" Then Exit While
55                t.SendCommand(c)
56                't.TransactCommand(c)
57            End While
58            t.Close()
59        End If
60        Console.WriteLine("COM PORT CLOSED")
61        Console.WriteLine("Press ENTER to close program.")
62        Console.ReadLine()
63    End Sub

64
65End Module

66
67

    其中Send和Transact就是同步和异步的区别。

    如果使用TransactCommand就是发送命令之后等待回复,收到的数据做为函数的返回值返回。

    如果使用SendCommand,就是‘发送后不管’,直到收到数据以后触发OnRxLine函数(首先每收到一个字符都要触发OnRxChar事件来判断接收的数据是不是正确,或者有没有正确的结束,一旦判断数据接收结束,就触发OnRxLine函数,这些都是在CommLine中实现的),讲收到的数据显示,或者提示。 

    哦,也许还有需要说明的就是:这个控件跟其他的使用Windows API的.NET下与RS232设备通讯的类库不同:

  1. 使用继承,还有OO的思想,不像其他只能算作工具类。
  2. 接收时候使用线程,继承的类也自动采用线程接收。
  3. 一次接收一个字符,其他的都是一次接收一串字符串。优点是不像其他的有时候会没有接收完毕就返回了。缺点可能是这样速度稍慢,对于某些RS232设备毫秒级的速度要求,加上.NET的速度本就不快,可能会产生一些问题。
  4. 可以在OnRxChar里面写判断函数,例如检查是否有开始结束字符,或者效验位的正确与否,来判断是否接收完毕(如果这个函数的判断较复杂,可能会影响传输的速度,每接收一个字符都会触发这个事件啊……)。
  5. 可以方便的把RS232设备封装成对象。或者使用单例模式来保证RS232设备资源冲突(未试验)。
  6. 其他,想到再说。 
posted @ 2005-08-18 18:24  阿哲  阅读(1698)  评论(1编辑  收藏  举报