VB串口通信实例讲解

所需积分/C币:28 2012-05-09 22:01:52 1.13MB PDF
收藏 收藏
举报

VB串口通信实例讲解,系统讲解各个模块作用以及如何设置,还有源程序,特别适用于初学者。
Visual basic数据采集与串口通信测控应用实战 工具箱中有了 MSComm控件,就可以选择 MSComm控件的图标后将其添加到程序窗体 上,利用该控件编程,PC就可以通过VB实现与串口设备的串口通信了。 由于每个使用的 MSComm控件对应着一个串行端口,如果应用程序需要访问多个串行 端口,必须添加多个 MSComm控件。 PC机与PC机串口通信 (2)为了实现连续的自动接收,将工具箱中的 Timer控收部 件添加到程序窗体上。 (3)添加两个文本框控件:Text1和Text2,用于输入要 发送的字符和显示要接收的字符 入发送字符区 (4)添加两个标签控件: Labell和 Label2,作为发送和 接收字符区的标签 发送字符 (5)添加一个按钮控件: Command1执行发送字符命令。 程序设计界面如图6-2所示。 图6-2程序窗体界面 属性设置 从属性窗口设置属性时,只需从对象列表框中选择待设置属性的对象,然后从属性列表 的左列选择属性,最后在属性列表的右列中输入或选择新的属性值。 程序窗体、控件对象的主要属性设置如表6-2所示。 表 窗体、控件对象的主要属性设置 控件类型 主要属性 功能 (名称)= COMFort 窗体控件 Border Style=3 运行时窗体固定大小 Caption=PC与PC串口通信 窗体标题栏显示程序名称 (名称)= Labell 标签控件 Caption=显示接收字符区: 标签文本 (名称)= Label2 标签控件 Label Caption=输入发送字符区 标签文本 (名称)= Textsend 文本框控件 TextBox Multiline= true 允许多行显示 ScrollBars=2-Vertical 垂直滚动条可用 (名称)= TextReceive 文本框控件 TextBox Multiline= true 允许多行显示 ScrollBars=2-Vertical 垂直滚动条可用 (名称)= Cmdsend 按钮控件 CommandButton Caption=发送字符 手动发送字符 (名称)= MSComm 串口通信控件 MSComm 其他属性在程序中设置 (名称)=Ti Imer 时钟控件 Timer Enabled= True 时钟初始可用 Interval= 500 设置发送周期(ms) -174 第6章VB串口通信程序设计典型实例 。两台计算机中VB程序界面及属性设置应完全相同,尤其 MSComm控件的 InputMode和 Settings 属性值应相同 程序代码设计 程序要实现自动发送或读取,在VB程序中有两个方式可以达到,一是查询方式,利用 査询事件是否发生,当发生时,去执行默认的程序代码。可以使用计时器控件( Timer),该 控件属性中的 Interval可以控制计时器被启动的时间间隔,当时间间隔一到,便会执行原先 放在计时器中的程序代码 下面是利用查询方式编写的PC与PC串口通信的参考程序,代码如下所示 串口初始化 Private Sub Form Load MSComml. comm Port= 1 设置通信端口号为COM1 MSComml Settings =9600, n, 8, 1 设置串口1参数 MSComml. InputMode=0 接收文本型数据 MSComml. PortOpen= True 打开通信端口 End sub 把字符通过串口发送出去 Private Sub Cmdsend Click If Textsend Text=""Then pp= Msg Boxe"发送的数据不能为空!",16) Exit Sub End If MSComml. Output- Trim(Textsend. Text) Fori=1To20000000 Next i End Sub 通过时钟控制来自动接收字符 Private Sub Timer_ Timer Dim bufs buf= Trim(MSComm1 Input 将缓冲区内的数据读入buf变量中 If Len(buf)<>tHen 判断缓冲区内是否存在数据 TextReceive. Text= TextReceive. Text+Chr(13)+Chr(10)+buf∥车换行 End If End Sub 关闭通信端口,停止程序运行 Private Sub Cmdquit Click MSComml. PortOpen- False End Sub 在 Windows系统环境下,串口是系统资源的一部分。应用程序要使用串口进行通信,必 须在使用之前向操作系统提出资源申请要求(打开串口),通信完成后必须释放资源(关闭串 口)。在 Windows系统的系统函数中,均包含了支持通信中断的功能。 二是使用事件方式。 MSComm控件提供事件回应功能,可以利用此功能达到自动发送/ 接收的目的。下面是利用事件方式编写的PC与PC串口通信的参考程序,界面设计与图62 基本相同,区别是事件方式不需要时间控件 串口初始化 Private Sub Form Load MSComml. comm Port= 1 设置通信端口号为COMl 175 Visual basic数据采集与串口通信测控应用实战 MSCommI Settings=9600, n, 8, 1 设置串口参数 MSComml. InputMode=0 接收文本型数据 MSComml. THreshold=1接收缓冲区每收到一个字符都会使 MSComm控件触发 On Comm事件 MSComml. PortOpen= True 打开通信端口1 End sub 把字符通过串口发送出去 启动定时器 Private Sub Cmdsend Click If Textsend Text= Then pp= Msg Box("发送的数据不能为空!",16) Exit Sub End If MSComml. Output- Trim(TextsendText) End sub MSComm的 On Comn事件程序 由 Comm Event属性值的不同,将各自的程序代码写入相关的子程序中 只要 THresold中的设定字符数到达时便会使得 Comm Event属性值变成 comEvReceive 圊因此接收的子程序便会被执行 Private Sub MSComml_ OnCommO Dim bufs Select case mscomm l CommEvent 通过取代每一个case表达式来处理每个事件与错误 comEvCD CD线的状态发生变化 comEvcts CTS线的状态发生变化 Case com Evdsr DSR线的状态发生变化 Case com Evreceive buf= Trim(MSComml Input) 将缓冲区内的数据读入buf变量中 Case com EvSend End select TextReceive. Text= TextReceive Text buf End sub 停止程序运行 Private Sub Cmdquit Click Unload me End Sub 关闭通信端口, Private Sub Form Unload( Cancel As Integer) MSCommI. PortOpen- False End Sub 运行程序 程序设计、调试完毕,单击工具栏快捷按钮“启动”,运行程序。 )·两台计算机同时运行本程序 首先在一台计算机程序窗体中发送字符区输入要发送的字符,如“我是第一组,收到请 回话!”,单击“发送字符”按钮,发送区的字符串通过COM1口发送出去 如果联网通信的另一台计算机程序收到字符,则返回字符串,如“收到,我是第2组!”, 如果通信正常该字符串将显示在接收区中。 程序运行界面如图6-3所示。 -176 第6章VB串口通信程序设计典型实例 Pc机与P机串口渐信 显示接收字符区 送字存 图6-3程序运行界面 61.5.2利用API函数实现字符型数据发送与接收 .建立新工程 运行VB,创建标准的工程项目文件,设计程序窗体。 ①添加两个 TextBox控件,用于输入 要发送的字符和显示需接收的字符。 接收数据区 ②添加两个 Label控件,作为发送和 接收字符区的标签。 ③添加一个 Timer控件,用于周期性进放最区 地读取串口数据。 ④添加两个 Command Button控件,分 别执行发送字符、关闭程序等命令。 关闭程序 发送数据 设计的程序界面如图6-4所示。 图6-4程序窗体界面 属性设置 程序窗体、控件对象的主要属性设置如表6-3所示 表 窗体、控件对象的主要属性设置 控件类型 名称 主要属性 功能 Border Style=3 运行时窗体固定大小 Form COMForm Caption=API串口通讯 窗体标题栏显示程序名称 Label Labell Caption=发送数据区: 标签 Label Label2 Caption=接收数据区 标签 Multiline true 允许多行显示 TextBox Textsend Scrollbars =2-Vertical 垂直滚动条可用 Multiline= true 允许多行显示 TextBox TextReceive ollBars=2-Vertical 垂直滚动条可用 Command Button BTNSendCaption=发送数据 手动间断发送字符 CommandButton BTNClose Com Caption=关闭程序 关闭程序 Timer TMRComm Interval=500 设置发送周期(ms) 177 Visual basic数据采集与串口通信测控应用实战 程序代码设计 在程序标准模块 Serialport.bas的说明部分放置使用的API函数声明及所用的结构、常数的声明: Option explicit Global ComNum As Long Global bRead(255)As Byte Type COMSTAT fCtsHold As Long fDsrHold As long fRlsdHold As Long fXoffHold As Long fXoffSent As Long fEof As Long fTim As Long rEserved As Long ciNqUe As long cbOutQue As long End Type Type COMMTIMEOUTS ReadIntervalTimeout As Long ReadTotalTimeoutMultiplier As Long ReadTotalTimeout Constant As Long Write TotalTimeoutMultiplier As Long Write TotalTimeout Constant As long End Type Type dcB DCBlength as long BaudRate As Long fBinary As Long pArity As Long fOutx Cts Flow As Long fOutx DsrFlow As Long Control As Long fDsr Sensitivity As Long fTXContinueOn Xoff As Long fOutX As Long fIn As long fErrorChar As Long fNull As Long fRts Control As Long fAbortOn Error As Long fDummy2 As Long rEserved As Integer XonLim As Integer XoffLim As Integer ByteSize As byte Parity As Byte Stop Bits As Byte Xon char as by XoffChar As Byte Error Char As byte 178 第6章VB串口通信程序设计典型实例 EofChar As byte EvtChar As byte End Type Type OVERLAPPED Internal As Long InternalHigh As Long offset As Long OffsetHigh As long hEvent As Long End type Type SECURITY ATTRIBUTES nLength As long IpSecurity Descriptor As Long bInheritHandle As Long E Declare Function CloseHandle Lib""(By Val hobject As Long)As Long Declare Function GetLast Error Libkernel32"O As Long Declare Function ReadFile Lib"(By Val hFile As Long, lpBuffer As Any, By Val nNumberOfBytes ToRead As Long, IpNumberOfBytesRead As Long, lpOverlapped As Long)As Lon Declare Function WriteFile Lib kernel32"(By Val hFile As Long, lpBuffer As Any, By Val nNumberofBytesTo Write As Long, lpNumberofBytes Written As Long, lpOverlapped As Long)As Long Declare Function Set CommTimeouts Lib kernel32"(By Val hFile As Long, lp Comm Timeouts As COMMTIMEOUTS)AS Long Declare Function Get CommTimeouts Lib kernel32" (By Val hFile As Long, lp CommTimeouts As COMMTIMEOUTS)AS Long Declare Function BuildCommDCB Lib""Alias "BuildCommDCBA"By Val lpDef As String, lpDCB AS DCB)As Long Declare Function SetCommState Lib""(By Val hCommDev As Long, lpDCB As DCB)As Long Declare Function CreateFile Lib kernel32"Alias "Create Filea"(By Val lpFileName As String, By Val dw DesiredAccess As Long, By Val dwShareMode As Long, By Val IpSecurity Attributes As Long, By Val dw CreationDisposition As Long, By Val dw FlagsAndAttributes As Long, By Val hTemplateFile As Long)As Long Declare Function Flush FileBuffers Lib"kernel32"(By Val hFile As Long)As Long 窗体模块程序如下: 初始化串口 Private Sub Form Load If Not Init_Com("COM1: 9600, n, 8, 1")Then Msg Box"端口"&"无效! Exit sub End If End Sub 发送字符 Private Sub bTNSend Click If WriteCOM32(txt(2)& vbCr < Len(txt(2))Then Msg Box"写入错误 Exit Sub End If End sub 向串口写数据 Function Write COM32(COMString As String) As Integer On Error GoTo handelwritelpt Dim RetBytes As Long, Len Val As Long Dim retval As Long 179 Visual basic数据采集与串口通信测控应用实战 If Len(CoMString)> 255 Then WriteCOM32 LeftS( COMString, 255) Write COM32 RightS(COMString, Len( COMString)-255) Exit function End If For Len val=0 To Len( coMstring bRead( Len val)=Asc(MidS(COMString, Len Val+ 1, 1)) Next Len val retval= WriteFile(ComNum, bRead(o), Len( CoMString), RetBytes, 0) WriteCOM32= RetBytes handelwritelpt Exit function End function 读取数据 Private Sub TMRComm Timer Dim Ans As String, i As Integer, RtnStr As String Ans-ReadCommPureo If Ans=Then Exit Sub RtnStr=RtnStr cleanStr(Ans) txtRec. Text= Rtn Str FlushComm End Sub 从串口读取数据 Function Read PureE As String On Error goto handelpurecom Dim RetBytes As Long, i As Integer, ReadStr As String, retval As Long Dim CheckTotal As Integer, CheckDigitLC As Integer retval- ReadFile(ComNum, bRead(o), 255, Ret Bytes, 0) Readstr If (RetBytes>0) Then Fori=0 To RetBytes-1 Readstr=Readstr chr(bRead(i)) Next i Else Flush Comm End If Read CommPure= ReadStr handelpurecom Exit Function End Function Function Clean Str(TextLine As String)As String Dim i As Integer, RtnStr As String Rtn Str For i=I To Len(textline Select Case Asc(MidS(TextLine, i, 1)) Case &HSD Rtn Str= Rtn Str &"ACK> Case &H5B Rtn Str= rtn str& <NaK> Case is >=&H30 RtnStr=RtnStr MidS(TextLine, i, 1) Case 13 第6章VB串口通信程序设计典型实例 Rtn Str= Rtn Str&<cr> Case 10 Rtn Str= rtn Str&<LF> Case else RtnStr=RtnStr&"@ End select Next i Clean Str= rtnStr End function 清空文件缓冲区 Function FlushCommO Flush Buffers( ComNum) End function 初始化端口 Function Init_ Com(ComNumber As String, Comsettings As String) As Boolean On Error goto handelinitcom Dim Com Setup As DCB, Answer, Stat As COMSTAT, RetBytes As Long Dim retval As Long Dim Ctimeout As commtimeouts. BarDCB As dCB 打开通讯口读/写(&HC000000 必须指定存在的文件(3) ComNum= Create File(ComNumber, &hco000000, 0, 0&,&H3, 0, 0) If Com Num=-1 Then Msg Box"端口"& ComNumber&"无效.请设置正确",48 Init Com= False Exit Function End If 超时 Ctime Out ReadIntervalTimeout =20 Ctime Out. ReadTotalTimeoutConstant= 1 Ctime Out. Read TotalTimeoutMultiplier=1 Ctime Out. WriteTotalTimeoutConstant=10 Ctime Out. WriteTotalTimeoutMultiplier=1 retval= SetComm Timeouts( ComNum, Ctime Out If retval =-I Then retval- GetLastErroro Msg Box"端口超时设定无效"& ComNumber&"错误:"& retval retval=CloseHandle( ComNum) Init Com= False Exit function End If retval- BuildCommDCB(Comsettings, BarDCB) If retval=-l Then retval- GetLastErrorO Msg Box"无效设备DCB块"& Comsettings&"错误:"& retval retval- CloseHandle( ComNum) Init Com= fals Exit function End If retval- SetCommState(ComNum, BarDCB) If retval=-l Then retval- GetLastErrorO l81

...展开详情
试读 37P VB串口通信实例讲解
立即下载 低至0.43元/次 身份认证VIP会员低至7折
一个资源只可评论一次,评论内容不能少于5个字
齐达内 的确是不错,有很大帮助。谢谢
2012-12-29
回复
关注 私信 TA的资源
上传资源赚积分,得勋章
最新推荐
VB串口通信实例讲解 28积分/C币 立即下载
1/37
VB串口通信实例讲解第1页
VB串口通信实例讲解第2页
VB串口通信实例讲解第3页
VB串口通信实例讲解第4页
VB串口通信实例讲解第5页
VB串口通信实例讲解第6页
VB串口通信实例讲解第7页
VB串口通信实例讲解第8页

试读结束, 可继续读4页

28积分/C币 立即下载 >