VBNET开发全功能串口调试助手_第1页
VBNET开发全功能串口调试助手_第2页
VBNET开发全功能串口调试助手_第3页
VBNET开发全功能串口调试助手_第4页
VBNET开发全功能串口调试助手_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、-VB.NET开发全功能串口调试助手 含完整工程小记:VB.NET的串口通信用了很长时间了,也只用Write和Read这样的方法,以前都是用这种方式做上位机软件,如此足矣。而前几天研究GSM模块时对串口返回的数据总是把握不好,参考开发板附送的例程,发现采用SerialPort的DataReceived事件,可以实现中断触发式的数据接收。于是想到要自己做一个串口调试助手,在实现根本功能的前提下增加一些方便自己调试的功能。经过断断续续的编写,就做成了下面这个小软件:这个软件能够实现串口调试助手的全部功能,经过通信测试,数据接收性能不亚于吼叫工作室的SAssistant2.2,通过加大输入缓冲区,可

2、以满足大量数据接收。VB.NET的串口通信主要使用VS自带的SerialPort控件,而不是早先的MSm,更具有兼容性,这也是很久以前就放弃VB改用.NET的直接原因。该控件的主要方法、属性如下该数据来自VS的MSDN帮助库:方法说明Open翻开一个新的串行端口连接。Close关闭端口连接,将 IsOpen 属性设置为 false,并释放部 Stream对象。Read已重载。 从 SerialPort 输入缓冲区中读取。ReadByte从 SerialPort 输入缓冲区中同步读取一个字节。ReadCha

3、r从 SerialPort 输入缓冲区中同步读取一个字符。ReadE*isting在编码的根底上,读取 SerialPort 对象的流和输入缓冲区中所有立即可用的字节。ReadLine一直读取到输入缓冲区中的 NewLine 值。ReadTo一直读取到输入缓冲区中的指定 value 的字符串。Write已重载。 将数据写入串行端口输出缓冲区。WriteLine将指定的字符串和 NewLine 值写入输出缓冲区。DiscardInBuffer丢弃来自串行驱动程序的接收缓冲区的数据。Dis

4、cardOutBuffer丢弃来自串行驱动程序的传输缓冲区的数据。GetPortNames获取当前计算机的串行端口名称数组。属性说明PortName获取或设置通信端口,包括但不限于所有可用的  端口。BaudRate获取或设置串行波特率。DataBits获取或设置每个字节的标准数据位长度。Parity获取或设置奇偶校验检查协议。StopBits获取或设置每个字节的标准停顿位数。IsOpen获取一个值,该值指示 SerialPort 对象的翻开或关闭状态。BytesToRead获取接收缓冲区中数据的字节数。BytesToWrite获取发送缓冲区中数据的字节

5、数。Encoding获取或设置传输前后文本转换的字节编码。ReadBufferSize获取或设置 SerialPort 输入缓冲区的大小。ReceivedBytesThreshold获取或设置 DataReceived 事件发生前部输入缓冲区中的字节数。WriteBufferSize获取或设置串行端口输出缓冲区的大小。想要通过串口收发数据,就需要对串口进展配置,包括设置端口、波特率、数据格式如1端口、9600bps、8位数据位、无校验位、1位停顿位等属性,之后通过Open方法翻开串口。翻开串口可通过手动指定,也可以使用GetPortNames方法获取计算

6、机中存在的串口。如果翻开出错,则可能是串口不存在或者已被占用。下面是相应代码:PrivateSubSerialPortOpen()OnErrorGoToErrIfSerialPort.IsOpen =TrueThenSerialPort.Close()'防止重复翻开端口SerialPort.Open()LabelStatus.Te*t ="串口已翻开"E*itSubErr:MsgBo*("串口不存在或已被占用!"+ vbNewLine + ErrorToString()'出现错误,显示错误信息EndSub如果想要在串口中支持中文字符收发,

