VB串口通信(附图教程)
- 格式:pdf
- 大小:199.77 KB
- 文档页数:7
vb串口通信控件-mscommMSComm控件提供了两种处理通信的方式:一种为事件驱动方式,该方式相当于一般程序设计中的中断方式。
当串口发生事件或错误时,MSComm控件会产生OnComm事件,用户程序可以捕获该事件进行相应处理。
本文的两个例子均采用该方式。
另一种为查询方式,在用户程序中设计定时或不定时查询 MSComm控件的某些属性是否发生变化,从而确定相应处理。
在程序空闲时间较多时可以采用该方式。
常用属性和方法利用MSComm控件实现计算机通信的关键是理解并正确设置MSComm控件众多属性和方法。
以下是MSComm控件的常用属性和方法:●Commport:设置或返回串口号。
●Settings:以字符串的形式设置或返回串口通信参数。
●Portopen:设置或返回串口状态。
●InputMode:设置或返回接收数据的类型。
●Inputlen:设置或返回一次从接收缓冲区中读取字节数。
●InBufferSize:设置或返回接收缓冲区的大小,缺省值为1024字节。
●InBufferCount:设置或返回接收缓冲区中等待计算机接收的字符数。
●Input:从接收缓冲区中读取数据并清空该缓冲区,该属性设计时无效,运行时只读。
●OutBufferSize:设置或返回发送缓冲区的大小,缺省值为512字节。
●OutBufferCount:设置或返回发送缓冲区中等待计算机发送的字符数。
●Output:向发送缓冲区发送数据,该属性设计时无效,运行时只读。
●Rthreshold:该属性为一阀值。
当接收缓冲区中字符数达到该值时,MSComm控件设置Commevent属性为ComEvReceive,并产生OnComm事件。
用户可在OnComm事件处理程序中进行相应处理。
若Rthreshold属性设置为0,则不产生OnComm事件。
例如用户希望接收缓冲区中达到一个字符就接收一个字符,可将Rthreshold设置为1。
这样接收缓冲区中接收到一个字符,就产生一次OnComm事件。
vb程序实现串口通信,将接到的数据动态保存,并可以图表绘制曲线(X:时间,Y:数据)将接到的数据赋值于全局变量,通过ADO数据控件连接数据库及表,用以下代码保存数据: Private Sub Timer1_Timer()If Label1.Caption <> CStr(Time$) ThenLabel1.Caption = Time$sum_zj = sum_zj + 1Text3 = sum_zj'校准If sum_zj >= 3 Thensum_zj1 = sum_zj1 + 1sum_zj = sum_zj - 3Text4 = sum_zj1Adodc1.Recordset.AddNew '每3秒记录一组数据Adodc1.Recordset(0) = shiY AnHAdodc1.Recordset(1) = Mid(Time$, 1, 2) & Mid(Time$, 4, 2) & Mid(Time$, 7, 2) '记录time Adodc1.Recordset(2) = record_jm(0) '记录数据Adodc1.Recordset(3) = record_jm(1) '记录数据Adodc1.Recordset(4) = record_jm(2) '记录数据Adodc1.Recordset(5) = record_jm(3) '记录数据Adodc1.Recordset(6) = record_jm(4) '记录数据Adodc1.Recordset(7) = record_jm(5) '记录数据Adodc1.Recordset(8) = record_jm(6) '记录数据Adodc1.Recordset(9) = record_jm(7) '记录数据Adodc1.Recordset(10) = record_jm(8) '记录数据Adodc1.Recordset(11) = record_jm(9) '记录数据Adodc1.Recordset(12) = record_jm(10) '记录数据Adodc1.Recordset(13) = record_jm(11) '记录数据Adodc1.Recordset.UpdateEnd IfEnd IfEnd SubPrivate Sub Timer2_Timer()Picture4.DrawStyle = 0以下代码绘制实时曲线(6点):Picture4.DrawWidth = 3 ' = dashPicture4.Line (sum_z1 * 18 + 500, record_jm(0) * -150 + 7900)-(sum_z1 * 18 + 500, record_jm(2) * -150 + 7900), vbRed ', BFPicture4.Line (sum_z1 * 18 + 500, record_jm(1) * -150 + 7900)-(sum_z1 * 18 + 500, record_jm(3) * -150 + 7900), vbCyan ', BFPicture4.Line (sum_z1 * 18 + 500, record_jm(2) * -150 + 7900)-(sum_z1 * 18 + 500, record_jm(4) * -150 + 7900), vbBlack ', BFPicture4.Line (sum_z1 * 18 + 500, record_jm(3) * -150 + 7900)-(sum_z1 * 18 + 500, record_jm(5) * -150 + 7900), vbMagenta ', BFPicture4.Line (sum_z1 * 18 + 500, record_jm(4) * -150 + 7900)-(sum_z1 * 18 + 500, record_jm(6) * -150 + 7900), vbGreen ', BFPicture4.Line (sum_z1 * 18 + 500, record_jm(5) * -150 + 7900)-(sum_z1 * 18 + 500, record_jm(7) * -150 + 7900), vbBlue ', BFEnd SubPrivate Sub Timer3_Timer()If Label32 <> CStr(Time$) Then 'Label1.CaptionLabel32.Caption = Time$sum_z = sum_z + 1Text31 = sum_z'校准If sum_z >= 5 Thensum_z = sum_z - 5sum_z1 = sum_z1 + 1Text30 = sum_z1End IfEnd IfEnd Sub以下代码绘制曲线的坐标:Private Sub Form_Load()With Adodc1Adodc1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\kongtiao\cartemp.mdb;Persist Security Info=False"Adodc1.RecordSource = "select * form car_bm"End WithText1 = ""Text2 = "": Text3 = "": Text4 = "":Text5 = "": Text6 = "": Text7 = "": Text12 = ""Text8 = "": Text9 = "": Text10 = "": Text11 = ""Text13 = "": Text14 = "": Text15 = "": Text16 = ""'Load frmMaincolvb = vbBlackxx = 100yy = 150txt = "℃"wp = xp(colvb, xx, yy, txt)xx = 200yy = 350txt = "50"wp = xp(colvb, xx, yy, txt)xx = 200yy = 1850wp = xp(colvb, xx, yy, txt) yy = 3350xx = 200txt = "30"wp = xp(colvb, xx, yy, txt) xx = 200yy = 4850txt = "20"wp = xp(colvb, xx, yy, txt) xx = 200yy = 6350txt = "10"wp = xp(colvb, xx, yy, txt) 'Time坐标colvb = vbRedyy = 6500xx = 400txt = "0"wp = xp(colvb, xx, yy, txt) xx = 1480txt = "5"wp = xp(colvb, xx, yy, txt) xx = 2560txt = "10"wp = xp(colvb, xx, yy, txt) xx = 3640txt = "15"wp = xp(colvb, xx, yy, txt) xx = 4720txt = "20"wp = xp(colvb, xx, yy, txt) xx = 5800txt = "25 min"wp = xp(colvb, xx, yy, txt) xx = 6880txt = "30"wp = xp(colvb, xx, yy, txt) xx = 7960txt = "35"wp = xp(colvb, xx, yy, txt) xx = 9040txt = "40"wp = xp(colvb, xx, yy, txt)txt = "45"wp = xp(colvb, xx, yy, txt)xx = 11200txt = "50"wp = xp(colvb, xx, yy, txt)'画格Picture1.DrawWidth = 1 ' = dashPicture1.DrawStyle = 0Picture1.ForeColor = vbCyanFor i = 0 To 39Picture4.Line (450, 550 + i * 150)-(500, 550 + i * 150) NextPicture4.DrawStyle = 2For i = 0 To 8Picture4.Line (450, 400 + i * 750)-(11300, 400 + i * 750) NextFor i = 0 To 15Picture4.Line (450, 1000 + i * 300)-(500, 1000 + i * 300) NextFor i = 0 To 10Picture4.Line (500 + i * 1080, 400)-(500 + i * 1080, 6400) NextPicture4.DrawStyle = 0End Sub。
界面如下:代码如下:Private Sub Form_Load()If MSComm1.PortOpen = True Then MSComm1.PortOpen = False ElseEnd IfCombo1.AddItem "COM1"Combo1.AddItem "COM2"Combo1.AddItem "COM3"Combo1.AddItem "COM4"Combo1.AddItem "COM5"Combo1.AddItem "COM6"Combo1.AddItem "COM7"Combo1.AddItem "COM8"Combo1.AddItem "COM9"Combo1.AddItem "COM10" Combo1.AddItem "COM11" Combo1.AddItem "COM12"Combo1.AddItem "COM13"Combo1.AddItem "COM14"Combo1.AddItem "COM15"Combo1.AddItem "COM16"Combo1.ListIndex = 2Combo2.AddItem "256000"Combo2.AddItem "128000"Combo2.AddItem "115200"Combo2.AddItem "57600"Combo2.AddItem "38400"Combo2.AddItem "28800"Combo2.AddItem "19200"Combo2.AddItem "14400"Combo2.AddItem "12800"Combo2.AddItem "11520"Combo2.AddItem "9600"Combo2.AddItem "4800"Combo2.AddItem "2400"Combo2.AddItem "1200"Combo2.AddItem "600"Combo3.AddItem "无None"Combo3.AddItem "奇Odd"Combo3.AddItem "偶Even"Combo4.AddItem "4"Combo4.AddItem "5"Combo4.AddItem "6"Combo4.AddItem "7"Combo4.AddItem "8"Combo5.AddItem "1"Combo5.AddItem "2"mPort = Combo1.ListIndex + 1 MSComm1.Settings = "9600,n,8,1"ComOpen.Caption = "打开串口"Shape1.FillColor = &HFFFFC0End SubPrivate Sub ComOpen_Click()On Error GoTo uerror '发现错误跳转到错误处理If ComOpen.Caption = "关闭串口" ThenMSComm1.PortOpen = FalseComOpen.Caption = "打开串口" '按钮文字改变Shape1.FillColor = &HFFFFC0 '灯颜色改变ElseMSComm1.PortOpen = TrueComOpen.Caption = "关闭串口"Shape1.FillColor = &HFFEnd IfExit Subuerror:msg$ = "无效端口号" '错误显示Title$ = "串口调试助手"X = MsgBox(msg$, 48, Title$) '48标示显示警告图标End SubPrivate Sub MSComm1_OnComm()Dim BytReceived() As ByteDim strBuff As StringDim i As IntegerSelect Case mEvent '事件发生Case 2ClsMSComm1.InputLen = 0 '读入缓冲区全部内容strBuff = MSComm1.Input '读入到缓冲区Label10.Caption = Label10.Caption + Len(strBuff) '接收计数If MSComm1.InputMode = comInputModeBinary ThenBytReceived() = strBuff '如果是二进制接收模式则进行数据处理,否则直接显示字符串For i = 0 To UBound(BytReceived)If Len(Hex(BytReceived(i))) = 1 ThenstrData = strData & "0" & Hex(BytReceived(i)) & " " '如果只有一个字符,则前补0,如F显示0F,最后补空格Else '方便显示观察如:00 0F FEstrData = strData & Hex(BytReceived(i)) & " "End IfNextTextReceive = TextReceive & strDatastrData = ""ElseTextReceive = TextReceive & strBuffEnd IfEnd SelectEnd SubPrivate Sub ComSend1_Click() '手动发送Dim Temp(0) As ByteDim strBuff As StringIf Option1.Value = True Then '如果显示16进制发送则进行16进制处理,这里只发送一个Temp(0) = "&H" & TextSendMSComm1.Output = Temp '发送一个16进制ElsestrBuff = TextSendEnd IfIf MSComm1.PortOpen = False ThenMsgBox "请打开串口"End IfOn Error GoTo uerrorMSComm1.Output = strBuffLabel11.Caption = Label11.Caption + Len(strBuff) '发送计数uerror:End SubPrivate Sub ComSend2_Click()If ComSend2.Caption = "自动发送" ThenComSend2.Caption = "关闭自动发送"Timer1.Interval = TextTime.TextTimer1.Enabled = TrueElseComSend2.Caption = "自动发送"Timer1.Enabled = FalseEnd IfEnd SubPrivate Sub ComClean1_Click()TextSend.Text = "" '清空发送窗口End SubPrivate Sub Option3_Click()MSComm1.InputMode = comInputModeBinary '选择接收方式End SubPrivate Sub Option4_Click()MSComm1.InputMode = comInputModeText '选择接收方式End SubPrivate Sub Timer1_Timer()Call ComSend1_Click '定时调用手动发送End SubPrivate Sub Timer2_Timer()If Combo3 = "无None" ThenMSComm1.Settings = Str(Combo2) + "N" + Str(Combo4) + Str(Combo5) ElseIf Combo3 = "奇Odd" ThenMSComm1.Settings = Str(Combo2) + "O" + Str(Combo4) + Str(Combo5) ElseIf Combo3 = "偶Even" ThenMSComm1.Settings = Str(Combo2) + "E" + Str(Combo4) + Str(Combo5) End IfEnd SubPrivate Sub Combo1_Click()If MSComm1.PortOpen = True Then '如果串口打开先关闭后再进行其他操作MSComm1.PortOpen = FalseEnd IfmPort = Combo1.ListIndex + 1 '读取com口号End SubPrivate Sub ComClean3_Click()Label10.Caption = 0Label11.Caption = 0End SubPrivate Sub ComClean2_Click()TextReceive.Text = "" '接收窗口End Sub功能上:实现了字符串的发送和接收,8位数据的十六进制发送和接收,有端口,波特率等设置。
VB实现串口通讯目前,Visual Basic (简称VB)已成为WINDOWS 系统开发的主要语言,以其高效、简单易学及功能强大的特点越来越为广大程序设计人员及用户所青睐。
VB 支持面向对象的程序设计,具有结构化的事件驱动编程模式并可以使用无限扩增的控件。
在VB 应用程序中可以方便地调用WINDOWS API函数,使得编程效率提高,应用功能增强。
利用VB 提供的这些功能,我们可以有三种方法完成串口通信。
一种是用VB 提供的具有强大功能的通信控件;另一种方法是调用WINDOWS API 函数,使用WINDOWS 提供的通信函数编写移植性强的应用程序;第三是利用文件的输入/ 输出完成,该方法简便易行,但有一定的局限性。
一、利用通信控件(MSCOMM)完成串口通信VB 提供了通信控件MSCOMM,文件名为MSCOMM. VBX。
该控件可设置串行通信的数据发送和接收,对串口状态及串行通信的信息格式和协议进行设置。
在通信过程中可以触发OnComm事件,在该事件过程进行数据检验处理及检错,还可以通过编程访问CommEvent 属性来了解通信的情况,进行收发数据的处理。
每个通信控件对应一个串口,如果要访问多个通信口,则要设计多个通信控件。
1、通信控件的事件及基本属性(1)事件OnComm:通信控件只提供了一个事件,该事件的触发可以对串口的通信事件及错误进行处理。
通过对CommEvent 属性的判断可知当前的通信错误和事件,分别对每个CommEvent 值进行编程就完成了对各个错误和事件的处理。
如:CommEvent = MSCOMM—EV—SEND 表示发送事件。
这些信息可从VB 提供的常量文件CONSTANT. TXT中查出。
(2)属性CommPort :设置通信控件与哪个串口相连接,设置并返回通信口号。
Setting :设置通信的信息格式,为字符型。
顺序为:波特率、校验、数据位、停止位。
PortOpen :布尔型、开关通信口。
利用VB如何进行串口读写在VB中,可以使用SerialPort类来进行串口读写操作。
以下是使用VB进行串口读写的一般步骤:1. 引用System.IO.Ports命名空间:在代码文件的顶部,添加Imports System.IO.Ports命名空间,以便可以使用SerialPort类。
2. 创建SerialPort对象:在代码中创建SerialPort对象,并设置串口的各种属性,如端口名称、波特率、数据位、校验位、停止位等。
例如:```vbDim serialPort As New SerialPortserialPort.PortName = "COM1"serialPort.BaudRate = 9600serialPort.Parity = Parity.NoneserialPort.DataBits = 8serialPort.StopBits = StopBits.One```3. 打开串口:使用serialPort.Open(方法打开串口,并检查串口是否成功打开。
例如:```vbTryserialPort.OpenIf serialPort.IsOpen ThenMessageBox.Show("串口已打开")End IfCatch ex As ExceptionMessageBox.Show("串口打开失败:" & ex.Message)End Try```4. 读取串口数据:使用serialPort.DataReceived事件来处理接收到的数据。
例如:```vbPrivate Sub serialPort_DataReceived(sender As Object, e As SerialDataReceivedEventArgs) Handles serialPort.DataReceived Dim receivedData As String = serialPort.ReadExisting'处理接收到的数据End Sub```5. 写入串口数据:使用serialPort.Write(方法向串口写入数据。
VB串口编程实例介绍VB(Visual Basic)是一种基于对象的编程语言,可用于开发Windows应用程序。
串口编程是指通过串行通信接口与外部设备进行数据交互。
本文将介绍如何使用VB进行串口编程,以实现与外部设备的通信。
前提条件在开始编写VB串口程序之前,需要确保以下条件已满足: - 安装了Visual Studio开发环境,可以选择最新版本的Visual Studio Community免费版。
- 确保计算机上有可用的串口(如COM1、COM2等)或USB转串口适配器。
步骤1. 创建新项目打开Visual Studio,选择创建一个新的VB Windows应用程序项目。
2. 添加控件在窗体上添加以下控件: - 一个ListBox控件用于显示接收到的数据。
- 两个Button控件分别用于打开和关闭串口。
- 一个ComboBox控件用于选择串口号。
- 一个TextBox控件用于输入要发送的数据。
- 一个Button控件用于发送数据。
3. 设置串口属性在窗体代码中添加如下代码:Imports System.IO.PortsPublic Class Form1Dim serialPort As New SerialPort()Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Lo ad' 获取可用的串口号并添加到ComboBox中Dim ports As String() = SerialPort.GetPortNames()ComboBox1.Items.AddRange(ports)End SubPrivate Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click' 打开串口TryserialPort.PortName = ComboBox1.SelectedItem.ToString()serialPort.BaudRate = 9600serialPort.Parity = Parity.NoneserialPort.DataBits = 8serialPort.StopBits = StopBits.OneserialPort.Open()Button1.Enabled = FalseButton2.Enabled = TrueCatch ex As ExceptionMessageBox.Show("无法打开串口:" + ex.Message)End TryEnd SubPrivate Sub Button2_Click(sender As Object, e As EventArgs) Handles Button 2.Click' 关闭串口TryserialPort.Close()Button1.Enabled = TrueButton2.Enabled = FalseCatch ex As ExceptionMessageBox.Show("无法关闭串口:" + ex.Message)End TryEnd SubEnd Class4. 接收数据和发送数据在窗体代码中添加如下代码:Imports System.IO.PortsPublic Class Form1Dim serialPort As New SerialPort()Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Lo ad' 获取可用的串口号并添加到ComboBox中Dim ports As String() = SerialPort.GetPortNames()ComboBox1.Items.AddRange(ports)End SubPrivate Sub Button1_Click(sender As Object, e As EventArgs) Handles Button 1.Click' 打开串口' 省略部分代码...AddHandler serialPort.DataReceived, AddressOf DataReceivedHandlerserialPort.Open()Button1.Enabled = FalseButton2.Enabled = TrueEnd SubPrivate Sub Button2_Click(sender As Object, e As EventArgs) Handles Button 2.Click' 关闭串口' 省略部分代码...RemoveHandler serialPort.DataReceived, AddressOf DataReceivedHandler serialPort.Close()Button1.Enabled = TrueButton2.Enabled = FalseEnd SubPrivate Sub DataReceivedHandler(sender As Object, e As SerialDataReceivedE ventArgs)' 接收数据并显示在ListBox中Dim data As String = serialPort.ReadLine()ListBox1.Invoke(Sub() ListBox1.Items.Add(data))End SubPrivate Sub Button3_Click(sender As Object, e As EventArgs) Handles Button 3.Click' 发送数据If serialPort.IsOpen ThenDim dataToSend As String = TextBox1.TextserialPort.WriteLine(dataToSend)TextBox1.Clear()ElseMessageBox.Show("请先打开串口")End IfEnd SubEnd Class5. 运行程序点击运行按钮,程序将打开一个窗口,其中包含串口选择、打开/关闭串口、接收数据和发送数据的功能。
vb串口通信编程一、概述串口通讯作为一种古老而又灵活的通讯方式,被广泛地应用于PC间的通讯以及PC和单片机之间的通讯之中。
提到串口通讯的编程,人们往往立刻想到C、汇编等对系统底层操作支持较好的编程语言以及大串繁琐的代码。
实际上,只要我们借助相关ActiveX控件的帮助,即使是在底层操作一向不被人看好的VB中,一样能够实现串口通讯,甚至其实现方法和C、汇编相比,要更加快捷方便。
下面,笔者就介绍一下在VB中实现串口通讯的方法。
在Visual Basic中有一个名为Microsoft Communication Control(简称MSComm)的通讯控件。
我们只要通过对此控件的属性和事件进行相应编程操作,就可以轻松地实现串口通讯。
下面,笔者就简要地介绍一下MSComm控件的使用方法。
二、MSComm控件的主要属性、事件1、MSComm的属性由于MSComm控件属性很多,在此笔者仅介绍与实现串口通讯密切相关的核心属性。
Commport:设置通讯所占用的串口号。
如设成1(默认值),表示对Com1进行操作。
Setting:对串口通讯的相关参数。
包括串口通讯的比特率,奇偶校验,数据位长度、停止位等。
其默认值是“9600,N,8,1”,表示串口比特率是9600bit/s,不作奇偶校验,8位数据位,1个停止位。
Portopen:设置串口状态,值为True时打开串口,值为False时关闭串口。
Input:从输入寄存器读取数据,返回值为从串口读取的数据内容,同时输入寄存器将被清空。
Ouput:发送数据到输出寄存器。
InBufferCount:设置输入寄存器所存储的字符数,当将其值设为0时,则输入寄存器将被清空。
InputMode:设置从输入寄存器中读取数据的形式。
若值为0,则表示以文本形式读取;值为1,则表示以二进制形式读取。
OutBufferCount:设置输出寄存器所存储的字符数,当将其值设为0时,则输出寄存器将被清空。
VB串口通信目前,Visual Basic (简称VB)已成为WINDOWS 系统开发得主要语言,以其高效、简单易学及功能强大得特点越来越为广大程序设计人员及用户所青睐。
VB 支持面向对象得程序设计,具有结构化得事件驱动编程模式并可以使用无限扩增得控件。
在VB 应用程序可以方便地调用WINDOWS API函数,使得编程效率提高,应用功能增强。
利用VB 提供得这些功能,我们可以有三种方法完成串口通信。
一种就是用VB 提供得具有强大功能得通信控件;另一种方法就是调用WINDOWS API 函数,使用WINDOWS 提供得通信函数编写移植性强得应用程序;第三就是利用文件得输入/ 输出完成,该方法简便易行,但有一定得局限性。
一、利用通信控件(MSCOMM)完成串口通信VB 提供了通信控件MSCOMM,文件名为MSCOMM、VBX。
该控件可设置串行通信得数据发送与接收,对串口状态及串行通信得信息格式与协议进行设置。
在通信过程中可以触发OnComm事件,在该事件过程进行数据检验处理及检错,还可以通过编程访问CommEvent 属性来了解通信得情况,进行收发数据得处理。
每个通信控件对应一个串口,如果要访问多个通信口,则要设计多个通信控件。
1、通信控件得事件及基本属性(1)事件OnComm:通信控件只提供了一个事件,该事件得触发可以对串口得通信事件及错误进行处理。
通过对CommEvent 属性得判断可知当前得通信错误与事件,分别对每个CommEvent 值进行编程就完成了对各个错误与事件得处理。
如:CommEvent = MSCOMM—EV—SEND 表示发送事件。
这些信息可从VB 提供得常量文件CONSTANT、TXT中查出。
(2)属性CommPort :设置通信控件与哪个串口相连接,设置并返回通信口号。
Setting :设置通信得信息格式,为字符型。
顺序为:波特率、校验、数据位、停止位。
PortOpen :布尔型、开关通信口。
界面如下:代码如下:Private Sub Form_Load()If MSComm1.PortOpen = True Then MSComm1.PortOpen = False ElseEnd IfCombo1.AddItem "COM1"Combo1.AddItem "COM2"Combo1.AddItem "COM3"Combo1.AddItem "COM4"Combo1.AddItem "COM5"Combo1.AddItem "COM6"Combo1.AddItem "COM7"Combo1.AddItem "COM8"Combo1.AddItem "COM9"Combo1.AddItem "COM10"Combo1.AddItem "COM11"Combo1.AddItem "COM12"Combo1.AddItem "COM13"Combo1.AddItem "COM14"Combo1.AddItem "COM15"Combo1.AddItem "COM16"Combo1.ListIndex = 2Combo2.AddItem "256000"Combo2.AddItem "128000"Combo2.AddItem "115200"Combo2.AddItem "57600"Combo2.AddItem "38400"Combo2.AddItem "28800"Combo2.AddItem "19200"Combo2.AddItem "14400"Combo2.AddItem "12800"Combo2.AddItem "11520"Combo2.AddItem "9600"Combo2.AddItem "4800"Combo2.AddItem "2400"Combo2.AddItem "1200"Combo2.AddItem "600"Combo3.AddItem "无None"Combo3.AddItem "奇Odd"Combo3.AddItem "偶Even"Combo4.AddItem "4"Combo4.AddItem "5"Combo4.AddItem "6"Combo4.AddItem "7"Combo4.AddItem "8"Combo5.AddItem "1"Combo5.AddItem "2"mPort = Combo1.ListIndex + 1 MSComm1.Settings = "9600,n,8,1"ComOpen.Caption = "打开串口"Shape1.FillColor = &HFFFFC0End SubPrivate Sub ComOpen_Click()On Error GoTo uerror '发现错误跳转到错误处理If ComOpen.Caption = "关闭串口" ThenMSComm1.PortOpen = FalseComOpen.Caption = "打开串口" '按钮文字改变Shape1.FillColor = &HFFFFC0 '灯颜色改变ElseMSComm1.PortOpen = TrueComOpen.Caption = "关闭串口"Shape1.FillColor = &HFFEnd IfExit Subuerror:msg$ = "无效端口号" '错误显示Title$ = "串口调试助手"X = MsgBox(msg$, 48, Title$) '48标示显示警告图标End SubPrivate Sub MSComm1_OnComm()Dim BytReceived() As ByteDim strBuff As StringDim i As IntegerSelect Case mEvent '事件发生Case 2ClsMSComm1.InputLen = 0 '读入缓冲区全部内容strBuff = MSComm1.Input '读入到缓冲区Label10.Caption = Label10.Caption + Len(strBuff) '接收计数If MSComm1.InputMode = comInputModeBinary ThenBytReceived() = strBuff '如果是二进制接收模式则进行数据处理,否则直接显示字符串For i = 0 To UBound(BytReceived)If Len(Hex(BytReceived(i))) = 1 ThenstrData = strData & "0" & Hex(BytReceived(i)) & " " '如果只有一个字符,则前补0,如F显示0F,最后补空格Else '方便显示观察如: 00 0F FEstrData = strData & Hex(BytReceived(i)) & " "End IfNextTextReceive = TextReceive & strDatastrData = ""ElseTextReceive = TextReceive & strBuffEnd IfEnd SelectEnd SubPrivate Sub ComSend1_Click() '手动发送Dim Temp(0) As ByteDim strBuff As StringIf Option1.Value = True Then '如果显示16进制发送则进行16进制处理,这里只发送一个Temp(0) = "&H" & TextSendMSComm1.Output = Temp '发送一个16进制ElsestrBuff = TextSendEnd IfIf MSComm1.PortOpen = False ThenMsgBox "请打开串口"End IfOn Error GoTo uerrorMSComm1.Output = strBuffLabel11.Caption = Label11.Caption + Len(strBuff) '发送计数uerror:End SubPrivate Sub ComSend2_Click()If ComSend2.Caption = "自动发送" ThenComSend2.Caption = "关闭自动发送"Timer1.Interval = TextTime.TextTimer1.Enabled = TrueElseComSend2.Caption = "自动发送"Timer1.Enabled = FalseEnd IfEnd SubPrivate Sub ComClean1_Click()TextSend.Text = "" '清空发送窗口End SubPrivate Sub Option3_Click()MSComm1.InputMode = comInputModeBinary '选择接收方式End SubPrivate Sub Option4_Click()MSComm1.InputMode = comInputModeText '选择接收方式End SubPrivate Sub Timer1_Timer()Call ComSend1_Click '定时调用手动发送End SubPrivate Sub Timer2_Timer()If Combo3 = "无None" ThenMSComm1.Settings = Str(Combo2) + "N" + Str(Combo4) + Str(Combo5)ElseIf Combo3 = "奇Odd" ThenMSComm1.Settings = Str(Combo2) + "O" + Str(Combo4) + Str(Combo5)ElseIf Combo3 = "偶Even" ThenMSComm1.Settings = Str(Combo2) + "E" + Str(Combo4) +Str(Combo5)End IfEnd SubPrivate Sub Combo1_Click()If MSComm1.PortOpen = True Then '如果串口打开先关闭后再进行其他操作MSComm1.PortOpen = FalseEnd IfmPort = Combo1.ListIndex + 1 '读取com口号End SubPrivate Sub ComClean3_Click()Label10.Caption = 0Label11.Caption = 0End SubPrivate Sub ComClean2_Click()TextReceive.Text = "" '接收窗口End Sub功能上:实现了字符串的发送和接收,8位数据的十六进制发送和接收,有端口,波特率等设置。