当前位置:文档之家› VB串口通信程序代码

VB串口通信程序代码

VB串口通信程序代码
VB串口通信程序代码

vb中怎样用mscomm控件实现串口通信

本问分两部分均来自https://www.doczj.com/doc/2b6265514.html,

第一部分jessezappy(晶晶)

================================================================================== If MSComm1.PortOpen Then MSComm1.PortOpen = False

https://www.doczj.com/doc/2b6265514.html,mPort = 1 '假定是用COM1口

' 设定传输速率等,可依照您的需求更改

MSComm1.Settings = "9600,N,8,1"

MSComm1.PortOpen = True

'---------初始化Modem-------------

MSComm1.Output = "ATZ"

MSComm1.Output = "AT&F"

MSComm1.Output = "ATE0"

MSComm1.Output = "ATM1"

MSComm1.Output = "ATQ0"

MSComm1.Output = "ATV0"

'--------------------------拨号-------------

MSComm1.Output ="ATDT163" '拨163

'---------------------------接通后

MSComm1.Output ="SDFJDKSJLKFA" '发送字符串

'---------------------

Private Sub MSComm1_OnComm() '用串口事件捕捉数据..

If MSComm1.InBufferCount Then

' 通讯埠中假如有资料的话, 则读取进来

InStringB = InStringB & MSComm1.Input

' 如果资料中有Chr(13) 和Chr(10) 的话, 则显示出来

If InStr(InStringB, vbCrLf) Then

instring = instring & InStringB

AddText Text3, InStringB, False

InStringB = ""

End If

End If

END SUB

'-------------------------挂断--------

MSComm1.PortOpen = False '这个挂断方法不能适用所有MODEM,我正在研究...通用办法

==============================================================================================

==

第二部分:

===========================================================================

最后借你一篇文章看,作者不是我,里面的不一定都对..

'-----------------------------------------------------------

VB Mscomm控件应用

江苏戚墅堰机车车辆厂设计处(213011) 李秉璋

--------------------------------------------------------------------------------

Visual Basic 6.0(以下简称VB) 是一种功能强大、简单易学的程序设计语言。它不但保留了原先Basic语言的全部功能,而且还增加了面向对象程序设计功能。它不仅可以方便快捷地编制适用于数据处理、多媒体等方面的程序,而且利用ActiveX 控件MSComm还能十分方便地开发出使用计算机串口的计算机通信程序。本文结合计算机通信的两个例子,详细介绍如何在

VB中使用MSComm控件。

处理方式

MSComm控件提供了两种处理通信的方式:一种为事件驱动方式,该方式相当于一般程序设计中的中断方式。当串口发生事件或错误时,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事件。

●Sthreshold:该属性亦为一阀值。当发送缓冲区中字符数小于该值时,MSComm控件设置Commevent属性为ComEvSend,

并产生OnComm事件。若Sthreshold属性设置为0,则不产生OnComm事件。要特别注意的是仅当发送缓冲区中字符数小于该值的瞬间才产生OnComm事件,其后就不再产生OnComm事件。例如Sthreshold设置为3,仅当发送缓冲区中字符数从3降为2时,MSComm控件设置Commevent属性为ComEvSend,同时产生OnComm事件,如发送缓冲区中字符始终为2,则不会再产生OnComm事件。这就避免了发送缓冲区中数据未发送完就反复发生OnComm事件。

●CommEvent:这是一个非常重要的属性。该属性设计时无效,运行时只读。一旦串口发生通信事件或产生错误,依据产生的事件和错误,MSComm控件为CommEvent属性赋不同的代码,同时产生OnComm事件。用户程序就可在OnComm事件处理程序中针对不同的代码,进行相应的处理。CommEvent属性的代码、常数及含义参见表1及表2。

表1 CommEvent通信事件代码常数含义

1 ComEvReceive 接受到Rthreshold个字符。该事件将持续产生,直到用Input属性从接受缓冲区中读取并删除字符。

2 ComEvSend 发送缓冲区中数据少于Sthreshold个,说明串口已经发送了一些数据,程序可以用Output属性继续发送

数据。

3 ComEvCTS Clear To Send信号线状态发生变化。

4 ComEvDSR Data Set Ready信号线状态从1变到0。

5 ComEvCD Carrier Detect信号线状态发生变化。

6 ComEvRing 检测到振铃信号。

