VB串口通信详细讲解
vb串口通讯usb通讯,很有用哦

OnComm:通信控件只提供了一个事件,该事件的触发可以对串口的通信事件及错误进行处理。通过对CommEvent 属性的判断可知当前的通信错误和事件,分别对每个CommEvent 值进行编程就完成了对各个错误和事件的处理。如:CommEvent = MSCOMM—EV—SEND 表示发送事件。这些信息可从VB 提供的常量文件CONSTANT. TXT中查出。
完成发送数据后的一系列操作。如:对刚发送的数据进行处理,当串口是和MODEM通信时,发送完数据后可进行拆除线路联接、挂机等操作。
RThreshold :设置并返回不触发OnComm事件时接收缓冲区被允许的最多字符数。当缓冲区的字符多于设置的值时,则触发OnComm 事件,并把CommEvent 设为MSCOMM—EV—RECEIVE,当RThreshold = 0 则禁止接收触发OnComm 事件,当RThreshold = 1 则接收缓冲区有一个或更多字符时就触发OnComm事件。利用这一属性,就可完成对串口接收数据的处理。
comm1. OutBufferSize = 512 ′设置发送缓冲区为512 字节 comm1. InBufferSize = 512 ′设置接收缓冲区为512 字节
comm1. SThreshold = 0 ′禁止发送事件
comm1. RThreshold = 1 ′每一个字符到接收缓冲区都触发接收事件 ′设置COM2
(2)属性
CommPort :设置通信控件与哪个串口相连接,设置并返回通信口号。 Setting :设置通信的信息格式,为字符型。顺序为:波特率、校验、数据位、停止位。
PortOpen :布尔型、开关通信口。
InputLen :从接收缓冲区读取字符个数。
使用VB中的MSComm控件实现串口通信

使用VB中的MSm控件实现RS-232串口通信实验准备:需要准备一些与串口通信有关的设备,如〔外置式〕调制解调器、计算机串口与调制解调器的连接线、一根DTE到DTE的无调制解调器连接线〔接法见本章有关习题的参考答案〕,在实验前检查计算机的两个串口是否能够正常工作。
实验环境:Windows 95/98操作系统,Microsoft VB 5.0以上程序设计环境。
对例题中涉及调制解调器的容,采用计算机与调制解调器连接的方式;对在例题中设计数据传输的容,须事先将DTE到DTE 的无调制解调器连接线的两端,分别插入1和2串口。
实验说明:VB中的MSm控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。
MSm控件提供以下两种处理通讯的方式:〔1〕事件驱动(实时)方式,这是处理串行端口交互作用的一种非常有效的方法。
在许多情况下,在事件发生时需要得到通知,例如,在Carrier Detect〔CD〕或RequestToSend〔RTS〕线上一个字符到达或一个变化发生时。
在这些清况下,可以利用MSm 控件的Onm事件捕获并处理这些通讯事件。
Onm事件还可以检查和处理通讯错误。
〔2〕轮询方式,在程序的每个关键功能之后,可以通过检查mEvent 属性的值来查询事件和错误。
如果应用程序较小,并且是自保持的,这种方法可能是更可取的。
例如,如果写一个简单的拨号程序,则没有必要对每接收一个字符都产生事件,因为唯一等待接收的字符是调制解调器的"OK〞响应。
每个使用的MSm控件都对应着一个串行端口。
如果应用程序需要访问多个串行端口,必须使用多个MSm控件。
可以在Windows"控制面板〞中改变端口地址和中断地址。
下面这个简单的例子采用了轮询方法演示了用调制解调器进展根本的串行通讯:Private Sub Form_Load〔〕Dim Instring As String '保存输入子串的缓冲区MSm1.mPort=3 '使用3。
VB.Net串口通信用法

