关键词搜索

源码搜索 ×
×

VB.Net 串口通信示例

发布2022-06-01浏览1911次

详情内容

vb.net教程icon-default.png?t=M4ADhttps://www.xin3721.com/eschool/vbnetxin3721/

 

    该代码是通过 wuyazhe 的文章< C# 串口操作系列(1) -- 入门篇,一个标准的,简陋的串口例子。>将C# 转换成VB.net 而来。因为代码只是语法上的改动,整体框架依几乎并未改动,所以 代码讲解部分 就直接照搬了~供起步学习vb的朋友参考。

    这里我使用的是vs2010开发环境。

    为了使刚入门的朋友,能够理解,对进行串口通讯时的一些必要参数进行简单的讲解:

    串口属性主要包括

  .PortName 串口名称,COM1, COM2等。

  .BaudRate 波特率,也就是串口通讯的速度,进行串口通讯的双方其波特率需要相同,如果用PC连接其他非PC系统,一般地,波特率由非PC系统决定。

  .Parity 奇偶校验。可以选取枚举Parity中的值

  .DataBits 数据位

  .StopBits 停止位,可以选取枚举StopBits中的值

  .Handshake 握手方式,也就是数据流控制方式,可以选取枚举Handshake中的值

 以上参数,通过设置SerialPort 类的属性来进行。

程序简单界面如下:

代码中已经几乎完整的写了注释:

Imports System.IO.Ports
Imports System.Text.RegularExpressions
Imports System.Text

Public Class Form1

    Private comm As New SerialPort()
    Private builder As New StringBuilder()  '避免在事件处理方法中反复的创建,定义到外面。
    Private received_count As Long = 0      '接收计数
    Private send_count As Long = 0          '发送计数

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

        '初始化下拉串口名称列表框
        Dim ports As String() = SerialPort.GetPortNames()
        Array.Sort(ports)
        comboPortName.Items.AddRange(ports)
        comboPortName.SelectedIndex = If(comboPortName.Items.Count > 0, 0, -1)
        comboBaudrate.SelectedIndex = comboBaudrate.Items.IndexOf("9600")

        '初始化SerialPort对象
        comm.NewLine = vbCr & vbLf
        comm.RtsEnable = True           '根据实际情况吧。

        '添加事件注册
        AddHandler comm.DataReceived, AddressOf comm_DataReceived

    End Sub

    Private Sub comm_DataReceived(sender As Object, e As SerialDataReceivedEventArgs)
        Dim n As Integer = comm.BytesToRead     '先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致
        Dim buf(n) As Byte                      '声明一个临时数组存储当前来的串口数据
        received_count += n                     '增加接收计数
        comm.Read(buf, 0, n)                    '读取缓冲数据
        builder.Clear()                         '清除字符串构造器的内容

        '因为要访问ui资源,所以需要使用invoke方式同步ui。
        Invoke(Sub()
                   '判断是否是显示为16禁止
                   If checkBoxHexView.Checked Then
                       '依次的拼接出16进制字符串
                       For Each b As Byte In buf
                           builder.Append(b.ToString("X2") & " ")
                       Next
                   Else
                       '直接按ASCII规则转换成字符串
                       builder.Append(Encoding.ASCII.GetString(buf))
                   End If
                   '追加的形式添加到文本框末端,并滚动到最后。
                   Me.txGet.AppendText(builder.ToString())
                   '修改接收计数
                   labelGetCount.Text = "Get:" & received_count.ToString()
               End Sub)
    End Sub

    Private Sub buttonOpenClose_Click(sender As Object, e As EventArgs) Handles buttonOpenClose.Click
        '根据当前串口对象,来判断操作
        If comm.IsOpen Then
            '打开时点击,则关闭串口
            comm.Close()
        Else
            '关闭时点击,则设置好端口,波特率后打开
            comm.PortName = comboPortName.Text
            comm.BaudRate = Integer.Parse(comboBaudrate.Text)
            Try
                comm.Open()
            Catch ex As Exception
                '捕获到异常信息,创建一个新的comm对象,之前的不能用了。
                comm = New SerialPort()
                '现实异常信息给客户。
                MessageBox.Show(ex.Message)
            End Try
        End If
        '设置按钮的状态
        buttonOpenClose.Text = If(comm.IsOpen, "Close", "Open")
        buttonSend.Enabled = comm.IsOpen
    End Sub

    '动态的修改获取文本框是否支持自动换行。
    Private Sub checkBoxNewlineGet_CheckedChanged(sender As Object, e As EventArgs)
        txGet.WordWrap = checkBoxNewlineGet.Checked
    End Sub

    Private Sub buttonSend_Click(sender As Object, e As EventArgs) Handles buttonSend.Click
        '定义一个变量,记录发送了几个字节
        Dim n As Integer = 0
        '16进制发送
        If checkBoxHexSend.Checked Then
            '我们不管规则了。如果写错了一些,我们允许的,只用正则得到有效的十六进制数
            Dim mc As MatchCollection = Regex.Matches(txSend.Text, "(?i)[\da-f]{2}")
            Dim buf As New List(Of Byte)()              '填充到这个临时列表中
            '依次添加到列表中
            For Each m As Match In mc
                buf.Add(Byte.Parse(m.Value, System.Globalization.NumberStyles.HexNumber))
            Next
            '转换列表为数组后发送
            comm.Write(buf.ToArray(), 0, buf.Count)
            n = buf.Count                                       '记录发送的字节数
        Else
            'ascii编码直接发送
            '包含换行符
            If checkBoxNewlineSend.Checked Then
                comm.WriteLine(txSend.Text)
                n = txSend.Text.Length + 2
            Else
                '不包含换行符
                comm.Write(txSend.Text)
                n = txSend.Text.Length
            End If
        End If
        send_count += n                                         '累加发送字节数
        labelSendCount.Text = "Send:" & send_count.ToString()   '更新界面

    End Sub

    Private Sub buttonReset_Click(sender As Object, e As EventArgs) Handles buttonReset.Click
        '复位接受和发送的字节数计数器并更新界面。
        send_count = 0
        received_count = 0
        labelGetCount.Text = "Get:0"
        labelSendCount.Text = "Send:0"
    End Sub
End Class

以上。 该实例源码工程下载地址:(VS2010)

http://download.csdn.net/detail/zhuguanhao/4115837

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载