资源描述
VB串口通信程序设计典型实例利用VB开发串口通信程序既可以使用MSComm控件也可以调用Windows API函数实 现。不过,只要MSComm控件可以被选用,我们推荐选择此控件实现,因为MSComm控 件的功能和API调用一样强,甚至比它还好且使用起来更加简单。在本章提供的串口通信程序设计中,除了 PC与PC串口通信外,PC与单片机、PC与 智能仪表、PC与PLC、PC与GSM短信模块等串口通信任务的实现均采用MSComm控件。6.1 PC与PC串口通信程序设计当两台串口设备通信距离较近时,可以直接连接,最简单的情况,在通信中只需3根线 (发送线、接收线、信号地线)便可实现全双工异步串行通信。本设计通过两台PC串口 3线连接,介绍了利用API函数和MSComm控件设计串口通 信程序的方法,包括字符与文件的发送与接收。6.1.1 PC与PC串口通信程序设计目的(1)掌握pc与pc串口通信的线路连接方法。(2)利用MSComm控件和API函数实现PC与PC串口通信的程序设计方法。6.1.2 PC与PC串口通信程序设计用软、硬件本设计用到的硬件和软件清单如表6-1所示。表6-1设计用软、硬件序 号名 称数 量1PC 或 IPC22串口通信线(三线制)13Visual Basic 6.016.1.3 PC与PC串口通信程序硬件线路图线路说明,在计算机通电前,按图6-1所示将两台PC通过串口线连接起来:计算机A 串口 COM1端口的TXD与计算机B串口 COM1端口的RXD相连,计算机A串口 COM1端 口的RXD与计算机B串口 COM1端口的TXD相连,计算机A串口 COM1端口的GND与 计算机B串口 COM1端口的GND相连。图6-1 PC与PC串口通信线路6.1.4设计任务利用MSComm控件和VB API函数编写程序实现PC与PC串口通信。任务要求,两台计算机互发字符并自动接收,如一台计算机输入字符串Please return abc123”,单击“发送字符”命令,另一台计算机若收到,就输入字符串“abc123”,单击“发 送字符”命令,信息返回到第一组的计算机。实际上就是编写一个简单的双机聊天程序。6.1.5任务实现6.1.5.1利用MSComm控件实现字符型数据发送与接收1. 建立新工程VB使用“工程”来管理每一个应用程序要使用的所有文件,每建立一个新程序,就要 新建一个工程。一个工程由窗体、标准模块、控件及应用所需的开发环境设置等组成。运行VB程序,出现“新建工程”对话框,选择“标准EXE”,单击“打开”命令按钮, 进入VB工程集成开发环境,窗体设计器中自动出现一个名为Form 1的空白窗体。2. 程序界面设计向空白窗体添加各种控件,以完成预定的各种功能。开始一个项目的设计时,8的工 具箱中会有许多默认的控件让设计者予以选用,这些原本就出现在工具箱中的控件是内置控 件,它提供了一些基本的系统设计组件给设计者,但功能比较特别的控件就不会出现在其中, 如用来设计串口通信功能的控件MSComm就不在其中。(1)添加串口通信控件MSComm。由于VB的串行通信组件并不会主动出现在工具箱里中,当我们需要MSComm控件时, 首先要把它加入到工具箱中。让MSComm控件出现在工具箱中的步骤如下。选择“工程”菜单下的“部件”子菜单,在弹出的“部件”对话框中,在“控件”选 项卡属性中选中“Microsoft Comm Control 6.0”复选框,单击“确定”按钮后,在工具箱中就出现了一个形似“电话”的图标,它就是MSComm控件。图6-2程序窗体界面工具箱中有了 MSComm控件,就可以选择MSComm控 件的图标后将其添加到程序窗体上,利用该控件编程,PC就 可以通过VB实现与串口设备的串口通信了。由于每个使用的MSComm控件对应着一个串行端口,如 果应用程序需要访问多个串行端口,必须添加多个MSComm控件。(2)为了实现连续的自动接收,将工具箱中的Timer控件添加到程序窗体上。(3)添加两个文本框控件:Textl和Text2,用于输入要发送的字符和显示要接收的字 符。(4)添加两个标签控件:Labell和Label2,作为发送和接收字符区的标签。(5)添加一个按钮控件:Commandl执行发送字符命令。程序设计界面如图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设置发送周期(ms).两台计算机中VB程序界面及属性设置应完全相同尤其MSComm控件的InputMode和Settings属性值应相同。4 .程序代码设计 程序要实现自动发送或读取,在VB程序中有两个方式可以达到,一是查询方式,利用查询事件是否发生,当发生时,去执行默认的程序代码。可以使用计时器控件Timer),该 控件属性中的Interval可以控制计时器被启动的时间间隔,当时间间隔一到,便会执行原先放在计时器中的程序代码。下面是利用查询方式编写的PC与PC串口通信的参考程序,代码如下所示:串口初始化Private Sub Form_Load()MSComm1.CommPort = 1MSComm1.Settings = ”9600,n,8,1”MSComm1.InputMode = 0MSComm1.PortOpen = TrueEnd Sub设置通信端口号为COM1设置串口1参数接收文本型数据打开通信端口1把字符通过串口发送出去Private Sub Cmdsend_Click()If Textsend.Text = Thenpp = MsgBox(发送的数据不能为空! ”,16)Exit SubEnd IfMSComml.Output = Trim(Textsend.Text)For i = 1 To 20000000Next iEnd Sub通过时钟控制来自动接收字符Private Sub Timer1_Timer()Dim buf$buf = Trim(MSComm1.Input)If Len(buf) 0 Then将缓冲区内的数据读入buf变量中判断缓冲区内是否存在数据TextReceive.Text = TextReceive.Text + Chr(13) + Chr(10) + buf 回车换行End IfEnd Sub关闭通信端口,停止程序运行Private Sub Cmdquit_Click()MSComm1.PortOpen = FalseUnload MeEnd Sub在Windows系统环境下,串口是系统资源的一部分。应用程序要使用串口进行通信, 必须在使用之前向操作系统提出资源申请要求(打开串口),通信完成后必须释放资源(关 闭串口)。在Windows系统的系统函数中,均包含了支持通信中断的功能。二是使用事件方式。MSComm控件提供事件回应功能,可以利用此功能达到自动发送 接收的目的。下面是利用事件方式编写的PC与PC串口通信的参考程序,界面设计与图6-2 基本相同,区别是事件方式不需要时间控件。串口初始化Private Sub Form_Load()MSComm1.CommPort = 1MSComm1.Settings = ”9600,n,8,1”MSComm1.InputMode = 0设置通信端口号为COM1设置串口参数接收文本型数据MSComm1.RThreshold = 1 接收缓冲区每收到一个字符都会使 MSComm控件触发OnComm事件MSComm1.PortOpen = True End Sub打开通信端口 1把字符通过串口发送出去启动定时器Private Sub Cmdsend_Click()If Textsend.Text = Thenpp = MsgBox(发送的数据不能为空! ”,16)Exit SubEnd IfMSComml.Output = Trim(Textsend.Text)End SubMSComm的OnComm事件程序由CommEvent属性值的不同,将各自的程序代码写入相关的子程序中只要RThresold中的设定字符数到达时便会使得CommEvent属性值变成comEvReceive因此接收的子程序便会被执行Private Sub MSComml _OnComm()Dim buf$Select Case MSComml.CommEvent通过取代每一个case表达式来处理每个事件与错误Case comEvCD CD线的状态发生变化Case comEvCTS CTS线的状态发生变化Case comEvDSR DSR线的状态发生变化Case comEvReceivebuf = Trim(MSComml.Input)将缓冲区内的数据读入buf变量中Case comEvSendEnd SelectTextReceive.Text = TextReceive.Text & bufEnd Sub停止程序运行Private Sub Cmdquit_Click()Unload MeEnd Sub关闭通信端口,Private Sub Form_Unload(Cancel As Integer)MSComml.PortOpen = FalseEnd Sub5 .运行程序程序设计、调试完毕,单击工具栏快捷按钮“启动”,运行程序。两台计算机同时运行本程序。首先在一台计算机程序窗体中发送字符区输入要发送的字符,如“我是第一组,收到请 回话!”,单击“发送字符”按钮,发送区的字符串通过COMl 口发送出去。如果联网通信的另一台计算机程序收到字符,则返回字符串,如“收到,我是第2组!”, 如果通信正常该字符串将显示在接收区中。程序运行界面如图6-3所示。图6-3程序运行界面6.1.5.2利用API函数实现字符型数据发送与接收1. 建立新工程运行VB,创,作为发送和接收字符区的标签。建标准的工程项目文件,设计程序窗体。图6-4程序窗体界面 添加两个TextBox控件,用于输入 要发送的字符和显示需接收的字符。 添加两个Label控件 添加一个Timer控件,用于周期性 地读取串口数据。 添加两个CommandButton控件,分 别执行发送字符、关闭程序等命令。设计的程序界面如图6-4所示。2. 属性设置程序窗体、控件对象的主要属性设置如表6-3所示。表6-3窗体、控件对象的主要属性设置控件类型名 称主要属性功 能FormCOMFormBorderStyle = 3运行时窗体固定大小Caption = API 串 口通讯窗体标题栏显示程序名称LabelLabel1Caption =发送数据区:标签LabelLabel2Caption =接收数据区:标签TextBoxTextsendMultiLine = True允许多行显示ScrollBars = 2-Vertical垂直滚动条可用TextBoxTextReceiveMultiLine = True允许多行显示ScrollBars = 2-Vertical垂直滚动条可用CommandButtonBTNSendCaption =发送数据手动间断发送字符CommandButtonBTNCloseComCaption =关闭程序关闭程序TimerTMRCommInterval = 500设置发送周期(ms)3. 程序代码设计在程序标准模块SerialPort.bas的说明部分放置使用的API函数声明及所用的结构、常数的声明:Option ExplicitGlobal ComNum As LongGlobal bRead(255) As ByteType COMSTATfCtsHold As LongfDsrHold As LongfRlsdHold As LongfXoffHold As LongfXoffSent As LongfEof As LongfTxim As LongfReserved As LongcbInQue As LongcbOutQue As LongEnd TypeType COMMTIMEOUTSReadIntervalTimeout As LongReadTotalTimeoutMultiplier As LongReadTotalTimeoutConstant As LongWriteTotalTimeoutMultiplier As LongWriteTotalTimeoutConstant As LongEnd TypeType DCBDCBlength As LongBaudRate As LongfBinary As LongfParity As LongfOutxCtsFlow As LongfOutxDsrFlow As LongfDtrControl As LongfDsrSensitivity As LongfTXContinueOnXoff As LongfOutX As LongfInX As LongfErrorChar As LongfNull As LongfRtsControl As LongfAbortOnError As LongfDummy2 As LongwReserved As IntegerXonLim As IntegerXoffLim As IntegerByteSize As ByteParity As ByteStopBits As ByteXonChar As ByteXoffChar As ByteErrorChar As ByteEofChar As ByteEvtChar As ByteEnd TypeType OVERLAPPEDInternal As LongInternalHigh As Longoffset As LongOffsetHigh As LonghEvent As LongEnd TypeType SECURITY_ATTRIBUTESnLength As LonglpSecurityDescriptor As LongbInheritHandle As LongEnd TypeDeclare Function CloseHandle Lib kernel32” (ByVal hObject As Long) As LongDeclare Function GetLastError Lib kernel32” () As LongDeclare Function ReadFile Lib kernel32” (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As Long) As LongDeclare Function WriteFile Lib kernel32” (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, lpOverlapped As Long) As LongDeclare Function SetCommTimeouts Lib kernel32” (ByVal hFile As Long, lpCommTimeouts As COMMTIMEOUTS) As LongDeclare Function GetCommTimeouts Lib kernel32” (ByVal hFile As Long, lpCommTimeouts AsCOMMTIMEOUTS) As LongDeclare Function BuildCommDCB Lib kernel32 Alias BuildCommDCBA (ByVal IpDef As String, IpDCB As DCB) As LongDeclare Function SetCommState Lib kernel32” (ByVal hCommDev As Long, lpDCB As DCB) As LongDeclare 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 LongDeclare Function FlushFileBuffers Lib kernel32 (ByVal hFile As Long) As Long窗体模块程序如下:初始化串口Private Sub Form_Load()If Not Init_Com(COM1:, 9600,n,8,1) ThenMsgBox 端 口” & 无效!Exit SubEnd IfEnd Sub发送字符Private Sub BTNSend_Click()If WriteCOM32(txt(2) & vbCr Len(txt(2) ThenMsgBox ”写入错误”Exit SubEnd IfEnd Sub向串口写数据Function WriteCOM32(COMString As String) As IntegerOn Error GoTo handelwritelptDim RetBytes As Long, LenVal As LongDim retval As LongIf Len(COMString) 255 ThenWriteCOM32 Left$(COMString, 255)WriteCOM32 Right$(COMString, Len(COMString) - 255)Exit FunctionEnd IfFor LenVal = 0 To Len(COMString) - 1bRead(LenVal) = Asc(Mid$(COMString, LenVal + 1, 1)Next LenValretval = WriteFile(ComNum, bRead(0), Len(COMString), RetBytes, 0)WriteCOM32 = RetByteshandelwritelpt:Exit FunctionEnd Function读取数据Private Sub TMRComm_Timer()Dim Ans As String, i As Integer, RtnStr As StringAns = ReadCommPure()If Ans = Then Exit SubRtnStr = RtnStr & CleanStr(Ans)txtRec.Text = RtnStrFlushCommEnd Sub从串口读取数据Function ReadCommPure() As StringOn Error GoTo handelpurecomDim RetBytes As Long, i As Integer, ReadStr As String, retval As LongDim CheckTotal As Integer, CheckDigitLC As Integerretval = ReadFile(ComNum, bRead(0), 255, RetBytes, 0)ReadStr =If (RetBytes 0) ThenFor i = 0 To RetBytes - 1ReadStr = ReadStr & Chr(bRead (i)Next iElseFlushCommEnd IfReadCommPure = ReadStrhandelpurecom:Exit FunctionEnd FunctionFunction CleanStr(TextLine As String) As StringDim i As Integer, RtnStr As StringRtnStr =For i = 1 To Len(TextLine)Select Case Asc(Mid$(TextLine, i, 1)Case &H5DRtnStr = RtnStr & ”Case &H5BRtnStr = RtnStr & ”Case Is = &H30RtnStr = RtnStr & Mid$(TextLine, i, 1)Case 13RtnStr = RtnStr & ”Case 10RtnStr = RtnStr & ”Case ElseRtnStr = RtnStr & End SelectNext iCleanStr = RtnStrEnd Function清空文件缓冲区Function FlushComm()FlushFileBuffers (ComNum)End Function初始化端口Function Init_Com(ComNumber As String, Comsettings As String) As Boolean On Error GoTo handelinitcomDim ComSetup As DCB, Answer, Stat As COMSTAT, RetBytes As Long Dim retval As LongDim CtimeOut As COMMTIMEOUTS, BarDCB As DCB 打开通讯口读/写(&HC0000000).必须指定存在的文件(3).ComNum = CreateFile(ComNumber, &HC0000000, 0, 0&, &H3, 0, 0)If ComNum = -1 ThenMsgBox ”端口 & ComNumber & ”无效.请设置正确.”,48 Init_Com = FalseExit FunctionEnd If超时CtimeOut.ReadIntervalTimeout = 20CtimeOut.ReadTotalTimeoutConstant = 1CtimeOut.ReadTotalTimeoutMultiplier = 1CtimeOut.WriteTotalTimeoutConstant = 10CtimeOut.WriteTotalTimeoutMultiplier = 1 retval = SetCommTimeouts(ComNum, CtimeOut) If retval = -1 Thenretval = GetLastError()MsgBox ”端口超时设定无效”& ComNumber & 错误:& retvalretval = CloseHandle(ComNum)Init_Com = FalseExit FunctionEnd Ifretval = BuildCommDCB(Comsettings, BarDCB)If retval = -1 Thenretval = GetLastError()MsgBox ”无效设备 DCB 块& Comsettings & 错误:& retvalretval = CloseHandle(ComNum)Init_Com = FalseExit FunctionEnd Ifretval = SetCommState(ComNum, BarDCB)If retval = -1 Thenretval = GetLastError()MsgBox ”无效设备 DCB 块& Comsettings & 错误:& retvalretval = CloseHandle(ComNum)Init_Com = FalseExit FunctionEnd IfInit_Com = Truehandelinitcom:Exit FunctionEnd Function关闭程序Private Sub BTNCloseCom_Click()Unload MeEnd Sub关闭端口Private Sub Form_Unload(Cancel As Integer)CloseHandle (ComNum)End Sub4 .运行程序图6-5程序运行界面程序设计、调试完毕,执行菜单“运行 启动”命令或单击工具栏快捷按钮“启动”, 运行程序。(1) 首先在程序窗体中发送字符区输入 要发送的字符,单击“发送数据”按钮,发 送区的字符串通过COM1 口发送出去。(2) 另一台计算机发送数据,本计算机 自动读入并显示在接收数据区中。程序运行界面如图6-5所示。6.1.5.3利用MSComm控件实现?。双串口互通信如果一台计算机有两个串口,可通过串口线将两个串口连接起来:COM1端口的TXD 与COM2端口的RXD相连,COM1端口的RXD与COM2端口的TXD相连,COM1端口 的GND与COM2端口的GND相连,如图6-6(a)所示,这是串口通信设备之间的最简单 连接(即三线连接),图中的2号接收脚与3号发送脚交叉连接是因为在直连方式时,把通 信双方都当作数据终端设备看待,双方都可以发送也可以接收。如果一台计算机只有一个串行通信端口可以使用那么将第2脚与第3管脚短路,如图6-6 (b)所示,那么第3脚的输出信号就会被传送到舞脚,用以发送到同一串行端口的输入缓冲 区,程序只要再由相同的串行端口上作读取的操作,即可将数据读入,一样可以形成一个测试 环境。设计的参考代码如下:串口初始化串口 1与串口 2的通信参数应一致Private Sub Form_Load()MSComml.CommPort = 1设置通信端口号为COM1MSComm1.Settings = 9600,n,8,1”设置串口1参数MSComm1.InputMode = 0接收文本型数据MSComm1.PortOpen = True打开通信端口1MSComm2.CommPort = 2设置通信端口号为COM2MSComm2.Settings = 9600,n,8,T设置串口 2参数MSComm2.InputMode = 0接收文本型数据MSComm2.PortOpen = TrueEnd Sub把字符通过串口发送出去启动定时器Private Sub Cmdsend_Click()MSComm1.Output = Trim(Textsend.Text)Timer1.Enabled = TrueEnd Sub接收字符Private Sub Timer1_Timer()Dim buf$Timer1.Enabled = False打开通信端口 2buf = Trim(MSComm2.Input)将缓冲区内的数据读入buf变量中If Len(buf) = 0 ThenTextReceive.Text =ElseTextReceive.Text = bufEnd IfEnd Sub停止程序运行Private Sub Cmdquit_Click()Unload MeEnd Sub关闭通信端口,Private Sub Form_Unload(Cancel As Integer)MSComm1.PortOpen = FalseMSComm2.PortOpen = FalseEnd Sub判断缓冲区内是否存在数据(a)图6-6串口设备最简单连接(b)程序运行界面如图6-7所示。图6-7程序运行界面6.2 PC与单片机串口通信程序设计目前,在许多单片机应用系统中,上、下位机分工明确,作为下位机核心器件的单片机 往往只负责数据的采集和通信,而上位机通常以基于图形界面的Windows系统为操作平台。图6-8单片机实验板为便于查询和保存数据,还需要数据库的支持,这种 应用的核心是数据通信,它包括单片机和上位机之间、 客户端和服务器之间以及客户端和客户端之间的通 信,而单片机和上位机之间数据通信则是整个系统的 基础。单片机和PC的通信是通过单片机的串口和PC串 口之间的硬件连接实现的。图6-8是本设计使用的单片机实验板。有关单片 机实验板的详细信息请查询电子开发网http:/www.dzkfw.eom/o6.2.1 PC与单片机串口通信程序实训目的(1)掌握pc与单片机串口通信的线路连接方法。(2)掌握PC与单片机串口通信的Keil C51和VB程序设计方法。6.2.2 PC与单片机串口通信程序设计用软、硬件本设计用到的硬件和软件清单如表6-4所示。表6-4设计用软、硬件序 号名 称数 量1PC (计算机)12单片机实验板(AT89C51、MAX232等)13串口通信线(三线制)14VB 6.016.2.3 PC与单片机串口通信程序硬件线路图线路说明,如图6-9所示,数据通信的硬件上采用三线制,将单片机和PC串口的3个 引脚(RXD、TXD、GND)分别连在一起,即将PC和单片机的发送数据线TXD与接收数 据RXD交叉连接,两者的地线GND直接相连,而其他信号线如握手信号线均不用,采用 软件握手的方式,这样既可以实现预定的任务又可以简化电路设计。但由于单片机的TTL逻辑电平和RS-232C的电气特性完全不同,RS-232C的逻辑0电 平规定为+3+15V之间,逻辑1电平为-3-15V之间,因此,在将PC和单片机的RXD 和TXD交叉连接时必须进行电平转换,这里使用的是MAX232电平转换芯片。图6-9 PC与单片机串口通信线路单片机系统有LED显示器模块、继电器输出模块、蜂鸣器模块等。6.2.4设计任务利用Keil C51和VB编写程序实现PC与单片机串口通信。任务要求。1. 设计任务1PC通过串行口将数字(00,01,02,03,FF,十六进制)发送给单片机,单片机收 到后回传这个数字,PC接收到回传数据后显示出来,若发送的数据和接收到的数据相等, 则串行通信正确,否则有错误。启始符是数字00,结束符是数字FF。2. 设计任务2(1)测试通信状态。先在文本框中输入字符串“Hello”,单击“测试”按钮,将字符串Hello”发送到单片 机,若PC与单片机通信正常,在PC程序的文本框中显示字符串“OK!”;否则,显示字符 串“ ERROR!”。(2)循环计数。单击“开始”按钮,文本框中数字从)开始累加,0、1、2、3,并将此数发送到单片 机的显示器上显示。当累加到10时,回到0重新开始累加,依次循环。任何时候,单击“停止” 按钮,PC程序中和单片机显示器都停止累加,再单击“开始”按钮,接着停下的数继续累加。(3)控制指示灯。在单片机继电器接线端子的两个通道上分别接上两个指示灯,在PC程序界面上选择指 示灯号,如1号灯,单击界面“打开”按钮,单片机上1号灯亮,同时蜂鸣器响;单击界面 “关闭”按钮,1号灯灭,蜂鸣器停止响;同样控制2号灯的亮灭(蜂鸣器同时动作)。6.2.5任务实现单片机和pc通信,在程序设计上涉及两个部分的内容。一是单片机的C51程序,二是PC的串口通信程序和界面的编制。6.2.5.1利用Keil C51实现单片机与PC串口通信任务1网络详细地址为:http:/www.china-6.2.5.2利用VB实现PC与单片机串口通信任务11. 程序界面设计运行VB,创建标准的工程项目文件,设计程序窗体。设计的程序界面如图6-11所示。图6-11程序窗体界面(1)添加一个MSComm控件:默认的工具箱中没有 MSComm串口通信控件,因此,首先要把它添加到工具箱 中,再将MSComm控件添加到程序窗体上。(2)添加两个按钮控件CommandButton,用于发送数 字和关闭程序。(3)添加一个框架控件Frame,用于功能显示。(4)添加一个文本控件TextBox,用于输入数字。(5)添加一个标签控件Label,用于显示通信状态。2. 属性设置程序窗体、控件对象的主要属性设置如表6-5所示。表6-5窗体、控件对象的主要属性设置控件类型名 称主要属性功 能FormMainFormBorderStyle = 3运行时窗体固定大小Caption = ?0与单片机串口通信窗体标题栏显示程序名称FrameFrame1Caption =输入数据测试功能区TextBoxnumTextText = 0数据输入框LabelLabel1Caption =通信状态?显示串口通信状态CommandButtonCmdsendCaption =发送发送数据命令CommandButtonCmdquitCaption =关闭关闭程序命令MSCommMSComm1在程序中设置串口参数设置网络详细地址为:http:/www.china-6.2.5.3利用Keil C51实现单片机与PC串口通信任务2(方法1)网络详细地址为:http:/www.china-6.2.5.4利用VB实现PC与单片机串口通信任务2(方法1)1. 程序界面设计运行VB,创建标准的工程项目文件,设计程序窗体。 添加一个MSComm控件。默认的工具箱中没有MSComm串口通信控件,因此,首图6-13程序窗体界面先要把它添加到工具箱中,再将MSComm控件添加到 程序窗体上。 为了实现连续的字符发送和循环计数,添加两 个Timer控件。 为了功能分类,添加3个Frame控件。 为了选择指示灯号添加两个OptionButton控件。 添加其他控件。两个文本控件TextBox, 6个按钮控件CommandButton。 设计的程序界面如图6-13所示。2. 属性设置程序窗体、控件对象的主要属性设置见表6-6。表6-6窗体、控件对象的主要属性设置控件类型名 称主要属性功 能FormMainFormBorderStyle = 3运行时窗体固定大小Caption = PC机与单片机串口通信窗体标题栏显示程序名称FrameFrame1Caption =测试通信状态测试功能区FrameFrame2Caption =循环计数循环计数功能区Enabled = False初始不可用FrameFrame3Caption =控制指示灯控制指示灯功能区Enabled = False初始不可用TextBoxReturnTextText = Hello测试信息显示框TextBoxNumTextText = 0循环计数显示框OptionButtonOption1Caption = 1 号灯1号指示灯,初始选择Value = TrueOptionButtonOption2Caption = 2 号灯2号指示灯CommandButtonCmdTestCaption =测试测试单片机命令CommandButtonCmdStartCaption =开始开始计数命令CommandButtonCmdStopCaption =停止停止计数命令CommandButtonCmdOpenCaption =打开打开指定指示灯命令CommandButtonCmdCloseCaption =关闭关闭指定指示灯命令CommandButtonCmdquitCaption =退出关闭程序命令MSCommMSComm1在程序中设置串口参数设置TimerTimer1Enabled = False时钟初始不可用Interval = 1000循环计数周期3. 编写程序代码以下是实现PC与单片机串口通信任务2(方法1)的参考程序:网络详细地址为:http:/www.china-6.2.5.5利用Keil C51实现单片机与PC串口通信任务2(方法2)以下是完成单片机与PC串口通信任务2(方法2)的C51参考程序:6.2.5.6利用VB实现PC与单片机串口通信任务2(方法2)程序界面设计如同方法1,如图6-13所示。以下是实现PC与单片机串口通信任务2 (方法1)的参考程序:网络详细地址为:http:/www.china-6.3 PC与智能仪器串口通信程序设计目前仪器仪表的智能化程度越来越高,大量的智能仪器都配备了 RS-232通信接口,并图6-15智能仪器示意图提供了相应的通信协议,能够将测试、采集的数据传输给计算 机等设备,以便进行大量数据的储存、处理、查询和分析。图 6-15是某型号智能仪器示意图。通常个人计算机(PC)或工控机(IPC)是智能仪器上位 机的最佳选择,因为PC或IPC不仅能解决智能仪器(作为下 位机)所不能解决的问题,如数值运算、曲线显示、数据查询、 报表打印等;而且具有丰富和强大的软件开发环境。6.3.1 PC与智能仪器串口通信程序设计目的(1)掌握PC与智能仪器串口通信的线路连接方法。(2)掌握PC与智能仪器串口通信的VB程序设计方法。6.3.2 PC与智能仪器串口通信程序设计用软、硬件本设计用到的硬件和软件清单如表6-7所示。表6-7设计用软、硬件序 号名 称数 量1PC (计算机)12XMT-3000A型智能仪表(需配置RS-232通信,上、下限报警继电器,DC24V电源等模块)13串口通信线(三线制)14热电阻传感器(Cu50)15指示灯(D C24V)26Visual Basic 6.016.3.3 PC与智能仪器串口通信程序硬件线路图1 线路说明观察所用计算机主机箱后RS-232C串口的数量、位置和几何特征;查看计算机与智能 仪器的串口连接线及其端口。在计算机与智能仪器通电前,按图6-16所示将传感器Cu50、上、下限报警指示灯与 XMT-3000A智能仪器连接。PC机COM1TXD RXD GND5RS232444546常开事ALM2+泉尽DC24VXMT-3000A_-9,:常开RXD TXD GNDCu50ALM1AC220V图6-16 PC与智能仪表串口通信线路通过串口线将计算机与智能仪器连接起来:智能仪器的14端子(RXD)与计算机串口 COM 1的3脚(TXD)相连,智能仪器的15端子(TXD)与计算机串口 COM 1的2脚(RXD) 相连,智能仪器的16端子(GND)与计算机串口 COM 1的5脚(GND)相连。连接仪器与计算机串口线时,仪器与计算机严禁通电,否则极易烧毁串口。珪.配2. XMT-3000A智能仪器的参数设置XMT-3000A智能仪器在使用前应对其输入/输出参数进行正确设置,设置好的仪器才能投入正常使用。关于XMT-3000A智能仪器的通信协议参见第5.6.2节。请按表6-8所示设置仪器的主要参数。表6-8仪器的主要参数设置参 数参数含义设置值HiAL上限绝对值报警值30LoAL下限绝对值报警值20Sn输入规格传感器为:Cu50,贝【jSn=20diP小数点位置要求显示一位小数,则diP=1ALP仪器功能定义ALP =10Addr通信地址1bAud通信波特率4800有关XMT-3000A智能仪表的详细信息请查询网站http:/www.njcy.eom/o6.3.4设计任务编写VB程序实现PC与智能仪表串口通信。任务要求。(1) 自动连续读取并显示智能仪器温度测量值(十进制)。(2) 统计测量温度的平均值、最大值、最小值等。(3) 绘制温度实时变化曲线。6.3.5任务实现网络详细地址为:http:/www.china-6.4 PC与PLC串口通信程序设计可编程序逻辑控制器(简称PLC)主要是为现场控制而设计的,其人机界面主要是开 关、按钮、指示灯等。其良好的适应性和可扩展能力而得到越来越广泛的应用。采用PLC 的控制系统或装置具有可靠性高、易于控制、系统设计灵活、能模拟现场调试、编程使用简 单、性价比高、有良好的抗干扰能力等特点。但是,PLC也有不易显示各种实时图表/曲线 (趋势线)和汉字、无良好的用户界面、不便于监控等缺陷。图6-19 PLC产品示意图二十世纪90年代后,许多的PLC都配备有计算机通信接口,通过总线将一台或多台 PLC相连接。计算机作为上位机可以提供良好的人机界面, 进行系统的监控和管理,进行程序编制、参数设定和修改、 数据采集等,既能保证系统性能,又能使系统操作简便, 便于生产过程的有效监督。而PLC作为下位机,执行可靠 有效的分散控制。用一台计算机(上位机)去监控下位机 (PLC),这就要求PC与PLC之间稳定、可靠的数据通信。图6-19是某型号PLC示意图。6.4.1 PC与PLC串口通信程序设计目的(1)掌握PC与PLC串口通信的线路连接方法。(2)掌握PC与PLC串口通信的VB程序设计方法。6.4.2 PC与PLC串口通信程序设计用软、硬件本设计用到的硬件和软件清单如表6-10所示。表6-10设计用软、硬件序 号名 称数 量1PC (计算机)12PLC (西门子:S7-200,CPU224)13PLC (三菱:FX2N-32MR)14SC-09编程电缆,PC/PPI电缆各15开关,指示灯(DC24V)各106直流电源(OUT: DC24V)17Visual Basic 6.016.4.3 PC与PLC串口通信程序设计硬件线路图线路说明:西门子S7-200PLC系统为用户提供了灵活的通信功能。集成在7-200中的点 对点接口(PPI)可用普通的双绞线作波特率高达9600bit/s的数据通信,用RS-485接口实现高 速用户可编程接口,可使用专用位通信协议(如ASCII)做波特率高达38.4 kbit/s的高速通信并 可按步调整。而PC的接口为RS-232,两者之间需要进行电平转换。利用西门子公司的C/PPI 电缆,可将S7-200CPU与计算机连接起来组成PC/PPI网络,实现点对点通信
展开阅读全文