产品信息

编程实例3 - 通信数据接收

数据接收 - Visual Basic 2005 串行通信程序-

串行通信程序  发送示意图

这是分配给COM1 的USB连接的RS-232C 1端口型号 COM-1(USB)H ,使用接收事件处理,非同步地从接收缓冲区读入来自对象装置的发送数据。例如,这是在条码读取数据时或者计测器完成计测时,读入接收数据时的有效方法。这是使用Delegate和Invoke方法,在文本框中显示接收数据的程序例子。

使用COM端口 COM1
通信速度 9600bps
奇偶校验设置 无(None)
数据位长度 8位
结束位 1位
握手信号 不使用
RTS线路 有效

创建画面与设置属性

创建画面与设置属性  画面示意图

启动Visual Basic 2005 ,创建新项目,创建左图所示的画面。将SerialPort组件粘贴在画面上。确认SerialPort组件的属性的内容(设置波特率等通信参数)。

对象 TextBox1 COM1
对象 Button1 连接
对象 Button2 断开
对象 TextBox2  

关于多线程处理

  • 从辅助线程(二次线程)调用DataReceived事件(接收事件)处理程序。也就是说,用二次线程进行接收事件处理。
  • 为此,访问Windows.Forms的UI元素(控件)时,需要使用Control.Invoke()方法。
  • 通过使用Invoke 方法,用主线程能够执行对控件的操作。
  • 创建与想在主线程上执行的方法(包括对控件的操作)对应的Delegate,用Invoke方法的参数指定该Delegate的实例,调用。
  • 例如,与时间事件的接收时一样,如果打算在接收事件内在Form的文本框显示接收数据,将发生下图所示的例外错误。 有关多线程处理的详细情况,请参照Visual Basic 2005的帮助文档。
错误画面

程序记述例子

添加点击连接按钮、断开按钮时的处理。在Form1.vb记述以下代码。双击各对象(按钮等),如果双击按钮,记述按钮被按下时的处理的程序文件打开。在此记述想进行的处理。

Private Sub Button1_Click(… → 连接按钮被按下时的处理
	Try   					'例外处理开始 
	   If SerialPort1.IsOpen = True Then   		'端口已打开
	      MessageBox.Show("错误", MessageBoxButtons.OK, MessageBoxIcon.Error)                
	      Exit Sub
	   End If
	      SerialPort1.PortName = TextBox1.Text 	'存储要打开的端口名
	      SerialPort1.Open() 			'端口开        
	Catch ex As Exception  			'例外处理            
	      MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK,MessageBoxIcon.Error)        
	End Try 
			
	SerialPort1.RtsEnable = True            		'接通RTS
		 
End Sub
Private Sub Button2_Click(… → 断开按钮被按下时的处理
	If SerialPort1.IsOpen = True Then	'端口已打开
	   SerialPort1.Close()             	'端口关闭
	End If
End Sub
对Delegate的描述
	Delegate Sub DataDelegate(ByVal sdata As String)
定义被Invoke方法调用的方法(函数)
	Private Sub PrintData(ByVal sdata As String) 
	   TextBox2.Text = sdata
	End Sub
Private Sub SerialPort1_DataReceived(ByVal… → 记述发生接收事件时的处理
	Dim ReceivedData As String = " "      	'描述接收数据用变量
	Try
	      ReceivedData = SerialPort1.ReadLine 	'接收数据
	Catch ex As Exception            
	      ReceivedData = ex.Message	 	'进行例外处理
	End Try
'将Delegate描述到被Invoke方法执行的方法,显示接收数据
	Dim adre As New DataDelegate(AddressOf PrintData)
	Me.Invoke(adre, ReceivedData) 
		
End Sub

Page Top