vb串口通信.docx
- 文档编号:20201875
- 上传时间:2023-04-25
- 格式:DOCX
- 页数:17
- 大小:20.74KB
vb串口通信.docx
《vb串口通信.docx》由会员分享,可在线阅读,更多相关《vb串口通信.docx(17页珍藏版)》请在冰豆网上搜索。
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- vb 串口 通信