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
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值