7、则可在初始化时设置串口控件的编码:发送数据通过Write方法来完成,由于串口调试助手需要支持文本和16进制,需要参加转换代码:PrivateSubButtonSendData_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButtonSendData.ClickOnErrorGoToErrDimoutDataBufAsString= Te*tBo*Send.Te*tIfoutDataBuf ="ThenE*itSub'如果输入文本框中没有数据则不发送IfSerialPort.IsOpen =T

8、rueThen'判断串口是否翻开IfHe*SendFlag =TrueThen'-十六进制发送-outDataBuf = outDataBuf.Replace(" ",")'去除空格与回车outDataBuf = outDataBuf.Replace(vbNewLine,")'十六进制数据位数为偶数,例如:FF 00 15 AC 0DIfoutDataBuf.LengthMod2 <> 0ThenMsgBo*("请输入正确的十六进制数,用空格和回车隔开。")E*itSubEndIfDimou

9、tBytes(outDataBuf.Length / 2 - 1)AsByteForIAsInteger= 1TooutDataBuf.Length - 1Step2outBytes(I - 1) / 2) = Val("&H"+ Mid(outDataBuf, I, 2)'VB的十六进制表示方法,例如0*1D表示为&H1DNe*tSerialPort.Write(outBytes, 0, outDataBuf.Length / 2)BarCountT*.Te*t = Val(BarCountT*.Te*t) + outDataBuf.Length

10、/ 2Else'-文本发送-SerialPort.Write(outDataBuf)BarCountT*.Te*t = Val(BarCountT*.Te*t) + outDataBuf.Length'发送字节计数EndIfElseMsgBo*("串口未翻开,请先翻开串口。")EndIfE*itSubErr:MsgBo*("数据输入或发送错误!"+ vbNewLine + ErrorToString()EndSub接收数据采用DataReceived事件,该事件在串口输入缓冲区中的字节数满足设置条件时触发,并执行事件中的代码。事件触发的字

11、节数在ReceivedBytesThreshold属性中设置,默认为1字节。由于DataReceived事件采用了独立的线程,无法对软件界面中的控件进展直接操作,因而在现实时需要采用委托实例的方法。首先建立委托:DelegateSubRecieveRefreshMethodDelegate(ByValte*tAsString)'声明委托DimRecieveRefreshAsNewRecieveRefreshMethodDelegate(AddressOfRecieveRefreshMethod)'定义数据显示委托实例SubRecieveRefreshMethod(ByValst

12、rAsString)'定义一个数据显示委托实例的方法ShowRecieveData(str)EndSub其中ShowRecieveData函数将str字符串显示到Te*tBo*控件中。下面是DataReceived事件中对十六进制数据的处理。同发送数据一样,读取数据时也要根据不同的显示方式使用不同的方法。VB.NET通过Read方法,根据缓冲区中存在的字节数读取十六进制数据,而文本显示则简单的多,只需ReadE*isting即可。最后通过Invoke方法调用委托,显示数据。PrivateSub SerialPort_DataReceived(ByVal sender

13、 AsObject, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort.DataReceivedIf He*RecieveFlag Then'-十六进制显示-Dim inDataLen AsInteger = SerialPort.BytesToRead() '获取可读取的字节数If inDataLen > 0 ThenDim

14、 inBytes(inDataLen - 1) AsByte, bytes AsByteDim strHe* AsString = "                SerialPort.Read(inBytes, 0, inDataLen) '读取数据ForEach bytes In inBytes 

15、;                   strHe* = strHe* + String.Format("0:*2 ", bytes) '格式化成十六进制不含&HNe*t                T

16、e*tBo*Recieve.Invoke(RecieveRefresh, strHe*) '调用委托,显示接收的数据                BarCountR*.Te*t = (Val(BarCountR*.Te*t) + inDataLen).ToString '接收字节计数EndIfElse'-文本显示-Dim str AsString            str = SerialPort.ReadE*isting '读取全部可用字符串            Te*tBo*Recieve.Invoke(RecieveRefresh, str)     

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论