加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

VB.NET串口通讯

发布时间:2020-12-16 22:27:56 所属栏目:大数据 来源:网络整理
导读:Mitsubishi公司的FX2N系列PLC与计算机之间的串口通讯,参考代码如下 mports System.IO.PortsPublic Class Form1 '使用WithEvents关键字声明一个通信端口对象 Dim WithEvents RS232 As SerialPort '初始化取得计算机中存在的可用串行通讯端口 Sub initializin


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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读