VBNET开发全功能串口调试助手

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

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

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

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

想要通过串口收发数据,就需要对串口进行配置,包括设置端口、波特率、数据格式(如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 S ystem.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 Mod2 <> 0Then

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

Exit Sub

End If

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

For I As Integer= 1To outDataBuf.Length - 1Step2

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 Reciev eRefreshMethod)'定义数据显示委托实例

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

ShowRecieveData(str)

相关文档
最新文档