【串口通信】--事件监听

    上篇博客我们谈到了如何利用虚拟串口程序,学习和调试串口通信的例子.最后也留给大家留了一个问题就是我如何知道对方有没有发消息.我总不能规定个事件去点击一下接收事件吧.应该是可以向QQ那样“当好友发送了消息以后你就能随时接收的到”。长期订阅我博客的人看到这里应该会有些熟悉。这和socket网络通信好像有些相似,其实,这本来就是两种相似的通信方式,从虚拟串口的原理(VSPM虚拟串口软件可以将TCP/IP连接映射成本机的虚拟COM口,应用程序通过访问虚拟串口,就可以完成远程控制、数据传输等功能。)就能很容易的看出来。Socket的监听机制我就不再累述了,下面我来说说串口通信中的监听机制。大家可以对比学习一下。


    要了解串口通信的监听机制,首先要了解串口类的一个方法:DataReceived。其次是了解Vb.net中的事件绑定机制。


    首先说DataReceived方法:表示将处理SerialPort 对象的数据接收事件的方法。从SerialPort对象接收数据时,将在辅助线程上引发DataReceived 事件。

    然后是vb.net中的Handles:声明某个过程处理一个指定事件。


    在旧版本的Visual Basic中,事件过程(例如“Button1_Click”事件)是非常简单的。应为系统是直接通过名称调用过程的。如果Button1_Click事件存在,那么系统就调用之。这个调用过程是非常直截了当的。但是在VB.net中有两个主要的升级使得VB.net面向对象的的特点得以突出。

        1、“Handles”负责判断使系统是否调用该子程序,而不是靠过程的名字来判断。

        2、将sendere两个参数传递给子程序

 

    今天我们就用到了其中的Handles,下面通过一个简单的例子来说明一下这里:

Protected Sub A (ByVal sender As Object, ByVal e As System.EventArgs) Handles ClassB.B
	…...
End Sub

         其实handles的作用就是委托过程A来执行ClassBB事件,也就说当触发ClassBB事件时会,执行A中的代码,在SerialPort中DataReceived也就是已经定义好的一个用来处理数据回发的事件。我们只需要另外写一个方法来绑定这个事件就能在串口收到数据时来执行我们想要进行的操作,其实也就是一个回调函数。

 

    所以上篇博客关于显示的部分我们完全可以交给这两个方法去实现。

Private Sub serialPort_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles _serialPort.DataReceived
	Dim InByte() As Byte, ReadCount As Integer, strRead As String
	If RS232.BytesToRead <= 0 Then Exit Sub
	ReDim InByte(RS232.BytesToRead - 1)
	ReadCount = RS232.Read(InByte, 0, RS232.BytesToRead)
	strRead = ""
	If ReadCount = 0 Then
		Exit Sub
	Else
		For Each bData As Byte In InByte
			strRead += bData.ToString & vbCrLf     '若有数据则加到接收文本框
			DisplayText(strRead)
		Next
	End If
End Sub

Private Sub DisplayText(ByVal comData As String)
	'如果调用txtReceive的另外的线程,返回true
	If Me.txtReceive.InvokeRequired Then
		'利用代理类型建立对象,并指定代理的函数
		Dim d As New SetTextCallback(AddressOf DisplayText)
		Me.Invoke(d, New Object() {comData})    '以指定的自变量列表调用函数
	Else '相同的线程
		'showstring(comData)     '将收到的数据填入接收文本框中
		Me.txtReceive.Text += comData
	End If
End Sub

    这样我们就可以实现每当对方有消息发送过来的时候我们不需要手动接收,而是自动的显示出来了。

    上面的代码涉及到了线程的问题,对于初学串口编程的人来说可能是个不小的问题。我也将在我的下篇博客中介绍这部分。



你可能感兴趣的:(线程,通信,basic,远程控制,Visual)