VBNET开发全功能串口调试助手
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
开发全功能串口调试助手(含完整工程)
小记: 的串口通信用了很长时间了,也只用 Write 和Read 这样的方 法,以前都是用这种方式做上位机软件, 如此足矣。而前几天研究GSM 模块时对 串口返回的数据总是把握不好,参考开发板附送的例程,发现采用
SerialPort
的DataReceived 事件,可以实现中断触发式的数据接收。于是想到要自己做一 个串口调试助手,在实现基本功能的前提下增加一些方便自己调试的功能。 经过
断断续续的编写,就做成了下面这个小软件:
这个软件能够实现串口调试助手的全部功能,经过通信测试,数据接收性能 不亚于呼啸工作室的SComAssistant2.2,通过加大输入缓冲区,可以满足大量 数据接收。
的串口通信主要使用 VS 自带的SerialPort 控件,而不是早先的 MSComm 更具有兼容性,这也是很久以前就放弃 VB 改用.NET 的直接原因。该控 件的主要方法、属性如下(该数据来自 VS 的MSD
帮助库):
想要通过串口收发数据,就需要对串口进行配置,包括设置端口、波特率、数据格式(如COM端口、9600bps、8位数据位、无校验位、1位停止位)等属性,之后通过Open方法打开串口。打开串口可通过手动指定,也可以使用GetPortNames 方法获取计算机中存在的串口。如果打开出错,则可能是串口不存在或者已被占用。下面是相应代码:
Private SubSerialPortOpen()
On Error GoToErr
If SerialPort.IsOpen = True ThenSerialPort.Close() '避免重复打开端
口
SerialPort.Ope n()
LabelCOMStatus.Text ="串口已打开"
Exit Sub
Err: MsgBox(‘ 串口不存在或已被占用!" + vbNewLine + ErrorToString()) ' 出现错误,显示错误信息
En dSub
如果想要在串口中支持中文字符收发,则可在初始化时设置串口控件的编码:
SerialPort.E ncodi ng = System.Text.E ncodi ng.Default
发送数据通过Write方法来完成,由于串口调试助手需要支持文本和16进制, 需要加入转换代码:
Private SubButtonSendData_Click( ByVal sender AsSystem.Object, ByVal e AsSystem.EventArgs) Handles ButtonSendData.Click
On Error GoToErr
DimoutDataBuf AsString = TextBoxSend.Text
If outDataBuf = "" ThenExit Sub'如果输入文本框中没有数据则不发送
If SerialPort.lsOpen = True Then'判断串口是否打开
If HexSendFlag = True Then
' ----- 十六进制发送------------
outDataBuf = outDataBuf.Replace( "","")'清除空格与回车
outDataBuf = outDataBuf.Replace(vbNewLine, "")
'十六进制数据位数为偶数,例如:FF 00 15 AC 0D
If outDataBuf.Length Mod2 <> 0 Then
MsgBoxC请输入正确的十六进制数,用空格和回车隔开。")
Exit Sub
En dIf
DimoutBytes(outDataBuf.Length / 2 - 1) As Byte
For I As Integer = 1 TooutDataBuf.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)
BarCou ntTx.Text = Val(BarCou ntTx.Text) + outDataBuf.Le ngth / 2
Else
' ------- 文本发送 --------------
SerialPort.Write(outDataBuf)
BarCountTx.Text = Val(BarCountTx.Text) + outDataBuf.Length '发送字节计数
En dIf
Else
MsgBox"串口未打开,请先打开串口。")
En dIf
Exit Sub
Err: MsgBox(‘ 数据输入或发送错误!" + vbNewL ine + ErrorToStri ng())
En dSub
接收数据采用DataReceived事件,该事件在串口输入缓冲区中的字节数满足
设置条件时触发,并执行事件中的代码。事件触发的字节数在ReceivedBytesThreshold 属性中设置,默认为1字节。由于DataReceived事件采用了独立的线程,无法对软件界面中的控件进行直接操作,因而在现实时需要采用委托实例的方法。首先建立委托:
Delegate SubRecieveRefreshMethodDelegate( ByVal [text] As String )'声
明委托
Dim RecieveRefresh AsNewRecieveRefreshMethodDelegate( AddressOf Recie veRefreshMethod)'定义数据显示委托实例
Sub RecieveRefreshMethod( ByVal str As String )'定义一个数据显示委托实例的方法
ShowRecieveData(str)
EndSub
其中ShowRecieveData函数将str字符串显示到TextBox控件中。