VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > VB.net教程 >
  • VB.NET串口通讯


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

imports 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


相关教程