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开发全功能串口调试助手相关推荐

  1. 多功能串口调试助手XUTOPIA

    多功能串口调试助手XUTOPIA 利用C#基于WPF开发的多功能串口调试助手 概述 在嵌入式开发的过程中,由于经常需要下位机与上位机通信,下位机与上位机之间的通信大多都是串口通信,网上大多数串口调试助 ...

  2. 【C#开源】BCom多功能串口调试助手

    又有一段时间不更新了,这次为大家带来的是我最新开发的BCom多功能串口调试助手,在支持串口功能的前提下,又加入了一些好用的小工具,如截图工具,记事本,计算器,画图等工具,也有一些别的小工具大家可以探索 ...

  3. uart口图片_uart 加强了的串口调试助手,可以自动记录传输数据,并且显示图片,示波器等功能 Com Port 编程 267万源代码下载- www.pudn.com...

    文件名称: uart下载  收藏√  [ 5  4  3  2  1 ] 开发工具: C# 文件大小: 10479 KB 上传时间: 2014-06-06 下载次数: 62 提 供 者: 林元峰 详细 ...

  4. 2.3 基于FPGA的UART协议实现(一)串口信号定义和接线方法-5针串口-9针串口-全功能串口

      通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART.它将要传输的资料在串行通信与并行通信之间加以转换.作为把并行输入信号 ...

  5. 串口调试助手C++源代码 可接收发送串口数据 带接收Echo回环到发送的功能

    串口调试助手C++源代码 可接收发送串口数据 带接收Echo回环到发送的功能 使用说明介绍 1.功能介绍: 简单地实现了串口通信的功能,主要有发送窗口和接收窗口组成.该代码注释详细,并带有说明文档,适 ...

  6. UartAssist,串口调试助手

    UartAssist是一款功能非常强大,且实用性极高的串口调试助手,该软件不仅支持常用的110-115200bps波特率,而且不论是它的端口号.校验位.数据位.停止位等各种数据,在这里通通都可以完美的 ...

  7. Qt实践录:串口调试助手

    由于项目需要使用到串口调试及测试,为了练手,使用 Qt 编写一个串口调试助手.本文按开发的过程进行简单介绍,同时也涉及部分用到的模块代码.详细代码参考源码仓库. 工具特性 具体功能 具备串口收发功能. ...

  8. 【Qt串口调试助手】1.1 - Qt5编写串口调试助手,Qt串口编程

    这章来学习串口数据流操作.仿照已有成品制作一个用Qt开发的串口调试助手. 介于篇幅有限,本篇只介绍一个最简单的能收发的串口调试助手的制作.后续篇幅会陆续对剩余代码进行讲解,并添加各种功能,对显示.操作 ...

  9. 【python】tkinter+pyserial实现串口调试助手

    目录 Python串口调试助手(基于tkinter) 开发环境 需安装的模块: 适合对象: 界面样式 主题修改 完整代码如下: Python串口调试助手(基于tkinter) 新手自学一周的成果:基本 ...

最新文章

  1. jenkins rec 分析 cve-2018-1000861 分析
  2. leetcode算法题--两个字符串的最小ASCII删除和★
  3. Yii2 获取URL的一些方法
  4. fopen需要改写成fopen_s的时候
  5. 解决WSL2中Vmmem内存占用过大问题
  6. mysql的join算法,Mysql Join 连接算法
  7. SecureCRT 文件下载上传
  8. Linux远程桌面服务VNC/XRDP/Xdmcp/SSH+X11转发及其在树莓派上的使用
  9. ADSL宽带路由密码恢复经验详谈
  10. Macbook安装brew
  11. cad道路里程桩号标注_cad桩号标注插件
  12. 穿越沙漠问题c语言算法,沙漠穿越问题_c语言课程设计(9页)-原创力文档
  13. scrapy+selenium之中国裁判文书网文书爬取
  14. 基于Python将图片转换成素描图片
  15. 详解php与mysql的关系
  16. JavaScript中__proto__、prototype和constructor的详细讲解【1】
  17. Qt 画图工具擦除操作,恢复透明色
  18. Python期末复习题:流程控制
  19. Caffe源码(三):layer 分析
  20. 图灵停机问题(The Halting Problem)------巧妙的证明

热门文章

  1. 点云检测--欧式聚类Euclidean Cluster
  2. Xorg屏幕旋转实现方式
  3. [ 后缀数组 ] [ SDOI2008 ] BZOJ4698 Sandy的卡片
  4. App Store 评分和评论:用户评论如何影响 App Store 排名
  5. 抽象类与接口的异同点
  6. 关于转换JSON列表错误导致结果出错的问题
  7. Excel中如何制作双斜线表头和倾斜表头?简单到两步就搞定
  8. 经典时尚风格PS调色动作
  9. matlab 压缩感知矩阵_【精读】基于MATLAB的钢筋下料优化算法
  10. 什么是动态代理?两种常用的动态代理方式