7 ComEvEOF 接受到文件结束符。

表2 CommEvent通信错误代码常数含义

1001 ComEvntBreak 接受到一个中断信号。

1002 ComEvntCTSTO Clear To Send信号超时。

1003 ComEvntDSRTO Data Set Ready信号超时。

1004 ComEvntFrame 帧错误。

1006 ComEvntOverrun 串口超速。

1007 ComEvntCDTO 载波检测超时。

1008 ComEvntRxOver 接受缓冲区溢出,缓冲区中已没有空间。

1009 ComEvntRxParity 奇偶校验错。

1010 ComEvntTxFull 发送缓冲区溢出,缓冲区中已没有空间。

1011 ComEvntDCB 检索串口的设备控制块时发生错误。

实例1:计算机拨号

在一些实际应用中经常需要使用计算机拨号。下面这个例子利用MSComm控件操作Modem进行拨号,实现串口通信。

实现步骤:

1.建窗体

●添加一个MSComm控件,用来建立与串口的连接;

●添加一个Text控件,Name属性为Txttel,用来输入电话号码;

●添加3个CommandButton控件,Name属性分别为DialButton、CancellButton、QuitButton,分别用来实现拨号、中止拨

号、中止程序;

●添加一个Label控件,用来显示所有与拨号有关的信息。窗体见图1。

2.设置MSComm控件属性

●InBufferSize=1024;

●Inputlen=0;

●InputMode=0;

●Rthreshold=2;

●RTSEnable=True;

●Settings=“9600,N,8,1”;

●Sthreshold=0。

因为每一台计算机的串口使用状态都不会一样。为使程序具有通用性,在窗体的Load方法中首先进行串口测试,找到第一个

可用串口后再进行设置。

3.程序功能

程序根据输入的电话号码进行拨号,Modem正常拨号后,提示用户摘机,准备通话。

图1 电话拨号实例

4.主要方法与事件代码

'设置可用串口

Private Sub Form_Load()

On Error GoTo error_open

For i = 1 To 4

https://www.doczj.com/doc/2b6265514.html,mPort = i

MSComm1.PortOpen = True

'设置可用的第一个串口

On Error GoTo 0

Exit Sub

error_resume:

Next

error_open:

Resume error_resume

End Sub

Private Sub DialButton_Click()

Dim Number$, Temp$

Number$= Trim$(Txttel.Text)

If Number$= “" Then

MsgBox “请输入电话号码"

Txttel.SetFocus

Exit Sub

End If

DialButton.Enabled = False

QuitButton.Enabled = False

DialString$=“ATDT”+Number$+“;” +vbCr

'清除接收缓冲区

MSComm1.InBufferCount =0

'拨电话号码

MSComm1.Output = DialString$

Lblmessage.Caption = “正在拨号码-”+Number$

DialButton.Enabled = True

QuitButton.Enabled = True

End Sub

Private Sub MSComm1_OnComm()

Select Case https://www.doczj.com/doc/2b6265514.html,mEvent

Case comEvReceive

'读取串口数据

COMBUF=COMBUF +MSComm1.Input

lc = InStr(1, COMBUF, “OK”)

If lc = 0 Then Exit Sub

'Modem已正常拨号,返回OK

Lblmessage.Caption = “请您摘下电话机,

准备通话”

Case comEvSend

End Select

End Sub

Private Sub CancelButton_Click()

'断开与调制解调器的连接

MSComm1.Output = “ATH” +vbCr

End Sub

实例2:实现来电显示

在一些实际应用中,需要显示并保存来电号码,并根据电话号码显示相应资料,比如小区物业管理和110报警等系统。

实现步骤:

1.创建窗体

●添加一个MSComm控件,用来建立与串口的连接;

●添加4个Option控件,用来确定使用的串口号;

●添加4个Label控件,用来显示来电号码及日期时间;

●添加一个ProgressBar控件,用来显示电话振铃次数;

●为方便调试程序,添加一个Text控件Text 5,用来显示Modem传来的所有信息。窗体见图2。

图2 来电显示窗体

2.设置MSComm控件属性

●InBufferSize=1024;

●Inputlen=0;

●InputMode=0;

●Rthreshold=1;

●RTSEnable=True;

●Settings=“9600,N,8,1";

●Sthreshold=0。

3.程序功能

