VB.NET开发全功能串口调试助手(含完整工程)

VB.NET的串口通信用了很长时间了,也只用Write和Read这样的方法,以前都是用这种方式做上位机软件,如此足矣。而前几天研究GSM模块时对串口返回的数据总是把握不好,参考开发板附送的例程,发现采用SerialPort的DataReceived事件,可以实现中断触发式的数据接收。于是想到要自己做一个串口调试助手,在实现基本功能的前提下增加一些方便自己调试的功能。经过断断续续的编写,就做成了下面这个小软件:

这个软件能够实现串口调试助手的全部功能,经过通信测试,数据接收性能不亚于呼啸工作室的SComAssistant2.2,通过加大输入缓冲区,可以满足大量数据接收。

VB.NET的串口通信主要使用VS自带的SerialPort控件,而不是早先的MSComm,更具有兼容性,这也是很久以前就放弃VB改用.NET的直接原因。该控件的主要方法、属性如下(该数据来自VS的MSDN帮助库):

方法

说明

Open

打开一个新的串行端口连接。

Close

关闭端口连接,将 IsOpen 属性设置为 false,并释放内部 Stream 对象。

Read

已重载。 从 SerialPort 输入缓冲区中读取。

ReadByte

从 SerialPort 输入缓冲区中同步读取一个字节。

ReadChar

从 SerialPort 输入缓冲区中同步读取一个字符。

ReadExisting

在编码的基础上,读取 SerialPort 对象的流和输入缓冲区中所有立即可用的字节。

ReadLine

一直读取到输入缓冲区中的 NewLine 值。

ReadTo

一直读取到输入缓冲区中的指定 value 的字符串。

Write

已重载。 将数据写入串行端口输出缓冲区。

WriteLine

将指定的字符串和 NewLine 值写入输出缓冲区。

DiscardInBuffer

丢弃来自串行驱动程序的接收缓冲区的数据。

DiscardOutBuffer

丢弃来自串行驱动程序的传输缓冲区的数据。

GetPortNames

获取当前计算机的串行端口名称数组。

属性

说明

PortName

获取或设置通信端口,包括但不限于所有可用的 COM 端口。

BaudRate

获取或设置串行波特率。

DataBits

获取或设置每个字节的标准数据位长度。

Parity

获取或设置奇偶校验检查协议。

StopBits

获取或设置每个字节的标准停止位数。

IsOpen

获取一个值,该值指示 SerialPort 对象的打开或关闭状态。

BytesToRead

获取接收缓冲区中数据的字节数。

BytesToWrite

获取发送缓冲区中数据的字节数。

Encoding

获取或设置传输前后文本转换的字节编码。

ReadBufferSize

获取或设置 SerialPort 输入缓冲区的大小。

ReceivedBytesThreshold

获取或设置 DataReceived 事件发生前内部输入缓冲区中的字节数。

WriteBufferSize

获取或设置串行端口输出缓冲区的大小。

想要通过串口收发数据,就需要对串口进行配置,包括设置端口、波特率、数据格式(如COM1端口、9600bps、8位数据位、无校验位、1位停止位)等属性,之后通过Open方法打开串口。打开串口可通过手动指定,也可以使用GetPortNames方法获取计算机中存在的串口。如果打开出错,则可能是串口不存在或者已被占用。下面是相应代码:

    Private Sub SerialPortOpen()

        On Error GoTo Err

        If SerialPort.IsOpen = True Then SerialPort.Close() '避免重复打开端口

        SerialPort.Open()

        LabelCOMStatus.Text = "串口已打开"

        Exit Sub

Err:    MsgBox("串口不存在或已被占用!" + vbNewLine + ErrorToString()) '出现错误,显示错误信息

    End Sub

如果想要在串口中支持中文字符收发,则可在初始化时设置串口控件的编码:

SerialPort.Encoding = System.Text.Encoding.Default

