VB.NET串口通讯


Mitsubishi公司的FX2N系列PLC与计算机之间的串口通讯,参考代码如下

 

mports System.IO.Ports
Public Class Form1
    '使用WithEvents关键字声明一个通信端口对象
    Dim WithEvents RS232 As SerialPort
    '初始化取得计算机中存在的可用串行通讯端口
    Sub initializing()
        For Each sp As String In SerialPort.GetPortNames()
            cmbCOM.Items.Add(sp) 'cmbCOM是ComboBox控件,该代码用来取得系统找到的所有串口名称
        Next
        cmbCOM.Sorted = True       '排序
        cmbCOM.SelectedIndex = 0 '第一个是预设选项
    End Sub

    '联机,使用正确的通讯参数建立一个通讯端口对象
    Sub online()
        Try
            RS232 = New IO.Ports.SerialPort(cmbCOM.SelectedItem.ToString, 9600, Parity.Even, 7, StopBits.Two)
            'RS232.Encoding = System.Text.Encoding.ASCII,如果系统支持中文,可以使用Encoding.Unicode编码方案
            If Not RS232.IsOpen Then RS232.Open()
        Catch ex As Exception
            MsgBox("通讯端口打开错误!" & vbCrLf & "故障信息:" & vbCrLf & ex.Message, MsgBoxStyle.OkCancel)
        End Try
    End Sub

    '离线,关闭通讯端口
    Sub offline()
        Try
            If RS232.IsOpen Then RS232.Close() : RS232 = Nothing '释放资源
        Catch ex As Exception
            MsgBox("通讯端口关闭错误!" & vbCrLf & "故障信息:" & vbCrLf & ex.Message, MsgBoxStyle.OkCancel)
        End Try
    End Sub

    '通讯延时,通讯延时与串口处理数据时的ReadTimeout和WriteTimeout的含义是完全不同的
    Sub TimeDelay(ByVal DT As Integer)
        Dim ET As Integer
        ET = Environment.TickCount()
        Do
            If Environment.TickCount() - ET >= DT Then Exit Do
            Application.DoEvents()  '处理队列中的讯息
        Loop
    End Sub

    '串口数据接收函数
    Function DataReceive() As String
        Dim input As String, strfst As String
        DataReceive = Nothing
        input = RS232.ReadExisting()
        If input <> Nothing Then
            '以下代码用来判断接收的数据起始字符是STX(Chr(2))/ACK(Chr(6)),NAK/(Chr(21))
            strfst = Asc(Microsoft.VisualBasic.Left(input, 1)).ToString
            Select Case strfst
                Case "2"
                    If rCheckSum(input) = "OKSUM" Then Return (input)
                    If rCheckSum(input) = "ERSUM" Then Return "ERSUM"
                Case "6"
                    Return Asc(input).ToString
                Case "21"
                    Return Asc(input).ToString
                Case Else
                    Return "ERCOM" '如果所选串口返回的未知数据,说明串口通讯故障/计算机连接到未知设备!
            End Select
        Else
            Return "ERCOM" '如果所选串口没有任何数据返回,说明串口通讯故障/PC Command ERROR!
        End If
    End Function

    '**************************************************************

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        initializing()
        btnoffline.Enabled = False
        stx.Text = "Chr(2)"
        cmd.Text = "0"
    End Sub

    Private Sub btnonline_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnonline.Click
        online()
        If RS232.IsOpen Then btnonline.Enabled = False
        If RS232.IsOpen Then btnoffline.Enabled = True
    End Sub

    Private Sub btnoffline_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnoffline.Click
        offline()
        btnoffline.Enabled = False
        btnonline.Enabled = True
    End Sub

    Private Sub btnEnd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEnd.Click
        If RS232 Is Nothing Then                         '判断是否已建立通信对象
            End
        Else
            If RS232.IsOpen Then RS232.Close() '若已经打开,就将其关闭
        End If
        End
    End Sub
    
    Private Sub btnSend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSend.Click
        Try
            If Not RS232 Is Nothing Then '判断是否已建立通信对象
                Dim OutCmd As String
                Dim indat As String
                OutCmd = Nothing
                indat = RS232.ReadExisting() '使用.ReadExisting()方法清空缓冲区
                If cmd.Text.Trim = "0" Then OutCmd = cmd.Text.Trim + address.Text.Trim + byten.Text.Trim + Chr(3)
                If cmd.Text.Trim = "1" Then OutCmd = cmd.Text.Trim + address.Text.Trim + byten.Text.Trim + data.Text.Trim + Chr(3)
                OutCmd = Chr(2) + OutCmd + tCheckSum(OutCmd) '发送命令调用CheckSum函数生成CheckSum字符串
                RS232.Write(OutCmd)
                TimeDelay(300)
                indat = DataReceive()
                If indat = "ERCOM" Or indat = "ERSUM" Then
                    MsgBox("通讯故障!PLC OFFLINE!!!/数据传输错误!!!")
                Else
                    txtResult.Text += OutCmd + "->" + indat + vbCrLf
                    txtResult.SelectionStart = txtResult.TextLength   '将光标自动移至最下一位
                    txtResult.ScrollToCaret()                                      '将光标自动移至最下一位
                End If
            Else
                MsgBox("通信端口尚未打开!", MsgBoxStyle.OkCancel)
            End If
        Catch ex As Exception
            MsgBox("通讯端口发生故障!" & vbCrLf & "故障信息:" & vbCrLf & ex.Message)
        End Try
    End Sub

    '应用程序窗口关闭时的响应事件,如果RS232通讯已建立就将其关闭再退出
    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        If RS232 Is Nothing Then                         '判断是否已建立通信对象
            End
        Else
            If RS232.IsOpen Then RS232.Close() '若已经打开,就将其关闭
        End If
        End
    End Sub

End Class
VB.Net是一种面向对象的编程语言,可以用于开发各种应用程序,包括串口通讯。在VB.Net中,可以使用SerialPort类来实现串口通讯。 首先,我们需要引入System.IO.Ports命名空间,以便能够使用SerialPort类。然后,我们需要声明一个SerialPort对象,并设置相应的属性,如串口号、波特率等。接下来,我们可以使用Open方法打开串口。 当串口打开后,我们可以使用Write方法发送数据到串口,使用Read方法从串口接收数据。通过事件处理程序,我们可以实时监测串口的数据接收情况,并对接收到的数据进行处理。 例如,我们可以编写一个按钮的点击事件处理程序,当按钮被点击时,通过串口发送一条指令给外部设备,并等待接收设备的返回数据。代码示例如下: Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click '设置串口属性 SerialPort1.PortName = "COM1" '设置串口号 SerialPort1.BaudRate = 9600 '设置波特率 '打开串口 SerialPort1.Open() '发送指令 SerialPort1.Write("指令内容") '等待接收数据 Dim receivedData As String = SerialPort1.ReadLine() '处理接收到的数据 MessageBox.Show(receivedData) '关闭串口 SerialPort1.Close() End Sub 在处理串口通讯时,我们还需要考虑异常情况的处理,例如串口打开失败、接收数据超时等。可以使用Try-Catch语句来捕捉并处理这些异常。 总之,通过VB.Net,我们可以轻松实现串口通讯,发送和接收数据。同时,我们还可以根据具体需求对串口通讯进行更加复杂的处理和控制。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值