程序首先初始化Modem,然后等待来电。当有来电时,MSComm产生OnComm事件。Modem送出的信息格式为“DATE = 月日回车换行TIME = 时分回车换行NMBR = 电话号码回车换行”。在OnComm事件处理程序中对读入

信息进行截取,截取电话号码后,以该电话号码为关键字,查询并显示数据库中有关信息。

4.主要方法与事件代码

'通用声明部分

Const DEBFLG = 1

Public COMX, BEEPNO, HANGUP,PNLOC As Integer

Public COMBUF, COMLIN As String

Private Sub Form_Load()

'检测串行口

Dim I, C As Integer

COMX = 0

COMBUF = “”

COMLIN = “”

BEEPNO = 0

HANGUP = 0

'正常运行程序,关闭右侧Text5

If DEBFLG= 0 Then

Form1.Width = Form1.Width -Text5.Width

Text5.Enabled = False

Text5.Visible = False

End If

On Error GoTo ERROR_FORM_LOAD

'检测可用串口

For C = 1 To 4

If MSComm1.PortOpen Then MSComm1.PortOpen = False

https://www.doczj.com/doc/2b6265514.html,mPort = C

If Not MSComm1.PortOpen Then

MSComm1.PortOpen = True

If MSComm1.PortOpen Then MSComm1.PortOpen = False

If COMX = 0 Then COMX = C

FORM_LOAD_1:

Next C

If COMX = 0 Then End

On Error GoTo 0

Option1(COMX -1).Value = True

Exit Sub

ERROR_FORM_LOAD:

Option1(C -1).Enabled = False

Resume FORM_LOAD_1

End Sub

'选择串行口

Private Sub Option1_Click(Index As Integer)

COMX = Index + 1

Call INIT_MODEM

End Sub

'初试化Modem

Private Sub INIT_MODEM()

If MSComm1.PortOpen Then MSComm1.PortOpen = False https://www.doczj.com/doc/2b6265514.html,mPort = COMX

If Not MSComm1.PortOpen Then MSComm1.

PortOpen = True

MSComm1.Output = “AT#CID=1” +vbCr

'检查Modem命令是否完成

Call CHK_MODEM

MSComm1.Output = “ATS0=0” +vbCr

End Sub

'检查Modem命令是否完成

Private Sub CHK_MODEM()

Dim T As Single

Dim L As Integer

T = Timer

Do

COMBUF = COMBUF +MSComm1.Input

L = InStr(1, COMBUF,“OK”)

Loop Until L <> 0 Or Timer -T > 1

If L = 0 Then

Line1.Visible = True

Line2.Visible = True

Form1.Show

MsgBox “MODEM未联机”,vbOKOnly+vbCritical,“测试MODEM”

Else

Line1.Visible = False

Line2.Visible = False

End If

End Sub

'串行口接收事件处理

Private Sub MSComm1_OnComm()

Dim CH, ST As String

Dim LC As Integer

Select Case https://www.doczj.com/doc/2b6265514.html,mEvent

'接收到Rthreshold个字符

Case comEvReceive

COMBUF = COMBUF +MSComm1.Input

'读取串口数据

Do

LC = InStr(1, COMBUF, Chr(10))

If LC = 0 Then Exit Do

COMLIN = Left(COMBUF, LC)

COMBUF = Mid(COMBUF, LC +1)

CH = Left(COMLIN, 1)

If “ ” < CH And CH < Chr(127) And DEBFLG = 1 Then

Text5.Text = Text5.Text +COMLIN

Text5.SelStart = Len(Text5.Text)

End If

'截取来电号码,并显示

If InStr(1, COMLIN“NMBR=”)<> 0 Then

ST = Mid(COMLIN, 8)

Text2.Te xt=“ ”+Left$(ST,Len (ST) -2) +“ ”

Form1.WindowState = 0

Timer1.Enabled = True

Call BEEP_NO

'截取来电日期,并显示

ElseIf InStr(1, COMLIN, “DATE = ”) <> 0 Then

Text3.Text = Str(Year(DATE)) +“.”

+Mid(COMLIN, 8, 2) +“.” +Mid(COMLIN, 10, 2) +“ ”

'截取来电时间,并显示

ElseIf InStr(1, COMLIN, “TIME = ”) <> 0 Then

Text4.Text = “ ” +Mid(COMLIN, 8, 2) +“:” +Mid(COMLIN, 10, 2)

