vb串口通信.docx

上传人:b****6 文档编号:6836182 上传时间:2023-01-11 格式:DOCX 页数:14 大小:20.80KB
下载 相关 举报
vb串口通信.docx_第1页
第1页 / 共14页
vb串口通信.docx_第2页
第2页 / 共14页
vb串口通信.docx_第3页
第3页 / 共14页
vb串口通信.docx_第4页
第4页 / 共14页
vb串口通信.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

vb串口通信.docx

《vb串口通信.docx》由会员分享,可在线阅读,更多相关《vb串口通信.docx(14页珍藏版)》请在冰豆网上搜索。

vb串口通信.docx

vb串口通信

正在为单片机做上位机程序。

单片机连续发FF030A00000B441703069C33C0AA这样的字符串(以FF开头,AA结束,固定长度)。

请问接收程序如何写?

收到的数据:

FF1100A43A84B418C3B1802A000340AAFF1100A43A84B418C3B1802A000340AAFF1100A43A84B418C3B1802A000340AAFF1100A43A84B418C3B18000FF14B4100FF14B4100FF14B4100FF14B4100FF14B4100FF14B4100FF14B4100FF14B4100FF14B4100FF14B4100FF14B4100

开始的时候数据接收正常,但一会就变成上面这样了。

程序设置:

PrivateSubForm_Load()

WithMSComm1

.CommPort=1

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

.InBufferSize=1024'原来为19

.RThreshold=1'接收1字节触发oncomm事件

.InputMode=comInputModeBinary

.InputLen=1'输入长度为19

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

EndWith

'打开端口

IfMSComm1.PortOpen=FalseThen

MSComm1.PortOpen=True

IfErrThen

MsgBox(Err.Description)

ExitSub

EndIf

EndIf

EndSub

PrivateSubMSComm1_OnComm()

DimS()AsByte

DimSS(1024)AsByte

StaticNAsLong

StaticTAsVariant

DimintInputLenAsInteger

If(MSComm1.CommEvent=comEvReceive)Then

S=MSComm1.Input'只要有数据就收进来,哪怕只是一个

T=Timer

Fori=0ToUBound(S)

'一个数据包可能产生若干个oncomm事件

IfCheck1.Value=1AndLen(Text1.Text)>2000ThenText1.Text=""

Text1.Text=Text1.Text&Right(Hex(S(i)),3)+""

SS(N+i)=S(i)'接收数据包缓存于SS()

N=N+UBound(S)

Nexti

'MSComm1.InBufferCount=0

EndIf

EndSub

请各位高手指点

 

IfMSComm1.PortOpenThenMSComm1.PortOpen=False

MSComm1.CommPort=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"'发送字符串

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

PrivateSubMSComm1_OnComm()'用串口事件捕捉数据..

IfMSComm1.InBufferCountThen

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

InStringB=InStringB&MSComm1.Input

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

IfInStr(InStringB,vbCrLf)Then

instring=instring&InStringB

AddTextText3,InStringB,False

InStringB=""

EndIf

EndIf

ENDSUB

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

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

Top

回复人:

jessezappy(晶晶)()信誉:

982002-01-2502:

05:

50Z得分:

0

?

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

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

VBMscomm控件应用

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

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

VisualBasic6.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。

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

1ComEvReceive接受到Rthreshold个字符。

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

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

3ComEvCTSClearToSend信号线状态发生变化。

4ComEvDSRDataSetReady信号线状态从1变到0。

5ComEvCDCarrierDetect信号线状态发生变化。

6ComEvRing检测到振铃信号。

7ComEvEOF接受到文件结束符。

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

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

1002ComEvntCTSTOClearToSend信号超时。

1003ComEvntDSRTODataSetReady信号超时。

1004ComEvntFrame帧错误。

1006ComEvntOverrun串口超速。

1007ComEvntCDTO载波检测超时。

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

1009ComEvntRxParity奇偶校验错。

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

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

实例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.主要方法与事件代码

'设置可用串口

PrivateSubForm_Load()

OnErrorGoToerror_open

Fori=1To4

MSComm1.CommPort=i

MSComm1.PortOpen=True

'设置可用的第一个串口

OnErrorGoTo0

ExitSub

error_resume:

Next

error_open:

Resumeerror_resume

EndSub

  

PrivateSubDialButton_Click()

