有关.NET和RS232设备通讯
本来想整理一些东西出来的,后来发现没什么需要特别说明的,那篇翻译的文章实在是讲得太清楚了。
唯一需要说明的也许是如何使用这个类,其实在控件的源代码里面也可以到两个很好的实现
唯一需要说明的也许是如何使用这个类,其实在控件的源代码里面也可以到两个很好的实现
1. CommPingPong
2. CommLine
也许值得一提的还有文章中用来举例的 LineTerm.vb ,实在是一个非常简单明了的实现:
Imports JH.CommBase
2
3Public Class LineTermClass LineTerm
4 Inherits CommLine
5
6 Public Sub SendCommand()Sub SendCommand(ByVal s As String)
7 Send(s)
8 End Sub
9
10 Public Sub TransactCommand()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()Sub Prompt()
18 Console.WriteLine("Type string to send and press ENTER.
5
6 Public Sub SendCommand()Sub SendCommand(ByVal s As String)
7 Send(s)
8 End Sub
9
10 Public Sub TransactCommand()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()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()Function CommSettings()
As CommBaseSettings
22 Dim cs As New CommLineSettings()
23 cs.SetStandard("COM1:", 19200, )
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()Sub OnRxLine(ByVal s As String)
19 End Sub
20
21 Protected Overrides Function CommSettings()Function CommSettings()
As CommBaseSettings
22 Dim cs As New CommLineSettings()
23 cs.SetStandard("COM1:", 19200, )
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()Sub OnRxLine(ByVal s As String)
32 Console.WriteLine("RECEIVED: " + s)
33 Prompt()
34 End Sub
35
36 Protected Overrides Sub OnTxDone()Sub OnTxDone()
writeline翻译37 Console.WriteLine("TRANSMISSION COMPLETE")
38 Prompt()
39 End Sub
40
41End Class
42Module Module1Module Module1
43
44 Sub Main()Sub Main()
45 Dim t As New LineTerm()
46 Dim c As String
33 Prompt()
34 End Sub
35
36 Protected Overrides Sub OnTxDone()Sub OnTxDone()
writeline翻译37 Console.WriteLine("TRANSMISSION COMPLETE")
38 Prompt()
39 End Sub
40
41End Class
42Module Module1Module Module1
43
44 Sub Main()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.")
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
63 End Sub
64
65End Module
66
67
其中Send和Transact就是同步和异步的区别。
如果使用TransactCommand就是发送命令之后等待回复,收到的数据做为函数的返回值返回。
如果使用SendCommand,就是‘发送后不管’,直到收到数据以后触发OnRxLine函数(首先每收到一个字符都要触发OnRxChar事件来判断接收的数据是不是正确,或者有没有正确的结束,一旦判断数据接收结束,就触发OnRxLine函数,这些都是在CommLine中
如果使用TransactCommand就是发送命令之后等待回复,收到的数据做为函数的返回值返回。
如果使用SendCommand,就是‘发送后不管’,直到收到数据以后触发OnRxLine函数(首先每收到一个字符都要触发OnRxChar事件来判断接收的数据是不是正确,或者有没有正确的结束,一旦判断数据接收结束,就触发OnRxLine函数,这些都是在CommLine中
实现的),讲收到的数据显示,或者提示。
哦,也许还有需要说明的就是:这个控件跟其他的使用Windows API的.NET下与RS232设备通讯的类库不同:
哦,也许还有需要说明的就是:这个控件跟其他的使用Windows API的.NET下与RS232设备通讯的类库不同:
1. 使用继承,还有OO的思想,不像其他只能算作工具类。
2. 接收时候使用线程,继承的类也自动采用线程接收。
3. 一次接收一个字符,其他的都是一次接收一串字符串。优点是不像其他的有时候会没有接收完毕就返回了。缺点可能是这样速度稍慢,对于某些RS232设备毫秒级的速度要求,加上.NET的速度本就不快,可能会产生一些问题。
4. 可以在OnRxChar里面写判断函数,例如检查是否有开始结束字符,或者效验位的正确与否,来判断是否接收完毕(如果这个函数的判断较复杂,可能会影响传输的速度,每接收一个字符都会触发这个事件啊……)。
5. 可以方便的把RS232设备封装成对象。或者使用单例模式来保证RS232设备资源冲突(
未试验)。
6. 其他,想到再说。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论