为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

Visual_Basic串口通信程序设计实例

2012-04-17 50页 doc 1MB 105阅读

用户头像

is_509981

暂无简介

举报
Visual_Basic串口通信程序设计实例 第6章 Visual Basic串口通信程序设计典型实例 利用Visual Basic开发串口通信程序既可以使用MSComm控件也可以调用Windows API函数。不过,只要MSComm可以被选用,它几乎总是我们推荐的选择,因为MSComm的功能和API调用一样好甚至比它还好且使用起来更加简单。 在本章提供的串口通信程序设计中,除了PC机与PC机串口通信外,PC机与单片机、PC机与智能仪表、PC机与PLC、PC机与GSM短信模块等串口通信任务的实现均采用MSComm控件。 6.1 PC机与PC机串口通信程序设计 ...
Visual_Basic串口通信程序设计实例
第6章 Visual Basic串口通信程序典型实例 利用Visual Basic开发串口通信程序既可以使用MSComm控件也可以调用Windows API函数。不过,只要MSComm可以被选用,它几乎总是我们推荐的选择,因为MSComm的功能和API调用一样好甚至比它还好且使用起来更加简单。 在本章提供的串口通信程序设计中,除了PC机与PC机串口通信外,PC机与单片机、PC机与智能仪、PC机与PLC、PC机与GSM短信模块等串口通信任务的实现均采用MSComm控件。 6.1 PC机与PC机串口通信程序设计 当两台串口设备通信距离较近时,可以直接连接,最简单的情况,在通信中只需三根线(发送线、接收线、信号地线)便可实现全双工异步串行通信。 本设计通过两台PC机串口三线连接,介绍了利用API函数和MSComm控件设计串口通信程序的方法,包括字符与文件的发送与接收。 6.1.1 设计目的 1)掌握PC机与PC机串口通信的线路连接方法。 2)利用MSComm控件和VB-API函数实现PC机与PC机串口通信的程序设计方法。 6.1.2 设计用软、硬件 本设计用到的硬件和软件清单见表6-1。 表6-1 设计用软、硬件 序 号 名 称 数 量 1 PC或IPC 2 2 串口通信线(三线制) 1 3 Visual Basic 6.0 1 6.1.3 硬件线路 线路说明:在计算机通电前,按图6-1所示将2台PC机通过串口线连接起来:PC机A串口COM1端口的TXD与PC机B串口COM1端口的RXD相连;PC机A串口COM1端口的RXD与PC机B串口COM1端口的TXD相连;PC机A串口COM1端口的GND与PC机B串口COM1端口的GND相连。 6.1.4 设计任务 利用MSComm控件和Visual Basic API函数编写程序实现PC机与PC机串口通信。 任务要求:两台计算机互发字符并自动接收,如一台计算机输入字符串“Please return abc123”,单击“发送字符”命令,另一台计算机若收到,就输入字符串“abc123”,单击“发送字符”命令,信息返回到第一组的计算机。 实际上就是编写一个简单的双机聊天程序。 6.1.5 任务实现 6.1.5.1 利用MSComm控件实现字符型数据发送与接收 1.建立新 VB使用“工程”来管理每一个应用程序要使用的所有文件,每建立一个新程序,就要新建一个工程。一个工程由窗体、标准模块、控件及应用所需的环境设置等组成。 运行VB 6.0程序,出现“新建工程”对话框,选择“标准EXE”,单击“打开”命令按钮,进入VB工程集成开发环境,窗体设计器中自动出现一个名为Form1的空白窗体。 2.程序界面设计 向空白窗体添加各种控件,以完成预定的各种功能。我们开始一个项目的设计时,VB的工具箱中会有许多默认的控件让设计者予以选用,这些原本就出现在工具箱中的控件是内置控件,它提供了一些基本的系统设计组件给设计者,不过,功能比较特别的控件就不会出现在其中,如用来设计串口通信功能的控件MSComm就不在其中。 1)添加串口通信控件MSComm 由于VB的串行通信组件并不会主动出现在工具箱里中,当我们需要MSComm控件时,首先要把它加入到工具箱中。 让MSComm控件出现在工具箱中的步骤如下: 选择“工程”菜单下的“部件…”子菜单,在弹出的“部件”对话框中,在“控件”选项卡属性中选中“Microsoft Comm Control 6.0”复选框,单击“确定”按钮后,在工具箱中就出现了一个形似“电话”的图标,它就是MSComm控件。 工具箱中有了MSComm控件,就可以选择MSComm控件的图标后将其加到程序窗体上,利用该控件PC机就可以通过VB实现与串口设备的串口通信了。 由于每个使用的MSComm控件对应着一个串行端口,如果应用程序需要访问多个串行端口,必须添加多个MSComm控件。 2)为了实现连续的自动接收,将工具箱中的Timer控件加到程序窗体上。 3)添加2个文本框控件:Text1 和Text2,用于输入要发送的字符和显示要接收的字符。 4)添加2个标签控件:Label1和Label2,作为发送和接收字符区的标签。 5)添加1个按钮控件:Command1执行发送字符命令。 程序设计界面如图6-2所示。 3.属性设置 从属性窗口设置属性时,只需从对象列表框中选择待设置属性的对象,然后从属性列表的左列选择属性,最后在属性列表的右列中输入或选择新的属性值。 程序窗体、控件对象的主要属性设置见表6-2。 表6-2 窗体、控件对象的主要属性设置 控件类型 主要属性 功 能 Form (名称) = COMForm 窗体控件 BorderStyle = 3 运行时窗体固定大小 Caption = PC机与PC机串口通信 窗体标题栏显示程序名称 Label (名称) = Label1 标签控件 Caption = 显示接收字符区: 标签文本 Label (名称) = Label2 标签控件 Caption = 输入发送字符区: 标签文本 TextBox (名称) = Textsend 文本框控件 MultiLine = True 允许多行显示 ScrollBars = 2-Vertical 垂直滚动条可用 TextBox (名称) = TextReceive 文本框控件 MultiLine = True 允许多行显示 ScrollBars = 2-Vertical 垂直滚动条可用 CommandButton (名称) = Cmdsend 按钮控件 Caption = 发送字符 手动发送字符 MSComm (名称) = MSComm1 串口通信控件 其它属性在程序中设置 Timer (名称) = Timer1 时钟控件 Enabled = True 时钟初始可用 Interval = 500 设置发送周期(毫秒) 注:2台计算机中VB程序界面及属性设置应完全相同,尤其MSComm控件的InputMode、Settings属性值应相同。 4.程序代码设计 程序要实现自动发送或读取,在VB中有两个方式可以达到,一是查询方式,利用查询事件是否发生,当发生时,去执行默认的程序代码。可以使用计时器控件(Timer),该控件属性中的Interval可以控制计时器被启动的时间间隔,当时间间隔一到,便会执行原先放在计时器中的程序代码。 下面是利用查询方式编写的PC与PC串口通信的参考程序: ' 串口初始化 Private Sub Form_Load() MSComm1.CommPort = 1 ' 设置通信端口号为COM1 MSComm1.Settings = "9600,n,8,1" ' 设置串口1参数 MSComm1.InputMode = 0 ' 接收文本型数据 MSComm1.PortOpen = True ' 打开通信端口1 End Sub ' 把字符通过串口发送出去 Private Sub Cmdsend_Click() If Textsend.Text = "" Then pp = MsgBox("发送的数据不能为空!", 16) Exit Sub End If MSComm1.Output = Trim(Textsend.Text) For i = 1 To 20000000 Next i End Sub ' 通过时钟控制来自动接收字符 Private Sub Timer1_Timer() Dim buf$ buf = Trim(MSComm1.Input) ' 将缓冲区内的数据读入buf变量中 If Len(buf) <> 0 Then ' 判断缓冲区内是否存在数据 TextReceive.Text = TextReceive.Text + Chr(13) + Chr(10) + buf //回车换行 End If End Sub ' 关闭通信端口,停止程序运行 Private Sub Cmdquit_Click() MSComm1.PortOpen = False Unload Me End Sub 在Windows环境下,串口是系统资源的一部分。应用程序要使用串口进行通信,必须在使用之前向操作系统提出资源申请要求(打开串口),通信完成后必须释放资源(关闭串口)。在Windows的系统函数中,均包含了支持通信中断的功能。 二是使用事件方式。MSComm控件提供事件回应功能,可以利用此功能达到自动发送/接收的目的。下面是利用事件方式编写的PC与PC串口通信的参考程序,界面设计与图6-2基本相同,区别是事件方式不需要时间控件。 '串口初始化 Private Sub Form_Load() MSComm1.CommPort = 1 '设置通信端口号为COM1 MSComm1.Settings = "9600,n,8,1" '设置串口参数 MSComm1.InputMode = 0 '接收文本型数据 MSComm1.RThreshold = 1 '接收缓冲区每收到一个字符都会使 MSComm 控件触发OnComm 事件 MSComm1.PortOpen = True '打开通信端口1 End Sub '把字符通过串口发送出去 '启动定时器 Private Sub Cmdsend_Click() If Textsend.Text = "" Then pp = MsgBox("发送的数据不能为空!", 16) Exit Sub End If MSComm1.Output = Trim(Textsend.Text) End Sub 'MSComm 的 OnComm 事件程序 '由 CommEvent 属性值的不同,将各自的程序代码写入相关的子程序中 '只要 RThresold 中的设定字符数到达时便会使得 CommEvent 属性值变成 comEvReceive '因此接收的子程序便会被执行 Private Sub MSComm1_OnComm() Dim buf$ Select Case MSComm1.CommEvent '通过取代底下每一个 case 表达式来处理每个事件与错误 Case comEvCD ' CD 线的状态发生变化 Case comEvCTS ' CTS 线的状态发生变化 Case comEvDSR ' DSR 线的状态发生变化 Case comEvReceive buf = Trim(MSComm1.Input) '将缓冲区内的数据读入buf变量中 Case comEvSend End Select TextReceive.Text = TextReceive.Text & buf End Sub '停止程序运行 Private Sub Cmdquit_Click() Unload Me End Sub '关闭通信端口, Private Sub Form_Unload(Cancel As Integer) MSComm1.PortOpen = False End Sub 5.运行程序 程序设计、调试完毕,单击工具栏快捷按钮“启动”,运行程序。注:2台计算机同时运行本程序。 首先在一台计算机程序窗体中发送字符区输入要发送的字符,比如“我是第一组,收到请回话!”,单击“发送字符”按钮,发送区的字符串通过COM1口发送出去; 如果联网通信的另一台计算机程序收到字符,则返回字符串,如“收到,我是第2组!”,如果通信正常该字符串将显示在接收区中。 程序运行画面如图6-3所示。 6.1.5.2 利用API函数实现字符型数据发送与接收 1.建立新工程 运行VB 6.0,创建标准的工程项目文件,设计程序窗体。 1)添加2个TextBox控件,用于输入要发送的字符和显示需接收的字符; 2)添加2个Label控件,作为发送和接收字符区的标签; 3)添加1个Timer控件,用于周期性地读取串口数据; 4)添加2个CommandButton控件,分别执行发送字符、关闭程序等命令。 设计的程序界面见图6-4。 2.属性设置 程序窗体、控件对象的主要属性设置见表6-3。 表6-3 窗体、控件对象的主要属性设置 控件类型 名 称 主要属性 功 能 Form COMForm BorderStyle = 3 运行时窗体固定大小 Caption = API串口通讯 窗体标题栏显示程序名称 Label Label1 Caption =发送数据区: 标签 Label Label2 Caption =接收数据区: 标签 TextBox Textsend MultiLine = True 允许多行显示 ScrollBars = 2-Vertical 垂直滚动条可用 TextBox TextReceive MultiLine = True 允许多行显示 ScrollBars = 2-Vertical 垂直滚动条可用 CommandButton BTNSend Caption = 发送数据 手动间断发送字符 CommandButton BTNCloseCom Caption = 关闭程序 关闭程序 Timer TMRComm Interval = 500 设置发送周期(毫秒) 3.程序代码设计 ' 在程序标准模块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 fTxim As Long fReserved As Long cbInQue As Long cbOutQue As Long End Type Type COMMTIMEOUTS ReadIntervalTimeout As Long ReadTotalTimeoutMultiplier As Long ReadTotalTimeoutConstant As Long WriteTotalTimeoutMultiplier As Long WriteTotalTimeoutConstant As Long End Type Type DCB DCBlength As Long BaudRate As Long fBinary As Long fParity As Long fOutxCtsFlow As Long fOutxDsrFlow As Long fDtrControl As Long fDsrSensitivity As Long fTXContinueOnXoff As Long fOutX As Long fInX As Long fErrorChar As Long fNull As Long fRtsControl As Long fAbortOnError As Long fDummy2 As Long wReserved As Integer XonLim As Integer XoffLim As Integer ByteSize As Byte Parity As Byte StopBits As Byte XonChar As Byte XoffChar As Byte ErrorChar As Byte 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 lpSecurityDescriptor As Long bInheritHandle As Long End Type Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Declare Function GetLastError Lib "kernel32" () As Long Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As Long) As Long Declare Function WriteFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, lpOverlapped As Long) As Long Declare Function SetCommTimeouts Lib "kernel32" (ByVal hFile As Long, lpCommTimeouts As COMMTIMEOUTS) As Long Declare Function GetCommTimeouts Lib "kernel32" (ByVal hFile As Long, lpCommTimeouts As COMMTIMEOUTS) As Long Declare Function BuildCommDCB Lib "kernel32" Alias "BuildCommDCBA" (ByVal lpDef As String, lpDCB As DCB) As Long Declare Function SetCommState Lib "kernel32" (ByVal hCommDev As Long, lpDCB As DCB) As Long Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByVal lpSecurityAttributes As Long, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long Declare Function FlushFileBuffers Lib "kernel32" (ByVal hFile As Long) As Long 窗体模块程序如下: '初始化串口 Private Sub Form_Load() If Not Init_Com("COM1:", "9600,n,8,1") Then MsgBox "端口" & " 无效!" Exit Sub End If End Sub '发送字符 Private Sub BTNSend_Click() If WriteCOM32(txt(2)) & vbCr <> Len(txt(2)) Then MsgBox "写入错误" Exit Sub End If End Sub '向串口写数据 Function WriteCOM32(COMString As String) As Integer On Error GoTo handelwritelpt Dim RetBytes As Long, LenVal As Long Dim retval As Long If Len(COMString) > 255 Then WriteCOM32 Left$(COMString, 255) WriteCOM32 Right$(COMString, Len(COMString) - 255) Exit Function End If For LenVal = 0 To Len(COMString) - 1 bRead(LenVal) = Asc(Mid$(COMString, LenVal + 1, 1)) Next LenVal retval = WriteFile(ComNum, bRead(0), 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 = ReadCommPure() If Ans = "" Then Exit Sub RtnStr = RtnStr & CleanStr(Ans) txtRec.Text = RtnStr FlushComm End Sub '从串口读取数据 Function ReadCommPure() 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(0), 255, RetBytes, 0) ReadStr = "" If (RetBytes > 0) Then For i = 0 To RetBytes - 1 ReadStr = ReadStr & Chr(bRead(i)) Next i Else FlushComm End If ReadCommPure = ReadStr handelpurecom: Exit Function End Function Function CleanStr(TextLine As String) As String Dim i As Integer, RtnStr As String RtnStr = "" For i = 1 To Len(TextLine) Select Case Asc(Mid$(TextLine, i, 1)) Case &H5D RtnStr = RtnStr & "" Case &H5B RtnStr = RtnStr & "" Case Is >= &H30 RtnStr = RtnStr & Mid$(TextLine, i, 1) Case 13 RtnStr = RtnStr & "" Case 10 RtnStr = RtnStr & "" Case Else RtnStr = RtnStr & "@" End Select Next i CleanStr = RtnStr End Function '清空文件缓冲区 Function FlushComm() FlushFileBuffers (ComNum) End Function '初始化端口 Function Init_Com(ComNumber As String, Comsettings As String) As Boolean On Error GoTo handelinitcom Dim ComSetup As DCB, Answer, Stat As COMSTAT, RetBytes As Long Dim retval As Long Dim CtimeOut As COMMTIMEOUTS, BarDCB As DCB ' 打开通讯口读/写(&HC0000000). ' 必须指定存在的文件 (3). ComNum = CreateFile(ComNumber, &HC0000000, 0, 0&, &H3, 0, 0) If ComNum = -1 Then MsgBox "端口 " & ComNumber & "无效. 请设置正确.", 48 Init_Com = False Exit Function End If '超时 CtimeOut.ReadIntervalTimeout = 20 CtimeOut.ReadTotalTimeoutConstant = 1 CtimeOut.ReadTotalTimeoutMultiplier = 1 CtimeOut.WriteTotalTimeoutConstant = 10 CtimeOut.WriteTotalTimeoutMultiplier = 1 retval = SetCommTimeouts(ComNum, CtimeOut) If retval = -1 Then retval = GetLastError() MsgBox "端口超时设定无效 " & ComNumber & " 错误: " & retval retval = CloseHandle(ComNum) Init_Com = False Exit Function End If retval = BuildCommDCB(Comsettings, BarDCB) If retval = -1 Then retval = GetLastError() MsgBox "无效设备 DCB 块 " & Comsettings & " 错误: " & retval retval = CloseHandle(ComNum) Init_Com = False Exit Function End If retval = SetCommState(ComNum, BarDCB) If retval = -1 Then retval = GetLastError() MsgBox "无效设备 DCB 块 " & Comsettings & " 错误: " & retval retval = CloseHandle(ComNum) Init_Com = False Exit Function End If Init_Com = True handelinitcom: Exit Function End Function '关闭程序 Private Sub BTNCloseCom_Click() Unload Me End Sub '关闭端口 Private Sub Form_Unload(Cancel As Integer) CloseHandle (ComNum) End Sub 4.运行程序 程序设计、调试完毕,执行菜单“运行/启动”命令或单击工具栏快捷按钮“启动”,运行程序。 1)首先在程序窗体中发送字符区输入要发送的字符,单击“发送数据”按钮,发送区的字符串通过COM1口发送出去; 2)另一台计算机发送数据,本计算机自动读入并显示在接收数据区中。 程序运行界面见图6-5。 6.1.5.3 利用MSComm控件实现PC机双串口互通信 如果一台计算机有2个串口,可通过串口线将2个串口连接起来:COM1端口的TXD与COM2端口的RXD相连;COM1端口的RXD与COM2端口的TXD相连;COM1端口的GND与COM2端口的GND相连,如图6-6(a)所示,这是串口通信设备之间的最简单连接(即三线连接),图中的2号接收脚与3号发送脚交叉连接是因为在直连方式时,把通信双方都当作数据终端设备看待,双方都可发也可收。 如果一台计算机只有1个串行通信端口可以使用,那么将第2脚与第3管脚短路,如图6-6(b)所示,那么由第3脚的输出信号就会被传送到第2脚而送到同一串行端口的输入缓冲区,程序只要再由相同的串行端口上作读取的操作,即可将数据读入,一样可以形成一个测试环境。 设计的参考代码如下: ' 串口初始化 ' 串口1与串口2的通信参数应一致 Private Sub Form_Load() MSComm1.CommPort = 1 ' 设置通信端口号为COM1 MSComm1.Settings = "9600,n,8,1" ' 设置串口1参数 MSComm1.InputMode = 0 ' 接收文本型数据 MSComm1.PortOpen = True ' 打开通信端口1 MSComm2.CommPort = 2 ' 设置通信端口号为COM2 MSComm2.Settings = "9600,n,8,1" ' 设置串口2参数 MSComm2.InputMode = 0 ' 接收文本型数据 MSComm2.PortOpen = True ' 打开通信端口2 End Sub ' 把字符通过串口发送出去 ' 启动定时器 Private Sub Cmdsend_Click() MSComm1.Output = Trim(Textsend.Text) Timer1.Enabled = True End Sub ' 接收字符 Private Sub Timer1_Timer() Dim buf$ Timer1.Enabled = False buf = Trim(MSComm2.Input) ' 将缓冲区内的数据读入buf变量中 If Len(buf) = 0 Then ' 判断缓冲区内是否存在数据 TextReceive.Text = "" Else TextReceive.Text = buf End If End Sub ' 停止程序运行 Private Sub Cmdquit_Click() Unload Me End Sub ' 关闭通信端口, Private Sub Form_Unload(Cancel As Integer) MSComm1.PortOpen = False MSComm2.PortOpen = False End Sub 程序运行画面如图6-7所示。 6.2 PC机与单片机串口通信程序设计 目前,在许多单片机应用系统中,上、下位机分工明确,作为下位机核心器件的单片机往往只负责数据的采集和通信,而上位机通常以基于图形界面的Windows系统为操作平台;为便于查询和保存数据,还需要数据库的支持,这种应用的核心是数据通信,它包括单片机和上位机之间、客户端和服务器之间以及客户端和客户端之间的通信,而单片机和上位机之间数据通信则是整个系统的基础。 单片机和PC的通信是通过单片机的串口和PC机串口之间的硬件连接实现的。 图6-8是本设计使用的单片机实验板。有关单片机实验板的详细信息请查询电子开发网http://www.dzkfw.com/。 6.2.1 实训目的 1.掌握PC机与单片机串口通信的线路连接方法。 2.掌握PC机与单片机串口通信的Keil C51、Visual Basic程序设计方法。 6.2.2 设计用软、硬件 本设计用到的硬件和软件清单见表6-4。 表6-4 设计用软、硬件 序号 名 称 数 量 1 PC计算机 1 2 单片机实验板(AT89C51、MAX232等) 1 3 串口通信线(三线制) 1 4 Visual Basic 6.0 1 6.2.3 硬件线路 线路说明:如图6-9所示,数据通信的硬件上采用3线制,将单片机和PC机串口的3个引脚(RXD、TXD、GND)分别连在一起,即将PC机和单片机的发送数据线TXD与接收数据RXD交叉连接,两者的地线GND直接相连,而其它信号线如握手信号线均不用,采用软件握手的方式,这样既可以实现预定的任务又可以简化电路设计。 但由于单片机的TTL逻辑电平和RS-232C的电气特性完全不同,RS-232C的逻辑0电平规定为+3∽+15V之间,逻辑1电平为-3∽-15V之间,因此在将PC机和单片机的RXD和TXD交叉连接时必须进行电平转换,这里使用的是MAX232电平转换芯片。 单片机系统有LED显示器模块、继电器输出模块、蜂鸣器模块等。 6.2.4 设计任务 利用Keil C51、Visual Basic编写程序实现PC机与单片机串口通信。任务要求: 1.设计任务1 PC机通过串行口将数字(00,01,02,03...,FF,十六进制)发送给单片机,单片机收到后回传这个数字,PC机接收到回传数据后显示出来,若发送的数据和接收到的数据相等,则串行通信正确,否则有错误。启始符是数字00,结束符是数字FF。 2.设计任务2 1)测试通信状态 先在文本框中输入字符串“Hello”,单击“测试”按钮,将字符串“Hello”发送到单片机,若PC机与单片机通信正常,在PC机程序的文本框中显示字符串“OK!”,否则显示字符串“ERROR!”。 2)循环计数 单击“开始”按钮,文本框中数字从0开始累加,0、1、2、3…,并将此数发送到单片机的显示器上显示;当累加到10时,回到0重新开始累加,依次循环;任何时候,单击“停止”按钮,PC机程序中和单片机显示器都停止累加,再单击“开始”按钮,接着停下的数继续累加。 3)控制指示灯 在单片机继电器接线端子的2个通道上分别接上2个指示灯,在PC机程序画面上选择指示灯号,如1号灯,单击画面“打开”按钮,单片机上1号灯亮,同时蜂鸣器响;单击画面“关闭”按钮,1号灯灭,蜂鸣器停止响;同样控制2号灯的亮灭(蜂鸣器同时动作)。 6.2.5 任务实现 单片机和PC机通信,在程序设计上涉及两个部分的内容: 一是单片机的C51程序;二是PC机的串口通信程序和界面的编制。 6.2.5.1 利用Keil C51实现单片机与PC机串口通信任务1 Keil C51软件是众多单片机应用开发的优秀软件之一,它集编辑、编译、仿真于一体,支持汇编、PLM语言和C语言的程序设计,界面友好,易学易用。 启动Keil C51,几秒钟后出现编辑界面。 1)建立一个新工程 单击Project菜单,在弹出的下拉菜单中选中New Project选项,出现Create New Project 对话框。然后选择你要保存的路径、文件夹,输入工程文件的名字,如pc_com(后缀名默 认),单击“保存”按钮。 这时会弹出一个 “Select Device for Target ‘Target 1’” 对话框,要求你选择单片机的型号,你可以根据你使用的单片机来选择,Keil C51几乎支持所有的51核的单片机。这里选择Atmel 的89C51。选择89C51之后,右边一栏是对这个单片机的基本的说明,然后单击“确定”按钮。 2)编写程序 单击“File”菜单,再在下拉菜单中单击“New”选项。此时光标在编辑窗口里闪烁,这时可以键入用户的应用程序了,但笔者建议首先保存该空白的文件。 单击菜单上的“File”,在下拉菜单中选中“Save As”选项单击,在“文件名”栏右侧的编辑框中,键入欲使用的文件名,同时,必须键入正确的扩展名,如pc_com.c,然后,单击“保存”按钮。 注意,如果用C语言编写程序,则扩展名为(.c);如果用汇编语言编写程序,则扩展名必须为(.asm)。 回到编辑界面后,单击“Target 1”前面的“+”号,然后在“Source Group 1”上单击右键,弹出菜单 ,然后单击“Add File to Group‘Source Group 1’”。 选中pc_com.c,然后单击“Add ”按钮,再单击“Close ”按钮。此时注意到“Source Group 1”文件夹中多了一个子项“pc_com.c”。子项的多少与所增加的源程序的多少相同。 现在,请输入C语言源程序。 在输入程序时,读者已经看到了事先保存待编辑的文件的好处了吧,即Keil C51会自动识别关键字,并以不同的颜色提示用户加以注意,这样会使用户少犯错误,有利于提高编程效率。 3)编译程序 单击“Project”菜单,在下拉菜单中单击“Options for Target‘Target 1’”选项,出现对话框,选择Output选项卡,选中“Create HEX Files”项,单击“确定”按钮。 再单击“Project”菜单,在下拉菜单中单击“Built Target”选项(或者使用快捷键F7),进行编译。若有错误会在output窗口提示,可根据此提示,找出错误并修改,直至编译通过,如图6-10所示。 至此,用Keil C51上做了一个完整工程,其中,生成一个编程器烧写文件:pc_com.hex。 4)烧录程序 将AT89C51芯片安装在编程器插座上,运行编程器程序。 选择单片机芯片类型:AT89C51,读入Intel Hex文件pc_com.hex,执行自动编程指令,将pc_com.hex文件烧录入AT89C51芯片中。 将烧录好的AT89C51芯片安装到单片机实验板上,就可以用串口调试助手程序对它进行测试了。 以下是完成单片机与PC机串口通信任务1的C51参考程序: # pragma db code # include # define uchar unsigned char void rece(void); void init(void); uchar re[17]; /*主程序*/ void main(void) { uchar temp; init(); do{ while(RI==0); temp=SBUF; if(temp==0x00) {rece();} else break; }while(1); } /*串口初始化*/ void init(void) { TMOD=0x20; //定时器1--方式2 PCON=0x80; //电源控制 SCON=0x50; //方式1 TL1=0xF3; TH1=0xF3; //22.1184MHZ晶振,波特率为4800 0xf3 9600 0xfa 19200 0xfd TR1=1; } /*接收返回数据*/ void rece(void) { char i; i=0; do{while(RI==0); re[i]=SBUF; RI=0; SBUF=re[i]; while(TI==0); TI=0; i++; }while(re[i-1]!=255); } 。。。。。。 6.6 PC机与GSM模块串口通信程序设计 在很多监控领域,各种监控设备大多还是有线方式传输,当距离遥远时,监控设备的安装、维护非常不便,因为监控端远离采集端,铺设电缆的投入有时可以说是巨大的。通过无线方式来交换数据,则可以有效地避免这些问题。 GSM网络是目前国内覆盖范围最广,应用最普遍的无线通信网络,利用GSM网络构建远程监测系统时,完全可利用现成的GSM无线网络而无需再新建基站。 利用GSM网络短消息业务(SMS)实现监测领域的应用具有以下优点:通信网络覆盖面广、网络设施完备,不需投资建设基础设施;实施与运行费用低;可以实现在无人情况、环境恶劣、超远距离的情况下控制信息的收集和传送。 GSM短信模块是专门用于短信接收发送的模块,具有RS-232通信口,可与单片机、计算机相连。 图6-31是某型号GSM短信模块示意图。 6.6.1 设计目的 1.掌握计算机与GSM模块串口通信的线路连接方法; 2.掌握PC机与GSM模块串口通信的Visual Basic程序设计方法。 6.6.1 设计用软、硬件 本设计用到的硬件和软件清单见表6-15。 表6-15 设计用软、硬件 序号 名 称 数 量 1 PC计算机 1 2 GSM模块(西门子:TC35) 1 3 串口通信线(三线制) 1 4 手机或SIM卡 2 5 Visual Basic 6.0 1 6.6.2 硬件线路 1. 线路说明 如图6-32所示,在数据采集站,传感器检测的数据送入单片机模拟量输入口,单片机通过串口线与GSM模块相连;在监控中心,GSM模块通过串口线与PC机直接相连。 传感器检测的数据经单片机MCU单元的处理,编辑成短信息,通过串行口传送给GSM模块后以短消息的方式将数据发送到监控中心的计算机或用户的GSM手机。 同样,监控中心PC机通过串行口向GSM模块TC35发送命令,通过TC35以短消息形式把设置命令发送到下位机系统的GSM模块,对单片机进行控制。 用户手机通过GSM模块与PC机和单片机可以实现双向通信。 2.AT指令 与SMS有关的GSM AT指令(from GSM07.05)如表6-16所示: 表6-16 常用AT指令 AT 指令 功   能 AT+CMGC 发出一条短消息命令 AT+CMGD 删除SIM卡内存的短消息 AT+CMGF 选择短消息信息格式:0-PDU;1-文本  AT+CMGL 列出SIM卡中的短消息 AT+CMGR 读短消息 AT+CMGS 发送短消息 AT+CMGW 向SIM内存中写入待发的短消息 AT+CNMI 显示新收到的短消息 AT+CPMS 选择短消息内存 AT+CSCA 短消息中心地址 6.6.3 设计任务 编写Visual Basic程序实现PC机与GSM短信模块串口通信。任务要求: 1.指定GSM模块SIM卡中已有的短信位置,读取该短信及相关信息; 2.在程序中输入短信内容,指定接收方手机号码,将编辑的短信息发送到指定手机; 3.用户手机向GSM模块发送短信,程序画面自动显示短信内容及相关信息。 4.拨打指定电话。 6.6.4 任务实现 1.程序界面设计 运行VB 6.0,创建标准的工程项目文件,设计程序窗体。 1)添加1个MSComm控件:默认的工具箱中没有MSComm串口通信控件,因此首先通过工程/部件菜单把它加入到工具箱中,再将MSComm控件加到程序窗体
/
本文档为【Visual_Basic串口通信程序设计实例】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索