发送数据通过Write方法来完成,由于串口调试助手需要支持文本和16进制,需要加入转换代码:

    Private Sub ButtonSendData_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonSendData.Click

        On Error GoTo Err

        Dim outDataBuf As String = TextBoxSend.Text

        If outDataBuf = "" Then Exit Sub '如果输入文本框中没有数据则不发送

        If SerialPort.IsOpen = True Then '判断串口是否打开

            If HexSendFlag = True Then

                '-----------十六进制发送------------

                outDataBuf = outDataBuf.Replace(" ", "") '清除空格与回车

                outDataBuf = outDataBuf.Replace(vbNewLine, "")

                '十六进制数据位数为偶数,例如:FF 00 15 AC 0D

                If outDataBuf.Length Mod 2 <> 0 Then

                    MsgBox("请输入正确的十六进制数,用空格和回车隔开。")

                    Exit Sub

                End If

                Dim outBytes(outDataBuf.Length / 2 - 1) As Byte

                For I As Integer = 1 To outDataBuf.Length - 1 Step 2

                    outBytes((I - 1) / 2) = Val("&H" + Mid(outDataBuf, I, 2)) 'VB的十六进制表示方法,例如0x1D表示为&H1D

                Next

                SerialPort.Write(outBytes, 0, outDataBuf.Length / 2)

                BarCountTx.Text = Val(BarCountTx.Text) + outDataBuf.Length / 2

            Else

                '-------------文本发送--------------

                SerialPort.Write(outDataBuf)

                BarCountTx.Text = Val(BarCountTx.Text) + outDataBuf.Length '发送字节计数

            End If

        Else

            MsgBox("串口未打开,请先打开串口。")

        End If

        Exit Sub

Err:    MsgBox("数据输入或发送错误!" + vbNewLine + ErrorToString())

    End Sub

接收数据采用DataReceived事件,该事件在串口输入缓冲区中的字节数满足设置条件时触发,并执行事件中的代码。事件触发的字节数在ReceivedBytesThreshold属性中设置,默认为1字节。由于DataReceived事件采用了独立的线程,无法对软件界面中的控件进行直接操作,因而在现实时需要采用委托实例的方法。首先建立委托:

    Delegate Sub RecieveRefreshMethodDelegate(ByVal [text] As String) '声明委托

    Dim RecieveRefresh As New RecieveRefreshMethodDelegate(AddressOf RecieveRefreshMethod) '定义数据显示委托实例

    Sub RecieveRefreshMethod(ByVal str As String) '定义一个数据显示委托实例的方法

        ShowRecieveData(str)

End Sub

其中ShowRecieveData函数将str字符串显示到TextBox控件中。

下面是DataReceived事件中对十六进制数据的处理。同发送数据一样,读取数据时也要根据不同的显示方式使用不同的方法。VB.NET通过Read方法,根据缓冲区中存在的字节数读取十六进制数据,而文本显示则简单的多,只需ReadExisting即可。最后通过Invoke方法调用委托,显示数据。

    Private Sub SerialPort_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort.DataReceived

        If HexRecieveFlag Then

            '-----------十六进制显示------------

            Dim inDataLen As Integer = SerialPort.BytesToRead() '获取可读取的字节数

            If inDataLen > 0 Then

                Dim inBytes(inDataLen - 1) As Byte, bytes As Byte

                Dim strHex As String = ""

                SerialPort.Read(inBytes, 0, inDataLen) '读取数据

                For Each bytes In inBytes

                    strHex = strHex + [String].Format("{0:X2} ", bytes) '格式化成十六进制(不含&H

                Next

                TextBoxRecieve.Invoke(RecieveRefresh, strHex) '调用委托,显示接收的数据

                BarCountRx.Text = (Val(BarCountRx.Text) + inDataLen).ToString '接收字节计数

            End If

        Else

            '-------------文本显示--------------

            Dim str As String

            str = SerialPort.ReadExisting '读取全部可用字符串

            TextBoxRecieve.Invoke(RecieveRefresh, str)

            BarCountRx.Text = (Val(BarCountRx.Text) + str.Length).ToString '接收字节计数

        End If