DimNumber$,Temp$

Number$=Trim$(Txttel.Text)

IfNumber$=“"Then

MsgBox“请输入电话号码"

Txttel.SetFocus

ExitSub

EndIf

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

EndSub

  

PrivateSubMSComm1_OnComm()

SelectCaseMSComm1.CommEvent

CasecomEvReceive

'读取串口数据

COMBUF=COMBUF+MSComm1.Input

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

Iflc=0ThenExitSub

'Modem已正常拨号,返回OK

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

准备通话”

CasecomEvSend

EndSelect

EndSub

  

PrivateSubCancelButton_Click()

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

MSComm1.Output=“ATH”+vbCr

EndSub

实例2:

实现来电显示

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

实现步骤:

1.创建窗体

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

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

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

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

●为方便调试程序,添加一个Text控件Text5,用来显示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.主要方法与事件代码

'通用声明部分

ConstDEBFLG=1

PublicCOMX,BEEPNO,HANGUP,PNLOCAsInteger

PublicCOMBUF,COMLINAsString

PrivateSubForm_Load()

'检测串行口

DimI,CAsInteger

COMX=0

COMBUF=“”

COMLIN=“”

BEEPNO=0

HANGUP=0

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

IfDEBFLG=0Then

Form1.Width=Form1.Width-Text5.Width

Text5.Enabled=False

Text5.Visible=False

EndIf

OnErrorGoToERROR_FORM_LOAD

'检测可用串口

ForC=1To4

IfMSComm1.PortOpenThenMSComm1.PortOpen=False

MSComm1.CommPort=C

IfNotMSComm1.PortOpenThen

MSComm1.PortOpen=True

IfMSComm1.PortOpenThenMSComm1.PortOpen=False

IfCOMX=0ThenCOMX=C

FORM_LOAD_1:

NextC

IfCOMX=0ThenEnd

OnErrorGoTo0

Option1(COMX-1).Value=True

ExitSub

ERROR_FORM_LOAD:

Option1(C-1).Enabled=False

ResumeFORM_LOAD_1

EndSub

  

'选择串行口

PrivateSubOption1_Click(IndexAsInteger)

COMX=Index+1

CallINIT_MODEM

EndSub

  

'初试化Modem

PrivateSubINIT_MODEM()

IfMSComm1.PortOpenThenMSComm1.PortOpen=False

MSComm1.CommPort=COMX

IfNotMSComm1.PortOpenThenMSComm1.

PortOpen=True

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

'检查Modem命令是否完成

CallCHK_MODEM

MSComm1.Output=“ATS0=0”+vbCr

EndSub

  

'检查Modem命令是否完成

PrivateSubCHK_MODEM()

DimTAsSingle

DimLAsInteger

T=Timer

Do

COMBUF=COMBUF+MSComm1.Input

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

LoopUntilL<>0OrTimer-T>1

IfL=0Then

Line1.Visible=True

Line2.Visible=True

Form1.Show

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

Else

Line1.Visible=False

Line2.Visible=False

EndIf

EndSub

  

'串行口接收事件处理

PrivateSubMSComm1_OnComm()

DimCH,STAsString

DimLCAsInteger

SelectCaseMSComm1.CommEvent

'接收到Rthreshold个字符

CasecomEvReceive

COMBUF=COMBUF+MSComm1.Input

'读取串口数据

Do

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

IfLC=0ThenExitDo

COMLIN=Left(COMBUF,LC)

COMBUF=Mid(COMBUF,LC+1)

CH=Left(COMLIN,1)

If“”

Text5.Text=Text5.Text+COMLIN

Text5.SelStart=Len(Text5.Text)

EndIf

'截取来电号码,并显示

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

ST=Mid(COMLIN,8)

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

Form1.WindowState=0

Timer1.Enabled=True

CallBEEP_NO

'截取来电日期,并显示

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

Text3.Text=Str(Year(DATE))+“.”+Mid(COMLIN,8,2)+“.”+Mid(COMLIN,10,2)+“”

'截取来电时间,并显示

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

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

”+Mid(COMLIN,10,2)

'检测振铃个数

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

CallBEEP_NO

IfHANGUP=1OrBEEPNO=15ThenCallHANG_UP

'检测是否停止振铃

ElseIfLeft(COMLIN,3)=“000”Then

BE

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1