串口通信用法 串口通信用法对于初次使用 的SerialPort 编写串口通信的朋友,这些是很必要的知识,也是编写串口通信程序前的知识准备。
1、使用 SerialPort 设置串口属性进行串口通讯时,需要设置一些相关参数,可以通过设置SerialPort 类的属性来进行。
串口属性主要包括.PortName 串口名称,COM1, COM2等。
.BaudRate 波特率,也就是串口通讯的速度,进行串口通讯的双方其波特率需要相同,如果用PC连接其他非PC系统,一般地,波特率由非PC系统决定。
.Parity 奇偶校验。
可以选取枚举Parity中的值.DataBits 数据位.StopBits 停止位,可以选取枚举StopBits中的值.Handshake 握手方式,也就是数据流控制方式,可以选取枚举Handshake中的值对其中几个关键术语解释:a,波特率:这是一个衡量通信速度的参数。
它表示每秒钟传送的bit的个数。
例如300波特表示每秒钟发送300个bit。
当我们提到时钟周期时,我们就是指波特率例如如果协议需要4800波特率,那么时钟是4800Hz。
这意味着串口通信在数据线上的采样率为4800Hz。
通常电话线的波特率为14400,28800和36600。
波特率可以远远大于这些值,但是波特率和距离成反比。
高波特率常常用于放置的很近的仪器间的通信,典型的例子就是GPIB设备的通信。
b,数据位:这是衡量通信中实际数据位的参数。
当计算机发送一个信息包,实际的数据不会是8位的,标准的值是5、7和8位。
如何设置取决于你想传送的信息。
比如,标准的ASCII码是0~127(7位)。
扩展的ASCII码是0~255(8位)。
如果数据使用简单的文本(标准ASCII码),那么每个数据包使用7位数据。
每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。
由于实际数据位取决于通信协议的选取,术语“包”指任何通信的情况。
c,停止位:用于表示单个包的最后一位。
vb 串口 二进制

vb 串口二进制VB中的串口通信及二进制数据处理一、VB中的串口通信1. 什么是串口通信?在计算机领域,串口是指一种串行接口,用于将数据以连续的比特流的形式传输。
串口通信是指通过串口进行数据传输的过程。
2. VB中如何进行串口通信?VB提供了MSComm控件,可以方便地进行串口通信。
使用该控件需要进行以下步骤:(1)在工具箱中找到MSComm控件并拖放到窗体中。
(2)设置MSComm控件的属性,包括端口号、波特率、数据位、校验位和停止位等。
(3)编写代码实现打开、关闭、发送和接收数据等功能。
3. VB中如何打开和关闭串口?打开和关闭串口可以使用MSComm控件的Open和Close方法实现。
例如:Private Sub cmdOpen_Click()MSComm1.PortOpen = TrueEnd SubPrivate Sub cmdClose_Click()MSComm1.PortOpen = FalseEnd Sub4. VB中如何发送和接收数据?发送和接收数据可以使用MSComm控件的Output和Input方法实现。
例如:Private Sub cmdSend_Click()MSComm1.Output = "Hello World"End SubPrivate Sub MSComm1_OnComm()If mEvent = comEvReceive ThenMsgBox MSComm1.InputEnd IfEnd Sub二、VB中的二进制数据处理1. 什么是二进制数据?在计算机领域,二进制是一种用0和1表示的数字系统。
在数据传输和存储中,经常使用二进制来表示数据。
2. VB中如何处理二进制数据?VB提供了一些函数和方法,可以方便地进行二进制数据的处理。
以下是常用的函数和方法:(1)ChrB函数:将一个字节转换为字符。
(2)AscB函数:将一个字符转换为字节。
(3)StrConv函数:进行字符串编码转换,包括Unicode、ASCII、UTF-8等编码方式。
VB串口通信(附图教程)

界面如下:代码如下: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控件MSComm串口通讯实例教程

