VB.NET开发全功能串口调试助手
By Nightmare 2011-07-16 @Xinxiang
小记: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,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 SubErr: 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,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 IfEnd Sub
至此就实现了串口收发的基本功能,另外的定时收发(使用Timer控件)、文件发送(使用fileSystem)参见附带的源文件代码。
SerialPortElf.rar
在完成串口调试助手的功能后,还可以根据个人的使用习惯或需求,添加相应的功能。
总结以上是内存溢出为你收集整理的【搬家】VB.NET开发全功能串口调试助手全部内容,希望文章能够帮你解决【搬家】VB.NET开发全功能串口调试助手所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)