打印

VB.NET开发全功能串口调试助手

[复制链接]
5183|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
FangTT|  楼主 | 2012-12-1 21:44 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
小记: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方法获取计算机中存在的串口。如果打开出错,则可能是串口不存在或者已被占用。下面是相应代码:

[vb] view plaincopy
  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  

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

[vb] view plaincopy
SerialPort.Encoding =System.Text.Encoding.Default  

        发送数据通过Write方法来完成,由于串口调试助手需要支持文本和16进制,需要加入转换代码:
   
[vb] view plaincopy
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事件采用了独立的线程,无法对软件界面中的控件进行直接操作,因而在现实时需要采用委托实例的方法。首先建立委托:

[vb] view plaincopy
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方法调用委托,显示数据。

[vb] view plaincopy
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  
Sub  

        至此就实现了串口收发的基本功能,另外的定时收发(使用Timer控件)、文件发送(使用FileSystem)参见附带的源文件代码。
        SerialPortElf.rar
        在完成串口调试助手的功能后,还可以根据个人的使用习惯或需求,添加相应的功能。

相关帖子

沙发
GoldSunMonkey| | 2012-12-8 22:17 | 只看该作者
嗯,不错啊。

使用特权

评论回复
板凳
xu1xian2| | 2014-12-19 14:04 | 只看该作者
很好

使用特权

评论回复
地板
a7702842| | 2020-6-12 13:41 | 只看该作者
WIN10系统的可以试试这个.相当不错
https://www.microsoft.com/store/apps/9NBLGGH43HDM



使用特权

评论回复
5
gaochy1126| | 2020-6-12 20:03 | 只看该作者
串口软件非常的多呢,需要什么功能可以自己开发。            

使用特权

评论回复
6
gaochy1126| | 2020-8-20 08:49 | 只看该作者
开发串口软件可以使用c#或者QT了,集成了很多的功能

使用特权

评论回复
7
gaochy1126| | 2020-9-13 08:41 | 只看该作者
楼主做的有波形显示的界面吗?                     

使用特权

评论回复
8
gaochy1126| | 2020-10-27 18:37 | 只看该作者
VB.NET开发全功能串口调试助手,不如C#的界面好一些了。   

使用特权

评论回复
9
ligao0302| | 2020-12-8 16:58 | 只看该作者
多谢分享1

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

45

主题

172

帖子

4

粉丝