现有电子秤一台,使用串口与计算机进行通讯。
编写VB程序来访问串口,达到读取电子秤上显示的数据。
该电子秤为BE01型仪表,输出为RS-232C标准接口,波特率为300-9600、偶校验、7个数据位、2个停止位。
所有字符现有电子秤一台,使用串口与计算机进行通讯。
编写VB程序来访问串口,达到读取电子秤上显示的数据。
该电子秤为BE01型仪表,输出为RS-232C标准接口,波特率为300-9600、偶校验、7个数据位、2个停止位。
所有字符均发送11位ASCII码,一个起始位。
在VB中与串口通讯需要引入控件MSComm串口通讯控件(在Microsoft Comm Control 6.0中)。
具体程序如下:控件简称:MSCDim Out(12) As Byte '接收var中的值Dim var As Variant '接收MSC.input中的数值Dim nRece As Integer '计算MSC.inputbuffer的个数Dim i As Integer, j As Integer '随即变量,计算循环************************************************************************** **Private Sub Form_Load()ClearTextWith MSC.CommPort = 1 '设置Com1为通信端口.Settings = "9600,E,7,2" '设置通信端口参数 9600赫兹、偶校验、7个数据位、2个停止位.(这里需要进一步说明的是:.Setting=”BBBB,P,D,S”。
含义是:B:Baud Rate(波特率);P:Parity(奇偶);D:Data Bit;S:Stop Bit).InBufferSize = 40 '设置缓冲区接收数据为40字节.InputLen = 1 '设置Input一次从接收缓冲读取字节数为1.RThreshold = 1 '设置接收一个字节就产生OnComm事件End WithEnd Sub************************************************************************** **Private Sub ClearText()Text3.Text = ""Text2.Text = "5"Text1.Text = ""End SubPrivate Sub Command1_Click()ClearText' nRece = 0 '计数器清零With MSC.InputMode = comInputModeBinary '设置数据接收模式为二进制形式.InBufferCount = 0 '清除接收缓冲区If Not .PortOpen Then.PortOpen = True '打开通信端口End IfEnd WithEnd SubPrivate Sub MSC_OnComm()DelayTime ‘用来延续时间ClearTextWith MSCSelect Case .CommEvent '判断通信事件Case comEvReceive: '收到Rthreshold个字节产生的接收事件SwichVar 1If Out(1) = 2 Then '判断是否为数据的开始标志.RThreshold = 0 '关闭OnComm事件接收End IfDoDoEventsLoop Until .InBufferCount >= 3 '循环等待接收缓冲区>=3个字节' nRece = nRece + 1For i = 2 To 12SwichVar iText1.Text = Text1.Text & Chr(Out(i))NextText1.Text = LTrim(Text1.Text)Text2.Text = Text2.Text & CStr(nRece).RThreshold = 1 '打开MSComm事件接收Case Else' .PortOpen = FalseEnd SelectEnd WithEnd Sub************************************************************************** **Private Sub DelayTime()Dim bDT As BooleanDim sPrevious As Single, sLast As SinglebDT = TruesPrevious = Timer (Timer可以计算从子夜到现在所经过的秒数,在Microsoft Windows中,Timer函数可以返回一秒的小数部分)Do While bDTIf Timer - sPrevious >= 0.3 Then bDT = FalseLoopbDT = True(通信传输速率为9600bps,则最快速度1.04ms发送一个字节,仪表每秒发送50帧数据,每帧数据有4个字节,即每秒发送200个字节,平均5.0ms 发送一个字节,连续读取串口数据时要在程序中添加循环等待程序)Private Sub SwichVar(ByVal nNum As Integer)DelayTimevar = Nullvar = MSC.InputOut(nNum) = var(0)End Sub(设置接收数据模式采用二进制形式,即 InputMode=comInputModeBinary,但用Input 属性读取数据时,不能直接赋值给 Byte 类型变量,只能通过先赋值给一个 Variant 类型变量,返回一个二进制数据的数组,再转换保存到Byte类型数变量中。
VB串口设置介绍

mscomm.vbx通信控件描述mscomm.vbx通信控件可直接从vb的toolb ox中加入窗体form,即可用其进行通信。
若toolbo x 中无此控件,则用tools的custo m control s 将mscomm.vbx从win dows的s ystem子目录中加入v b的tool box中。
1.1 通信方式mscomm.vbx有2种不同的方式来处理和解决各类通信软件的开发和设计问题1、事件驱动。
它与c/c++写window s 软件时的窗口回调函数类似,是1种功能强大的处理问题的方法。
在实际工作中,往往要处理许多通信中的相关事件,例如:当线路数据到达本端或cd线和rts 信号线状态发生变化时,要求我们使用相应的事件来跟踪和处理,该控件是使用o ncomm事件来实现的,它也包括检测和处理通信错误等方面的问题,commeve nt 值返回最近的通信事件或错误的数字代码。
通信控件详细的错误和事件举例有:mscomm-er-break 收到1个bre ak signalmscomm-er-cdto cd 信号超时……mscomm-ev-cd cd信号改变……2、查询方式。
由程序设计者负责读取com mevent的值并处理所发生的错误或事件。
通常简单的应用程序设计可采用这种办法。
1.2 通信控件的属性利用通信控件编制通信程序,关键是准确理解设置通信控件的属性。
mscomm.vbx提供了27个关于通信控件方面的属性,例如:commpor t:设置或返回通信口编号。
setting s:设置或返回以字符串形式出现的数据通信格式:波特率、校验、数据位和停止位。
portope n:设置或返回通信口状态(包括打开和关闭1个通信口)……2、实例本程序应用背景为dcc95型静电除尘器自动监控系统软件,解决1个pc工控机(主站)与32个单片机(子站)之间的通信问题。
VB实现串口通讯

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 :布尔型、开关通信口。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
VB串口通信目前,Visual Basic (简称VB)已成为WINDOWS 系统开发的主要语言,以其高效、简单易学及功能强大的特点越来越为广大程序设计人员及用户所青睐。
VB支持面向对象的程序设计,具有结构化的事件驱动编程模式并可以使用无限扩增的控件。
在VB应用程序可以方便地调用WINDOWS API函数,使得编程效率提高,应用功能增强。
利用VB提供的这些功能,我们可以有三种方法完成串口通信。
一种是用VB提供的具有强大功能的通信控件;另一种方法是调用WINDOWS API函数,使用WINDOWS 提供的通信函数编写移植性强的应用程序;第三是利用文件的输入/输出完成,该方法简便易行,但有一定的局限性。
一、利用通信控件(MSCOMM)完成串口通信VB提供了通信控件MSCOMM,文件名为MSCOMM. VBX。
该控件可设置串行通信的数据发送和接收,对串口状态及串行通信的信息格式和协议进行设置。
在通信过程中可以触发On Comm 事件,在该事件过程进行数据检验处理及检错,还可以通过编程访问CommEvent属性来了解通信的情况,进行收发数据的处理。
每个通信控件对应一个串口,如果要访问多个通信口,则要设计多个通信控件。
1、通信控件的事件及基本属性(1)事件On Comm :通信控件只提供了一个事件,该事件的触发可以对串口的通信事件及错误进行处理。
通过对CommEvent属性的判断可知当前的通信错误和事件,分别对每个CommEvent 值进行编程就完成了对各个错误和事件的处理。
如:CommEvent = MSCOMM —EV—SEND表示发送事件。
这些信息可从VB提供的常量文件CONSTANT.TXT中查出。
(2)属性CommPort :设置通信控件与哪个串口相连接,设置并返回通信口号。
Setting :设置通信的信息格式,为字符型。
顺序为:波特率、校验、数据位、停止位。
PortOpen :布尔型、开关通信口。
InputLen :从接收缓冲区读取字符个数。
In put ,Output :读取接收缓冲区或写入发送缓冲区字符。
以上五种属性对串口完成基本的设置和操作,下面的三种属性是描述如何利用VB提供的事件驱动机制来实现通信。
CommEvent :返回通信过程中产生的错误信息及事件,了解通信状况。
SThreshold :设置并返回不触发On Comm 事件时发送缓冲区被允许的最少字符数。
当缓冲区的字符少于设置的值时,则触发On Comm 事件,并把CommEve nt设为MSCOMMM —EV—SEND。
当SThreshold = 0 则禁止发送触发On Comm 事件,当SThreshold = 1 则发送缓冲区为空时就触发On Comm 事件。
利用这一属性,就可完成发送数据后的一系列操作。
女口:对刚发送的数据进行处理,当串口是和MODEM通信时,发送完数据后可进行拆除线路联接、挂机等操作。
RThreshold :设置并返回不触发On Comm 事件时接收缓冲区被允许的最多字符数。
当缓冲区的字符多于设置的值时,则触发On Comm 事件,并把CommEve nt设为MSCOMM—EV—RECEIVE 当RThreshold = 0 则禁止接收触发On Comm 事件,当RThreshold = 1 则接收缓冲区有一个或更多字符时就触发On Comm事件。
利用这一属性,就可完成对串口接收数据的处理。
2、利用通信控件的实例Sub Forml — load () forml. show 设置COM1comml. commport = 1 End Subcomml. Setti ng = " 9600,o , 8,1"波特率:9600奇校验,8位数据1位停止位comm1. In putle n = 0 读取接收缓冲区的所有字符 comm1. OutBufferSize = 512 设置发送缓冲区为 512字节 comm1. I nBufferSize = 512设置接收缓冲区为 512字节 comm1. SThreshold = 0 comm1. RThreshold = 1 设置COM2'禁止发送事件'每一个字符到接收缓冲区都触发接收事comm2. commport = 2comm2. Setti ng = "2400,e , 8 , 1 "波特率:2400偶验,8位数据,1位停止位comm2. In putle n = 0 读取接收缓冲区的所有字符 comm2. OutBufferSize = 512 设置发送缓冲区为 512字节 comm2. I nBufferSize = 512'设置接收缓冲区为 512字节 comm2. SThreshold = 1comm2. RThreshold = 0发送缓冲区空触发发送事件 禁止接收事件打开 COM1 , COM2 comm1. Portope n = Truecomm2. Portope n =Timer1. i nterval = 5000Sub Comml —On Comm ()Dim Inbuf as stri ngDim i as integer , n as integer , t as integer Select Case Comm1. CommEve ncase MSCOMM —EV—RECEIVEInbuf = Comm1. In putn = len ( Inbuf )For i = 1 to nt = Asc (Mid ( In buff , i , 1) ) or & HFF print fNext iEnd SelectEnd SubSub Comm2 —On Comm ()Select Case Comm2. CommEve ntCase MSCOMM —EV—SENDPrint timeEnd SelectEnd SubSub Timer1 —Timer ()Comm2. output = Second ( Now )End sub二、通过调用API函数实现通信以上说明了用VB提供的控件实现通信的方法,只要理解了VB控件的机制就很容易完成对串口的操作,但可移植性差。
但VB可以很容易调用API函数实现通信。
1、VB对API的调用VB使用动态链接库DLL(Dynamic Link Libraries)的能力,大大扩展了其功能。
WINDOWS 本身提供了API函数包括三大动态链接库:KERNEL库、GDI库、USER库,通过VB用户可以直接调用这些库中的函数。
调用之前,必须首先在VB中声明。
该声明可为模块级或窗体级,当作为模块级声明时,其作用域为所有FORM和MODULE,而作为窗体级声明时其作用域为该声明所在的FORM。
VB调用DLL的格式:Declare Sub 过程名Lib 〃库名〃[Alias 〃别名〃]([ByVai 参数As 类型])Declare Function 函数名Lib "库名"[Alias "别名"]([ByVai 参数As 类型])As 类型在声明中:DECLARE表示声明DLL中的函数,当声明是不具有返回值的过程时用SUB关键字,而如果调用的函数具有返回值,则必须用FUNCTION关键字将其声明为函数并在声明语句的最后用AS指明函数返回值的类型。
LIB关键字表示当前声明的过程或函数是库名所指定的库中函数而非VB 本身的函数。
库名,就是对应动态链接库的名称,其中通信函数在USER库中。
ByVai关键字将原参数数据类型一一对应到VB类型中。
WINDOWS 的HELP文件WINSDK. HLP 中包含了完整的WINDOWS API 函数信息,可用该文件查看联机函数、数据结构及错误信息。
2、API提供的通信函数为了方便说明,我们将有关通信的函数及相关的数据结构放在全局模块中,文件名为COMM.BAS (见API编程函数实例)。
以下是这些函数的基本介绍:(1)Open Comm (IpComName As String ,win Queue As In te-ger ,wOutQueue As Integer)IpComName :设备名,以“COMn "的形式来说明,n为设备号;wI nQueue 、wOutQueue :分别以字节为单位说明发送、接收缓冲区的大小。
该函数调用成功返回打开的设备号,否则返回一负数代表错误信息码。
(2)SetCommState (IpDCB As DCB )IpDCB :是DCB结构存放设备所希望的通信设置(DCB结构如COMM.BAS 中所示),其中DCB的ID成员必须标识该设备。
如果函数调用成功返回0 ;否则,返回值小于0。
(3)ReadComm (nCid As Integer ,IpBuf As String ,nSize As Integer )WriteComm (nCid As Integer ,IpBuf As String ,nSize As In-teger )这是用来对通信设备进行读写的函数,nCid :说明要读写的通信设备号,IpBuf :为读写缓冲区,nSize :为要读写的字节数。
如果读写成功,返回读写的字节数,否则是小于0 的值,并且其绝对值为读写的字节数。
(4)Closecomm (nCid As Integer )该函数关闭nCid所指定的通信设备,并且释放分配给设备的发送,接收缓冲存储器,调用成功返回0 ;否则,返回值小于0。
(5)BuildCommDCB ( IpDef As String , IpDCB As DCB )IpDef :为一字符串指定设备控制信息,此字符串具有MS-DOS中MODE命令所使用的参数形式。
IpDCB :为一DCB数据结构。
该函数将IpDef字符串转换成串行设备控制块(DCB) 代码。
(6)GetCommError (nCid As Integer ,IpStat As COMSTAT )该函数检取nCid指定的设备最近的错误值和当前状态,IpStat :是COMSTAT结构,具体形式如COMM.BAS中所定义的。
返回值为COMM.BAS中带CE-的常量的某种组合。
3. 用API函数编程实例这个例子是一仿真发送机,将从键盘输入的字符发送给COM端口。
在FORM中加一按钮COMMAND1 来关闭通信口。
Type DCBId As Stri ng 3 1BaudRate As In tegerByteSize As Stri ng 3 1Parity As Stri ng 3 1StopBits As String 3 1RlsTimeout As In tegerCtsTimeout As In tegerDsrTimeout As In tegerBits1 As Stri ng 3 1Bits2 As Stri ng 3 1Xon Char As Stri ng 3 1XoffChar As Stri ng 3 1Xon Lim As In tegerXoffLim As In tegerPeChar As Stri ng 3 1EofChar As Stri ng 3 1EvtChar As String 3 1TxDelay As In tegerEnd TypeType COMSTATBits As Stri ng 3 1cbln Que As In tegercbOutQue As In tegerEnd TypeDeclare Fun cti on Ope nComm Lib "User" ByVal IpComName AsStri ng , ByVal win Queue As In teger , ByVal wOutQueue As In teger ) As In tegerDeclare Function SetCommState Lib "User" ( IpDCB As DCB )As In tegerDeclare Function ReadComm Lib "User" ByVal nCid As Integer , ByVal IpBuf As String , ByVal n Size As In teger ) As In tegerDeclare Function WriteComm Lib "User" ByVal nCid As Integer , ByVal IpBuf AsString , ByVal n Size As In teger ) As In tegerDeclare Fun cti on Closecomm Lib "User" ByVal n Cid As In teger ) As In tegerDeclare Function BuildCommDCB Lib "User" ( ByVai IpDef AsString , IpDCB As DCB ) As IntegerDeclare Function GetCommError Lib "User" ( ByVai nCid AsInteger , IpStat As COMSTAT ) As IntegerGlobal IpDCB As DCBGlobal nCid As IntegerSub Forml —load ()Dim comset As Stringcomset = “ COM2"512 nCid = OpenComm (comset , 512 , 512) 打开COM2 设置接收,发送缓冲区为字节If n Cid < 0 The n '处理错误MsgBox 不能打开COM:" + Str ( nCid) + Error Num2ber :" + Str (nCid) ,16endend ifCommandl. Caption = 关闭通信口” ’设置串口DCB设备控制块comset = COM2 :9600 , n , 8 , 1"If (BuildCommDCB (comset , LpDCB) ) ThenMsgBox 不能建立COMM DCB" , 16end end ifLpDCB. Id = Chr ( nCid )If (SetCommState (LpDCB) ) Then 设置串口状态MsgBox"不能设置串口状态”,16enden difEnd SubSub Form1-keyPress ( keyAscii As Integer )Dim nsend As integer , x As integerDim Lpstate As COMSTAT '通信状态块Static inbuff as stringin buff = imbuff + Chr ( KeyAscii )x = GetCommError (ncid , Lpstate )'读取当前串口错误或状态if lpstate. cbOutQue < 512 The n 送缓冲区有空间否?Nsend = WriteComm ( n Cid ,in buff ,Len (in buff ))'发送in buff if Nsend < = 0 then Nse nd = - Nse nd 忽略错误in buff = Mid (in buff , Nse nd + 1 ) 清除已发送的字符end ifend ifEnd SubSub Comma nd1-Click ()Dim Nclose As in tegerNclose = CloseComm (nCid )If Nclose < 0 The nMsgBox 不能关闭COMM 口:" + Str (nCid ) , 16endelsencid = 0end ifCmmand1. Caption = 通信已关闭”End Sub三、用文件输入/输出技术完成通信用VB提供的以上两种方法已足以应付各种串行通信的问题。