'检测振铃个数

ElseIf InStr(1, COMLIN, “RING”) <> 0 Then

Call BEEP_NO

If HANGUP = 1 Or BEEPNO = 15 Then Call HANG_UP

'检测是否停止振铃

ElseIf Left(COMLIN, 3) = “000” Then

BEEPNO = 0

Timer1.Enabled = False

Form1.WindowState = 1

ProgressBar1.Value = 0

Frame3.Caption = “振铃数”

End If

Loop

'其他事件处理

Case comEvCTS

Case comEvDSR

Case comEvCD

Case comEvRing

Case comEventBreak

Call INIT_MODEM

Case Else

MsgBox “串口接收事件号:” &https://www.doczj.com/doc/2b6265514.html,mEvent &“ ”, vbOKOnly +

vbCritical, “测试串行口”

End Select

End Sub 、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

VB控件MSComm串口通讯实例

vb 2007-04-04 21:26:46 阅读150 评论0 字号:大中小订阅

=====================================================================================

声明:本文摘自https://www.doczj.com/doc/2b6265514.html,/,新手单片机编程技术网对此文具有解释权

===================================================================================== 现有电子秤一台,使用串口与计算机进行通讯。编写VB程序来访问串口,达到读取电子秤上显示的数据。该电子秤为BE01型仪表,输出为RS-232C标准接口,波特率为300-9600、偶校验、7个数据位、2个停止位。所有字符均发送11位ASCII 码,一个起始位。在VB中与串口通讯需要引入控件MSComm串口通讯控件(在Microsoft Comm Control 6.0中)。具体程序

如下:控件简称:MSC

Dim 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()

ClearText

With MSC

.CommPort = 1 '设置Com1为通信端口

.Settings = "9600,E,7,2" '设置通信端口参数9600赫兹、偶校验、7个数据位、1个停止位.(这里需要进一步说明

的是:.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 With

End Sub

****************************************************************************

Private Sub ClearText()

Text3.Text = ""

Text2.Text = "5"

Text1.Text = ""

End Sub

Private Sub Command1_Click()

ClearText

' nRece = 0 '计数器清零

With MSC

.InputMode = comInputModeBinary '设置数据接收模式为二进制形式

.InBufferCount = 0 '清除接收缓冲区

If Not .PortOpen Then

.PortOpen = True '打开通信端口

End If

End With

End Sub

Private Sub MSC_OnComm()

DelayTime …用来延续时间

ClearText

With MSC

Select Case .CommEvent '判断通信事件

Case comEvReceive: '收到Rthreshold个字节产生的接收事件

SwichVar 1

If Out(1) = 2 Then '判断是否为数据的开始标志

.RThreshold = 0 '关闭OnComm事件接收

End If

Do

DoEvents

Loop Until .InBufferCount >= 3 '循环等待接收缓冲区>=3个字节

' nRece = nRece + 1

For i = 2 To 12

SwichVar i

Text1.Text = Text1.Text & Chr(Out(i))

Next

Text1.Text = LTrim(Text1.Text)

Text2.Text = Text2.Text & CStr(nRece)

.RThreshold = 1 '打开MSComm事件接收

Case Else

' .PortOpen = False

End Select

End With

End Sub

****************************************************************************

Private Sub DelayTime()

Dim bDT As Boolean

Dim sPrevious As Single, sLast As Single

bDT = True

sPrevious = Timer (Timer可以计算从子夜到现在所经过的秒数,在Microsoft Windows中,Timer函数可以返回一秒

的小数部分)

Do While bDT

If Timer - sPrevious >= 0.3 Then bDT = False

Loop

bDT = True

End Sub

(通信传输速率为9600bps,则最快速度1.04ms发送一个字节,仪表每秒发送50帧数据,每帧数据有4个字节,即每秒发送200个字节,平均5.0ms 发送一个字节,连续读取串口数据时要在程序中添加循环等待程序)

Private Sub SwichVar(ByVal nNum As Integer)

DelayTime

var = Null

var = MSC.Input

Out(nNum) = var(0)

End Sub

(设置接收数据模式采用二进制形式,即InputMode=comInputModeBinary,但用Input属性读取数据时,不能直接赋值给Byte 类型变量,只能通过先赋值给一个Variant 类型变量,返回一个二进制数据的数组,再转换保存到Byte类型数变量

中。)

