《vb串口通信-.pdf》由会员分享,可在线阅读,更多相关《vb串口通信-.pdf(11页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、正在为单片机做上位机程序。单片机连续发FF030A00000B441703069C33C0AA这样的字符串(以 FF 开头,AA 结束,固定长度)。请问接收程序如何写?收到的数据:FF 1 1 0 0 A4 3A 8 4B 41 8C 3B 18 0 2A 0 0 0 34 0 AA FF 1 1 0 0 A4 3A 8 4B 41 8C 3B 18 0 2A 0 0 0 34 0 AA FF 1 1 0 0 A4 3A 8 4B 41 8C 3B 18 0 2A 0 0 0 34 0 AA FF 1 1 0 0 A4 3A 8 4B 41 8C 3B 18 0 0 0 FF 1 4B 41
2、0 0 FF 1 4B 41 0 0 FF 1 4B 41 0 0 FF 1 4B 41 0 0 FF 1 4B 41 0 0 FF 1 4B 41 0 0 FF 1 4B 41 0 0 FF 1 4B 41 0 0 FF 1 4B 41 0 0 FF 1 4B 41 0 0 FF 1 4B 41 0 0 开始的时候数据接收正常,但一会就变成上面这样了。程序设置:Private Sub Form_Load()With MSComm1.CommPort=1.Settings=9600,N,8,1.InBufferSize=1024 原来为 19.RThreshold=1 接收 1 字节触发onc
3、omm 事件.InputMode=comInputModeBinary.InputLen=1 输入长度为19.InBufferCount=0 清除接收缓冲区End With 打开端口If MSComm1.PortOpen=False Then MSComm1.PortOpen=True If Err Then MsgBox(Err.Description)Exit Sub End If End If End Sub Private Sub MSComm1_OnComm()Dim S()As Byte Dim SS(1024)As Byte Static N As Long Static T A
4、s Variant Dim intInputLen As Integer If(MSComm1.CommEvent=comEvReceive)Then S=MSComm1.Input 只要有数据就收进来,哪怕只是一个T=Timer For i=0 To UBound(S)一个数据包可能产生若干个oncomm 事件If Check1.Value=1 And Len(Text1.Text)2000 Then Text1.Text=Text1.Text=Text1.Text&Right(Hex(S(i),3)+SS(N+i)=S(i)接收数据包缓存于SS()N=N+UBound(S)Next i M
5、SComm1.InBufferCount=0 End If End Sub 请各位高手指点本贴被kunzhe 编辑过,最后修改时间:2008-12-11,14:05:46.2008-12-10,13:48:29 资料邮件回复引用回复编辑删除【1 楼】aaron96031 LF 积分:351 派别:等级:-来自:珠海你的问题可能在MCU 的通讯程序2009-03-23,12:32:29 资料邮件回复引用回复编辑删除【2 楼】lcgforward 怒放人生积分:74 派别:等级:-来自:江西龙南-深圳把数组定为全局的,或静态的试试,你这样每一次调用都会不一样啊。If MSComm1.PortOpe
6、n Then MSComm1.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.O
7、utput=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-挂断-MS
8、Comm1.PortOpen=False 这个挂断方法不能适用所有MODEM,我正在研究.通用办法Top 回复人:jessezappy(晶晶)()信誉:98 2002-01-25 02:05:50Z 得分:0?最后借你一篇文章看,作者不是我,里面的不一定都对.-VB Mscomm 控件应用江苏戚墅堰机车车辆厂设计处(213011)李秉璋-Visual Basic 6.0(以下简称VB)是一种功能强大、简单易学的程序设计语言。它不但保留了原先 Basic 语言的全部功能,而且还增加了面向对象程序设计功能。它不仅可以方便快捷地编制适用于数据处理、多媒体等方面的程序,而且利用ActiveX 控件 M
9、SComm 还能十分方便地开发出使用计算机串口的计算机通信程序。本文结合计算机通信的两个例子,详细介绍如何在 VB 中使用 MSComm 控件。处理方式MSComm 控件提供了两种处理通信的方式:一种为事件驱动方式,该方式相当于一般程序设计中的中断方式。当串口发生事件或错误时,MSComm 控件会产生OnComm 事件,用户程序可以捕获该事件进行相应处理。本文的两个例子均采用该方式。另一种为查询方式,在用户程序中设计定时或不定时查询MSComm 控件的某些属性是否发生变化,从而确定相应处理。在程序空闲时间较多时可以采用该方式。常用属性和方法利用 MSComm 控件实现计算机通信的关键是理解并正
10、确设置MSComm 控件众多属性和方法。以下是MSComm 控件的常用属性和方法:Commport:设置或返回串口号。Settings:以字符串的形式设置或返回串口通信参数。Portopen:设置或返回串口状态。InputMode:设置或返回接收数据的类型。Inputlen:设置或返回一次从接收缓冲区中读取字节数。InBufferSize:设置或返回接收缓冲区的大小,缺省值为1024 字节。InBufferCount:设置或返回接收缓冲区中等待计算机接收的字符数。Input:从接收缓冲区中读取数据并清空该缓冲区,该属性设计时无效,运行时只读。OutBufferSize:设置或返回发送缓冲区的大
11、小,缺省值为512 字节。OutBufferCount:设置或返回发送缓冲区中等待计算机发送的字符数。Output:向发送缓冲区发送数据,该属性设计时无效,运行时只读。Rthreshold:该属性为一阀值。当接收缓冲区中字符数达到该值时,MSComm控件设置Commevent 属性为 ComEvReceive,并产生OnComm 事件。用户可在OnComm 事件处理程序中进行相应处理。若Rthreshold 属性设置为0,则不产生OnComm 事件。例如用户希望接收缓冲区中达到一个字符就接收一个字符,可将Rthreshold 设置为 1。这样接收缓冲区中接收到一个字符,就产生一次OnComm
12、事件。Sthreshold:该属性亦为一阀值。当发送缓冲区中字符数小于该值时,MSComm 控件设置Commevent 属性为 ComEvSend,并产生OnComm 事件。若 Sthreshold 属性设置为0,则不产生OnComm 事件。要特别注意的是仅当发送缓冲区中字符数小于该值的瞬间才产生OnComm 事件,其后就不再产生OnComm 事件。例如Sthreshold 设置为3,仅当发送缓冲区中字符数从3 降为 2 时,MSComm 控件设置Commevent 属性为 ComEvSend,同时产生OnComm 事件,如发送缓冲区中字符始终为2,则不会再产生OnComm 事件。这就避免了发
13、送缓冲区中数据未发送完就反复发生OnComm 事件。CommEvent:这是一个非常重要的属性。该属性设计时无效,运行时只读。一旦串口发生通信事件或产生错误,依据产生的事件和错误,MSComm 控件为 CommEvent 属性赋不同的代码,同时产生OnComm 事件。用户程序就可在OnComm 事件处理程序中针对不同的代码,进行相应的处理。CommEvent 属性的代码、常数及含义参见表1 及表 2。表 1 CommEvent 通信事件代码常数含义1 ComEvReceive 接受到 Rthreshold 个字符。该事件将持续产生,直到用 Input 属性从接受缓冲区中读取并删除字符。2 Co
14、mEvSend 发送缓冲区中数据少于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
15、信号超时。1003 ComEvntDSRTO Data Set Ready 信号超时。1004 ComEvntFrame 帧错误。1006 ComEvntOverrun 串口超速。1007 ComEvntCDTO 载波检测超时。1008 ComEvntRxOver 接受缓冲区溢出,缓冲区中已没有空间。1009 ComEvntRxParity 奇偶校验错。1010 ComEvntTxFull 发送缓冲区溢出,缓冲区中已没有空间。1011 ComEvntDCB 检索串口的设备控制块时发生错误。实例 1:计算机拨号在一些实际应用中经常需要使用计算机拨号。下面这个例子利用MSComm 控件操作Mode
16、m进行拨号,实现串口通信。实现步骤: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
17、=“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 MSComm1.CommPort=i MSComm1.PortOpen=True 设置可用的第一个串口On Error GoTo 0 Exit S
18、ub error_resume:Next error_open:Resume error_resume End Sub Private Sub DialButton_Click()Dim Number ,TempNumber=Trim(Txttel.Text)If Number =“Then MsgBox“请输入电话号码 Txttel.SetFocus Exit Sub End If DialButton.Enabled=False QuitButton.Enabled=False DialString =“ATDT”Number “;”vbCr 清除接收缓冲区MSComm1.InBuffer
19、Count=0 拨电话号码MSComm1.Output=DialString Lblmessage.Caption=“正在拨号码”NumberDialButton.Enabled=True QuitButton.Enabled=True End Sub Private Sub MSComm1_OnComm()Select Case MSComm1.CommEvent Case comEvReceive 读取串口数据COMBUF=COMBUF MSComm1.Input lc=InStr(1,COMBUF,“OK”)If lc=0 Then Exit Sub Modem 已正常拨号,返回OK L
20、blmessage.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 控件,用来显示来电号码及日期时间
21、;添加一个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=时分回车换行NM
22、BR=电话号码回车换行”。在 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
23、 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 MSComm1.CommPort=C If Not MSComm1.PortOpen Then MSComm1.PortOpen=True If MSComm1.PortOpen Then MSComm1.PortOpen=False I
24、f 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()
25、If MSComm1.PortOpen Then MSComm1.PortOpen=False MSComm1.CommPort=COMX If Not MSComm1.PortOpen Then MSComm1.PortOpen=True MSComm1.Output=“ATCID=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 CO
26、MBUF=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 Strin
27、g Dim LC As Integer Select Case MSComm1.CommEvent 接收到 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
28、Text5.SelStart=Len(Text5.Text)End If 截取来电号码,并显示If InStr(1,COMLIN“NMBR=”)0 Then ST=Mid(COMLIN,8)Text2.Text=“”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(DA TE)“.”Mid(COMLIN,8,2)“.”Mid(COMLIN,10,2)“”截取来电时间,并
29、显示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“串口接收事件号:”MSComm1.CommEvent “”,vbOKOnly vbCritical,“测试串行口”End Select End Sub
限制150内