分享

VB.Net RS232串行通信AutoReceive的实例

 清凉茶 2012-04-10
VB.Net RS232串行通信AutoReceive的实例
2010-05-09 2:22
VB.Net RS232串行通信AutoReceive的实例
VB.Net RS232串行通信AutoReceive的实例

代码如下:

Imports System.IO.Ports
Imports System.Text

Public Class Form1

    '声明一个委派类,并声明符合函数参数有一个,而其类型是字符串
    Delegate Sub SetTextCallback(ByVal InputString As String)

    '**************************************************************
    '窗体的Load事件中先将所有的通信端口先列出来
    '将通信端口排序,并将第一个通信端口设为默认值
    '**************************************************************
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        For Each sp As String In SerialPort.GetPortNames()
            cmbCOM.Items.Add(sp)
        Next
        cmbCOM.Sorted = True '排序
        cmbCOM.SelectedIndex = 0 '第一个是默认选项
    End Sub

    '**************************************************************
    '『打开通信端口』按钮的Click事件
    '此事件将设定通信端口参数,并打开通信端口
    '**************************************************************
    Private Sub btnOpenPort_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOpenPort.Click
        Dim mPortName As String

        mPortName = cmbCOM.SelectedItem.ToString   '欲打开的通信端口
        RS232.PortName = mPortName
        RS232.Encoding = Encoding.ASCII
        If Not RS232.IsOpen Then '还未打开
            RS232.Open() '打开通信端口
        Else
            MsgBox("~~通信端口打开错误(通信端口已被打开)~~", MsgBoxStyle.Critical Or MsgBoxStyle.OkCancel)
            End
        End If

    End Sub

    '**************************************************************
    '『关闭通信端口』按钮的Click事件
    '以Close方法关闭通信端口,并释放对象所占用的资源
    '**************************************************************
    Private Sub btnClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClose.Click
        If RS232 Is Nothing OrElse Not RS232.IsOpen Then '还未打开
            MsgBox("~~通信端口还未打开~~", MsgBoxStyle.Critical Or MsgBoxStyle.OkCancel)
        Else
            RS232.Close()
        End If

    End Sub

    '**************************************************************
    '『结束程序』按钮的Click事件
    '此事件将设定通信端口参数,并打开通信端口
    '**************************************************************
    Private Sub btnEnd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEnd.Click
        If Not RS232 Is Nothing Then '判断是否已创建通信对象
            If RS232.IsOpen Then RS232.Close() '若已打开,就将其关闭
        End If
        End
    End Sub


    '**************************************************************
    '通信端口的KeyPress事件,在此不让用户输入数据
    '**************************************************************
    Private Sub cmbCOM_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles cmbCOM.KeyPress
        e.KeyChar = ChrW(0) '禁止用户在其中输入任何的文字
    End Sub

    '**************************************************************
    '通信端口对象的DataReceived事件程序
    '当有数据超过ReceivedBytesThreshold属性设定值会引发此事件
    '接收的程序可以写在此事件程序中
    '由于此事件的引发是在另一个线程,因此必须使用委派来处理
    '**************************************************************
    Private Sub RS232_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles RS232.DataReceived
        If e.EventType <> SerialData.Chars Then Exit Sub '判断接收的数据是否为字符
        Dim InString As String
        InString = RS232.ReadExisting '取得字符串
        DisplayText(InString) '显示数据
    End Sub

    '**************************************************************
    '委派子程序
    '处理上述通信端口的接收事件
    '由于欲将数据显示到接收文字框中,因此必须检查是否由另外的Thread
    '所调用的,若是,则必须先创建委派对象
    'Invoke用于在拥有控件基础窗口控制代码的线程上执行委派
    '**************************************************************
    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 '相同的线程
            txtReceive.Text += comData   '将收到的数据入接收文字框中
        End If
    End Sub '更多vb.net源码和实例,请关注lob.cn (乐 博 网)


    '**************************************************************
    '传送按钮的Click事件
    '以Write方法送出文字框内的数据
    '**************************************************************
    Private Sub btnSend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSend.Click
        RS232.Write(txtSend.Text & vbCr)
    End Sub
End Class

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多