End Sub

至此就实现了串口收发的基本功能,另外的定时收发(使用Timer控件)、文件发送(使用FileSystem)参见附带的源文件代码。

(附件功能完全不给力呀,终于传上来了……)SerialPortElf.rar

在完成串口调试助手的功能后,还可以根据个人的使用习惯或需求,添加相应的功能。

VB.NET写串口助手,亲测可用,简单实用。 网上大大部分都实用AXcom控件而非serial port,各种函数都不一样。 这是一个最新的用serial port 来写的,包括委托的线程的关系。 这是我3年前的一个例子,最近翻出来回忆一下。 串口是计算机上一种非常通用设备通信的协议。大多数计算机包两个基于RS232的串口,现在配电脑好像只有一个。串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。同时,串口通信协议也可以用于获取远程采集设备的数据。串口通信在工控领域用途很广。 串口通信的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。比如IEEE488定义并行通行状态时,规定设备线总常不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。 典型地,串口用于ASCII码字符的传输。通信使用3根线完成:(1)地线,(2)发送,(3)接收。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。其他线用于握手,但是不是必须的。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通行的端口,这些参数必须匹配: a,波特率:这是一个衡量通信速度的参数。它表示每秒钟传送的bit的个数。例如300波特表示每秒钟发送300个bit。当我们提到时钟周期时,我们就是指波特率例如如果协议需要4800波特率,那么时钟是4800Hz。这意味着串口通信在数据线上的采样率为4800Hz。通常电话线的波特率为14400,28800和36600。波特率可以远远大于这些值,但是波特率和距离成反比。高波特率常常用于放置的很近的仪器间的通信,典型的例子就是GPIB设备的通信。 b,数据位:这是衡量通信中实际数据位的参数。当计算机发送一个信息包,实际的数据不会是8位的,标准的值是5、7和8位。如何设置取决于你想传送的信息。比如,标准的ASCII码是0~127(7位)。扩展的ASCII码是0~255(8位)。如果数据使用简单的文本(标准 ASCII码),那么每个数据包使用7位数据。每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。由于实际数据位取决于通信协议的选取,术语“包”指任何通信的情况。
VB.NET是一种基于.NET框架的编程语言,可以用来开发全功能串口调试助手串口调试助手是一种用于辅助调试和监控串口通信的工具,可以发送和接收数据,并提供必要的解析和显示功能。 首先,我们需要创建一个新的VB.NET项目,并添加一个串口控件。通过该串口控件,我们可以实现与串口的连接、发送数据和接收数据的功能。首先,我们需要设置串口的一些基本参数,例如波特率、数据位、校验位和停止位。然后,我们可以通过串口发送数据,并且可以通过事件来处理串口收到的数据。 在开发全功能串口调试助手时,我们应该添加以下功能: 1. 启动/停止串口连接:提供按钮或菜单选项来启动或停止与串口的连接。当连接成功建立时,用户可以进行数据的发送和接收。 2. 发送数据:提供文本输入框或其他控件用于输入要发送的数据,并通过按钮或菜单选项触发发送操作。发送的数据将通过串口发送出去。 3. 接收数据:在接收到数据时,将其显示在接收数据的窗口中。可以使用Textbox控件或列表控件来显示接收的数据,并进行相应的解析和显示。 4. 清除数据:提供一个按钮或菜单选项来清除接收数据的窗口中的数据,以便用户能够及时清空窗口并准备接收新的数据。 5. 状态显示:在界面上显示当前串口连接的状态,例如连接成功或失败,并提供一些错误处理机制。 6. 其他辅助功能:根据具体需求,我们还可以添加其他功能,如数据解析、数据保存和加载等特性。 总之,通过使用VB.NET编写全功能串口调试助手源码,我们可以实现一个便捷的串口调试工具,方便开发人员进行串口通信的调试和监控。
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值