有关.NET和RS232设备通讯

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

  1. CommPingPong
  2. CommLine

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

 1 None.gif Imports  JH.CommBase
 2 None.gif
 3 ExpandedBlockStart.gifContractedBlock.gif Public   Class LineTerm Class LineTerm
 4InBlock.gif    Inherits CommLine
 5InBlock.gif
 6ExpandedSubBlockStart.gifContractedSubBlock.gif    Public Sub SendCommand()Sub SendCommand(ByVal s As String)
 7InBlock.gif        Send(s)
 8ExpandedSubBlockEnd.gif    End Sub

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

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

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

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

35InBlock.gif
36ExpandedSubBlockStart.gifContractedSubBlock.gif    Protected Overrides Sub OnTxDone()Sub OnTxDone()
37InBlock.gif        Console.WriteLine("TRANSMISSION COMPLETE")
38InBlock.gif        Prompt()
39ExpandedSubBlockEnd.gif    End Sub

40InBlock.gif
41ExpandedBlockEnd.gifEnd Class

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

64InBlock.gif
65ExpandedBlockEnd.gifEnd Module

66 None.gif
67 None.gif

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

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

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

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

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

转载于:https://www.cnblogs.com/zellzhang/archive/2005/08/18/217940.html

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
©️2021 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值