Private Sub Text1_Change()

Text3.Text = CText(Text1.Text) - CText(Text2.Text)

End Sub

****************************************************************************

Private Function CText(ByVal str As String) As Currency

If str <> "" Then

CText = CCur(Val(str))

Else

CText = 0

End If

End Function

(仪表每秒发送50帧数据,微机收到一帧完整数据至少需要20 ms时间,然后再进行数据处理。如果微机在下一帧数据接收前即20ms内能将数据计算处理完毕,则接收缓冲区内只会保存有一帧数据,不会存有两帧以上数据,接收缓冲区的大小不会影响实时监测效果(接收缓冲区>4字节),这时完全可以实现实时监测或实时控制;如果微机在20ms内不能将数据计算处理完毕,接收缓冲区设置得又很大,在数据计算处理完毕前,接收缓冲区内就会保存有两帧以上数据,而且一次工作时间越长,缓冲区内滞留数据帧就越多,数据采集和数据处理之间产生逐渐增大的额外时间差,当接收缓冲区充满后,时间差不再增大,固定在某一值,部分数据因不能及时采集到接收缓冲区中,数据产生丢失现象,真实工作情况就会和微机处理结果产生较大的时间差,对实时监测和实时控制很不利,这种情况下接收缓冲区的大小就会影响实时监测效果,所以接收缓冲区设

置不能过大,以保证数据处理的实时性。)

小结:本文所用的仪表为梅特勒公司出产的BE01型电子秤,其输出的每个编码均为标准的ASCII码。其他的仪表存在发射的编码中含有BCD压缩码,而且分为高低位,需要接收后对其进行解码换算,之后还要将高位和低位数字进行相加,即可以将其BCD码换算成实数。另还存在误差的可能:判断最大值,仪表在刚开始工作时有干扰,会传导一些乱码,位移传感器有参数偏差,最大值一般都略大于50毫米,所以取51为极限最大值,取-51为极限最小值。暂时先写这些,当然其他的情况可

以依此类推!

-------------------------------------------------------------------------------------------------------__________ ____

用VB实现串口通信程序

2009-11-24 11:25

'================================================================================== ===

' 初始化串口子程序

'================================================================================== ===

Private Sub Comm_initial(Port As Byte, BaudRate As String, ParityBit As String, DataBit As Integer, StopBit As Integer)

On Error GoTo ErrorTrap ' 错误则跳往错误处理

If MSComm1.PortOpen = True Then MSComm1.PortOpen =

False ' 先判断串口是否打开,如果打开则先关闭

https://www.doczj.com/doc/2b6265514.html,mPort =

Port ' 设定端口

MSComm1.Settings = BaudRate & "," & ParityBit & "," & DataBit & "," & StopBit ' 设置波特率,无校验,8位数据位,1位停止位

MSComm1.InBufferSize =

1024 ' 设置接收缓冲区为1024字节

MSComm1.OutBufferSize =

4096 ' 设置发送缓冲区为4096字节

MSComm1.InBufferCount =

0 ' 清空输入缓冲区

MSComm1.OutBufferCount =

0 ' 清空输出缓冲区

MSComm1.SThreshold =

1 ' 发送缓冲区空触发发送事件

MSComm1.RThreshold =

1 ' 每X个字符到接收缓冲区引起触发接收事件

MSComm1.OutBufferCount =

0 ' 清空发送缓冲区

MSComm1.InBufferCount =

0 ' 滑空接收缓冲

MSComm1.PortOpen =

True ' 打开串口

If MSComm1.PortOpen = True Then

Txtstatus.Text = "STATUS:" & cboport.Text & " OPEND," & cbobps.Text & "," & Left(CboParity.Text, 1) & "," & 8 & "," & 1

Else

Txtstatus.Text = "STATUS:COM Port Cloced" ' 串口没打开时,提示串口关闭状态

End If

Exit Sub

ErrorTrap: ' 错误处理

Select Case Err.Number

Case

comPortAlreadyOpen ' 如果串口已经打开,则提示

MsgBox "此串口已打开", 49, "Modbus通讯程序"

CloseCom

Case Else

MsgBox "没有发现此串口或被占用", 49, "Modbus通讯程序"

CloseCom

End Select

Err.Clear

End Sub

'================================================================================== ===

' 串口设置子程序

