【搬家】VB.NET开发全功能串口调试助手
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 ErrIf SerialPort.IsOpen= True Then SerialPort.Close() '避免重复打开端口SerialPort.Open()LabelCOMStatus.Text= "串口已打开"Exit SubErr: 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.ClickOn Error GoTo ErrDim outDataBuf As String =TextBoxSend.TextIf outDataBuf= "" Then Exit Sub '如果输入文本框中没有数据则不发送If SerialPort.IsOpen= True Then '判断串口是否打开If HexSendFlag= True Then'-----------十六进制发送------------outDataBuf= outDataBuf.Replace(" ", "") '清除空格与回车outDataBuf= outDataBuf.Replace(vbNewLine, "")'十六进制数据位数为偶数,例如:FF 00 15 AC 0DIf outDataBuf.Length Mod 2<> 0 ThenMsgBox("请输入正确的十六进制数,用空格和回车隔开。")Exit SubEnd IfDim outBytes(outDataBuf.Length/ 2 - 1) As ByteFor I As Integer =1 To outDataBuf.Length- 1 Step 2outBytes((I- 1) / 2) = Val("&H" + Mid(outDataBuf, I,2)) 'VB的十六进制表示方法,例如0x1D表示为&H1DNextSerialPort.Write(outBytes,0, outDataBuf.Length / 2)BarCountTx.Text= Val(BarCountTx.Text) + outDataBuf.Length / 2Else'-------------文本发送--------------SerialPort.Write(outDataBuf)BarCountTx.Text= Val(BarCountTx.Text) + outDataBuf.Length '发送字节计数End IfElseMsgBox("串口未打开,请先打开串口。")End IfExit 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.DataReceivedIf HexRecieveFlag Then'-----------十六进制显示------------Dim inDataLen As Integer =SerialPort.BytesToRead() '获取可读取的字节数If inDataLen> 0 ThenDim inBytes(inDataLen- 1) As Byte,bytes As ByteDim strHex As String = ""SerialPort.Read(inBytes,0, inDataLen) '读取数据For Each bytes In inBytesstrHex= strHex + [String].Format("{0:X2} ", bytes) '格式化成十六进制(不含&H)NextTextBoxRecieve.Invoke(RecieveRefresh,strHex) '调用委托,显示接收的数据BarCountRx.Text= (Val(BarCountRx.Text) + inDataLen).ToString '接收字节计数End IfElse'-------------文本显示--------------Dim str As Stringstr= SerialPort.ReadExisting '读取全部可用字符串TextBoxRecieve.Invoke(RecieveRefresh,str)BarCountRx.Text= (Val(BarCountRx.Text) + str.Length).ToString '接收字节计数End If
End Sub
至此就实现了串口收发的基本功能,另外的定时收发(使用Timer控件)、文件发送(使用FileSystem)参见附带的源文件代码。
SerialPortElf.rar
在完成串口调试助手的功能后,还可以根据个人的使用习惯或需求,添加相应的功能。
【搬家】VB.NET开发全功能串口调试助手相关推荐
- 多功能串口调试助手XUTOPIA
多功能串口调试助手XUTOPIA 利用C#基于WPF开发的多功能串口调试助手 概述 在嵌入式开发的过程中,由于经常需要下位机与上位机通信,下位机与上位机之间的通信大多都是串口通信,网上大多数串口调试助 ...
- 【C#开源】BCom多功能串口调试助手
又有一段时间不更新了,这次为大家带来的是我最新开发的BCom多功能串口调试助手,在支持串口功能的前提下,又加入了一些好用的小工具,如截图工具,记事本,计算器,画图等工具,也有一些别的小工具大家可以探索 ...
- uart口图片_uart 加强了的串口调试助手,可以自动记录传输数据,并且显示图片,示波器等功能 Com Port 编程 267万源代码下载- www.pudn.com...
文件名称: uart下载 收藏√ [ 5 4 3 2 1 ] 开发工具: C# 文件大小: 10479 KB 上传时间: 2014-06-06 下载次数: 62 提 供 者: 林元峰 详细 ...
- 2.3 基于FPGA的UART协议实现(一)串口信号定义和接线方法-5针串口-9针串口-全功能串口
通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART.它将要传输的资料在串行通信与并行通信之间加以转换.作为把并行输入信号 ...
- 串口调试助手C++源代码 可接收发送串口数据 带接收Echo回环到发送的功能
串口调试助手C++源代码 可接收发送串口数据 带接收Echo回环到发送的功能 使用说明介绍 1.功能介绍: 简单地实现了串口通信的功能,主要有发送窗口和接收窗口组成.该代码注释详细,并带有说明文档,适 ...
- UartAssist,串口调试助手
UartAssist是一款功能非常强大,且实用性极高的串口调试助手,该软件不仅支持常用的110-115200bps波特率,而且不论是它的端口号.校验位.数据位.停止位等各种数据,在这里通通都可以完美的 ...
- Qt实践录:串口调试助手
由于项目需要使用到串口调试及测试,为了练手,使用 Qt 编写一个串口调试助手.本文按开发的过程进行简单介绍,同时也涉及部分用到的模块代码.详细代码参考源码仓库. 工具特性 具体功能 具备串口收发功能. ...
- 【Qt串口调试助手】1.1 - Qt5编写串口调试助手,Qt串口编程
这章来学习串口数据流操作.仿照已有成品制作一个用Qt开发的串口调试助手. 介于篇幅有限,本篇只介绍一个最简单的能收发的串口调试助手的制作.后续篇幅会陆续对剩余代码进行讲解,并添加各种功能,对显示.操作 ...
- 【python】tkinter+pyserial实现串口调试助手
目录 Python串口调试助手(基于tkinter) 开发环境 需安装的模块: 适合对象: 界面样式 主题修改 完整代码如下: Python串口调试助手(基于tkinter) 新手自学一周的成果:基本 ...
最新文章
- jenkins rec 分析 cve-2018-1000861 分析
- leetcode算法题--两个字符串的最小ASCII删除和★
- Yii2 获取URL的一些方法
- fopen需要改写成fopen_s的时候
- 解决WSL2中Vmmem内存占用过大问题
- mysql的join算法,Mysql Join 连接算法
- SecureCRT 文件下载上传
- Linux远程桌面服务VNC/XRDP/Xdmcp/SSH+X11转发及其在树莓派上的使用
- ADSL宽带路由密码恢复经验详谈
- Macbook安装brew
- cad道路里程桩号标注_cad桩号标注插件
- 穿越沙漠问题c语言算法,沙漠穿越问题_c语言课程设计(9页)-原创力文档
- scrapy+selenium之中国裁判文书网文书爬取
- 基于Python将图片转换成素描图片
- 详解php与mysql的关系
- JavaScript中__proto__、prototype和constructor的详细讲解【1】
- Qt 画图工具擦除操作,恢复透明色
- Python期末复习题:流程控制
- Caffe源码(三):layer 分析
- 图灵停机问题(The Halting Problem)------巧妙的证明