'================================================================================== ===

Private Sub Comm_reSet(Port As Byte, BaudRate As String, ParityBit As String, DataBit As Integer, StopBit As Integer)

On Error GoTo

ErrorHint ' 错误则跳往错误处理

If MSComm1.PortOpen = True Then MSComm1.PortOpen =

False ' 先判断串口是否打开,如果打开则先关闭

https://www.doczj.com/doc/2b6265514.html,mPort =

Port ' 设定端口

MSComm1.Settings = BaudRate & "," & ParityBit & "," & DataBit & "," & StopBit ' 设置波特率,无校验,8位数据位,1位停止位

MSComm1.PortOpen =

True ' 打开串口

If MSComm1.PortOpen = True Then

Txtstatus.Text = "STATUS:" & cboport.Text & " OPEND," & cbobps.Text & "," & Left(CboParity.Text, 1) & "," & 8 & "," & 1

Else

Txtstatus.Text = "STATUS:COM Port Cloced" ' 串口状态显示

End If

Exit Sub

ErrorHint: ' 错误处理

Select Case Err.Number

Case

comPortAlreadyOpen ' 如果串口已经打开,则提示

MsgBox "串口冲突,请更改串口后再试", vbExclamation, "Modbus通讯设置"

CloseCom ' 调用关闭串口函数

Case Else

MsgBox "设置失败,请确认连接后重试", vbExclamation, "Modbus通讯设置"

CloseCom ' 调用关闭串口函数

End Select

Err.Clear ' 清除 Err 对象的属性

End Sub

'================================================================================== ===

' 串口开关子程序

'================================================================================== ===

Private Sub OpenCom() '打开串口

On Error GoTo Err

If MSComm1.PortOpen = True Then MSComm1.PortOpen =

False ' 先判断串口是否打开,如果打开则先关闭

Call Comm_reSet(Val(Mid(cboport.Text, 4, 1)), cbobps.Text,

Left(CboParity.Text, 1), 8, 1) ' 串口设置

If MSComm1.PortOpen = True Then

Txtstatus.Text = "STATUS:" & cboport.Text & " OPEND," & cbobps.Text & "," &

Left(CboParity.Text, 1) & "," & 8 & "," & 1

Else

Txtstatus.Text = "STATUS:COM Port Cloced" ' 串口状态显示

End If

Err:

End Sub

'=====================关闭串口=====================

Private Sub CloseCom()

On Error GoTo Err

If MSComm1.PortOpen = True Then MSComm1.PortOpen =

False ' 先判断串口是否打开,是,则关闭

Txtstatus.Text = "STATUS:COM Port Cloced" ' 串口状态显示

Err:

End Sub

Private Sub Form_Load()

cmdtest.Enabled = False

If MSComm1.PortOpen = True Then MSComm1.PortOpen = False ' 先判断串口是否打开,如果打开则先关闭

Call Comm_initial(Val(Mid(cboport.Text, 4, 1)), cbobps.Text, Left(CboParity.Text, 1), 8, 1) ' 初始化串口

MSComm1.InputMode = comInputModeBinary '通过二进制方式读取数据

End Sub

'===================串口设置按钮=======================

Private Sub cmdset_Click()

TxtReceive.Text = ""

If MSComm1.PortOpen = True Then MSComm1.PortOpen = False

Call OpenCom

End If

End Sub

'===================================接收前CRC校验

==============================================

Private Sub prerecv()

Dim m As Integer

Dim n As Integer

Dim crcdata() As Byte

Dim ValCRC As Long

Dim Jyh0 As Byte

Dim Jyh1 As Byte

m = Len(Replace(TxtReceive.Text, Space(1), Space(0)))

ReDim dt(m / 2 - 1) As Byte

ReDim crcdata(m / 2 - 3) As Byte

For n = 0 To m / 2 - 1

dt(n) = Val("&H" + Mid(Replace(TxtReceive.Text, Space(1), Space(0)), n * 2 + 1, 2))

Next n

For n = 0 To m / 2 - 3

crcdata(n) = dt(n)

Next n

ValCRC =

CRC(crcdata) '计算收到数据的crc校验码

Jyh0 = ValCRC Mod

256 '取crc校验码的高位

Jyh1 = Int(ValCRC /

256) '取crc校验码的低位

If (dt(m / 2 - 2) = Jyh0 And dt(m / 2 - 1) = Jyh1) Then '如果接收到的数据crc校验正确,则继续

pd = True

TxtReceive.Text = ""

Else

pd = False

End If

End Sub

'===================================发送前生成CRC码

==============================================

Private Sub presend()

Dim m As Integer

Dim n As Integer

Dim data() As Byte

Dim crcdata() As Byte

Dim ValCRC As Long

Dim Jyh0 As Byte

Dim Jyh1 As Byte

m = Len(Replace(TxtSend.Text, Space(1), Space(0)))

If m >= 2 Then

ReDim data(m / 2 - 1) As Byte

For n = 0 To m / 2 - 1

data(n) = Val("&H" + Mid(Replace(TxtSend.Text, Space(1), Space(0)), n * 2

+ 1, 2))

Next n

ValCRC =

CRC(data) '计算待发送数据的crc校验码

Jyh0 = ValCRC Mod

256 '取crc校验码的高位

Jyh1 = Int(ValCRC /

256) '取crc校验码的低位

TxtSend.Text = TxtSend.Text & Hex(Jyh0) &

Hex(Jyh1) '将校验码加在待发送数据的末尾

End If

End Sub

'================================================================================== ==

' 数据发送

'================================================================================== ==

Private Sub dataSend()

On Error Resume Next

Dim outdata As String

Dim outputLen As

Integer ' 发送数据长度

Dim SendArr() As

Byte ' 发送数组

Dim TemporarySave As

String ' 数据暂存

Dim dataCount As

Integer ' 数据个数计数

Dim i As

Integer ' 局部变量

outdata = Replace(TxtSend.Text, Space(1), Space(0)) ' 先去掉空格

outdata = UCase(outdata)

outputLen =

Len(outdata) ' 数据长度

For i = 0 To outputLen

TemporarySave = Mid(outdata, i + 1, 1) ' 取一位数据

If (Asc(TemporarySave) >= 48 And Asc(TemporarySave) <= 57) Or

(Asc(TemporarySave) >= 65 And Asc(TemporarySave) <= 70) Then

dataCount = dataCount + 1

Else

Exit For

Exit Sub

End If

Next

If dataCount Mod 2 <> 0 Then ' 判断十六进制数据是否为双数

dataCount = dataCount - 1 ' 不是双数,则减1

End If

outdata = Left(outdata, dataCount)

ReDim SendArr(dataCount / 2 - 1) ' 重新定义数组长度

For i = 0 To dataCount / 2 - 1

SendArr(i) = Val("&H" + Mid(outdata, i * 2 + 1, 2)) ' 取出数据转换成十六进制并放入数组中

Next

TxtSend.Text = ""

MSComm1.Output =

SendArr ' 发送数据

End Sub

'================================================================================== ==

' 数据接收

'================================================================================== ==

Private Sub dataReceive()

Dim ReceiveArr() As

Byte ' 接收数据数组

Dim receiveData As

String ' 数据暂存

Dim Counter As

Integer ' 接收数据个数计数器

Dim i As

Integer ' 循环变量

If (MSComm1.InBufferCount > 0) Then

Counter = MSComm1.InBufferCount ' 读取接收数据个数

receiveData =

"" ' 清缓冲

ReceiveArr =

MSComm1.Input ' 数据放入数组

For i = 0 To (Counter - 1) Step 1 ' '将接收缓存区的数据依次写入数据暂存变量

If (ReceiveArr(i) < 16) Then

receiveData = receiveData & "0" + Hex(ReceiveArr(i)) ' 小于16,前面加0后写入

Else

receiveData = receiveData & Hex(ReceiveArr(i)) '大于16,直接写入

End If

Next i

TxtReceive.Text = TxtReceive.Text + receiveData ' 存储接收的数据到TxtReceive

TxtReceive.SelStart =

Len(TxtReceive.Text) ' 显示光标位置

End If

If Len(Replace(TxtReceive.Text, Space(1), Space(0))) = 62 Then

Call prerecv

Call showdata

End If

End Sub

Private Sub MSComm1_OnComm()

On Error GoTo Err

Select Case

https://www.doczj.com/doc/2b6265514.html,mEvent ' 每接收1个数就触发一次

Case comEvReceive

Call dataReceive ' 调用数据接收函数

Case Else

End Select

相关主题
文本预览
相关文档 最新文档