利用VB实现PC机与多单片机远程无线通讯
- 格式:doc
- 大小:38.00 KB
- 文档页数:5
VB入门中最简单入门教程基于VB单片机与PC通信一、目的和要求1、掌握利用VB软件制做出通信界面;2、掌握在VB中添加程序并能够写出发送数据的程序;3、掌握单片机串行口通信原理;4、掌握单片机接受串行口通信数据程序;二、设备1、Keilc51软件及电脑一台;2、89C51单片机开发板一块;3、Microsoft Visual Basic 6.0软件;三、实验内容本次课程设计就是利用Microsoft Visual Basic 6.0软件制作一个通信界面在界面上添加三个按钮,当按第一个按钮时单片机上的LED灯正转,当按第二个按钮时单片机上的LED灯反转,当按第三个按钮时单片机上的LED灯闪烁。
单片机能正确接受并显示。
四、原理串口是计算机上一种非常通用设备通信的协议〔不要与通用串行总线Universal Serial Bus或者USB混淆〕。
大多数计算机包含两个基于RS232的串口。
串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。
同时,串口通信协议也可以用于获取远程采集设备的数据。
串口通信的概念非常简单,串口按位〔bit〕发送和接收字节。
尽管比按字节〔byte〕的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。
它很简单并且能够实现远距离通信。
比方IEEE488定义并行通行状态时,规定设备线总常不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。
五、步骤1、在桌面上启动Microsoft Visual Basic 6.0软件弹出对话框,点击标准EXE确定。
2、添加串口控件点击工程-部件-Microsoft Comm control 6.0 即可会在左方的工具栏出现该工具,双击此工具会在form1中出现。
3、初始化串口双击form1中的空白区域添加程序MSComm1.Settings = "9600,n,8,1"mPort = 4MSComm1.PortOpen = TrueMSComm1.RThreshold = 1mPort 取决你使用的串行口,在设备管理器中查看。
利用VB实现PC机与多单片机远程无线通讯
魏志强
【期刊名称】《《微计算机信息》》
【年(卷),期】2004(000)011
【摘要】本文给出了一种以数传电台为通讯媒体,由控制中心PC机和多个
AT89C51单片机系统组成的远程无线通信系统,重点介绍了利用VB实现PC机与多个单片机控制系统远程无线通讯程序设计方法,实现了PC机对多个远端单元的实时控制与管理。
【总页数】3页(P90-91,117)
【作者】魏志强
【作者单位】101601 北京东燕郊281信箱东北电子技术研究所
【正文语种】中文
【中图分类】TP368.1
【相关文献】
1.利用VB实现PC机与单片机通讯 [J], 陈殿波;陈燕芹
2.利用VB实现PC机与多个单片机通讯 [J], 李国峰
3.利用VB实现PC机与多单片机通讯的一种方法 [J], 刘宏;梁贵强;吴志荣
4.利用VB6.0实现PC机与MCS-51单片机之间的串行通信 [J], 李敏孜;刘志鸿;王宏
5.利用VB8.0实现PC机与多单片机串行通信的方法 [J], 王平根
因版权原因,仅展示原文概要,查看原文内容请购买。
VB6.0用于PC机与MCS-51单片机多机串行通信
杨侃;郎文鹏;赵维琴
【期刊名称】《仪器仪表用户》
【年(卷),期】2001(008)002
【摘要】本文简要地介绍了PC机与MCS-51单片机多机串行通信的有关技术,在此基础上详细说明了在Windows环境下利用VB6.0进行串行通信的编程方法并给出了应用实例。
【总页数】4页(P31-34)
【作者】杨侃;郎文鹏;赵维琴
【作者单位】上海大学自动化系;上海大学自动化系;上海大学自动化系
【正文语种】中文
【中图分类】TP274
【相关文献】
1.基于的PC机和MCS-51单片机之间的串行通信 [J], 何文才;杜鹏;刘培鹤;牛晓蕾;张媛媛
2.利用VB6.0实现PC机与MCS-51单片机之间的串行通信 [J], 李敏孜;刘志鸿;王宏
3.PC机和MCS-51单片机间的串行通信 [J], 陈欣琳;王海峰;金亮
4.PC机与MCS-51单片机的串行通信在数据采集系统中应用 [J], 向科;马琳达;文方
5.基于Visual Basic
6.0下PC机与MCS-51单片机的串行通信 [J], 袁月峰;张树森;姚继权
因版权原因,仅展示原文概要,查看原文内容请购买。
用VB实现PC机与单片机的通讯
张艳荣;杨玉峰;程善美;秦忆
【期刊名称】《计算机应用》
【年(卷),期】1999(19)11
【摘要】在Windows 95下利用VB的串行通讯控件可实现PC机与单片机的通讯,本文以80C196KC单片机为例,详细介绍了PC机与单片机之间的串行通讯、数据的发送和接收.
【总页数】3页(P42-44)
【作者】张艳荣;杨玉峰;程善美;秦忆
【作者单位】华中理工大学自控系湖北武汉 430074;华中理工大学自控系湖北武汉 430074;华中理工大学自控系湖北武汉 430074;华中理工大学自控系湖北武汉430074
【正文语种】中文
【中图分类】TP39
【相关文献】
1.VB环境下实现PC机与单片机(8031)的串行通讯 [J], 卢新;李星
2.电机调速系统中VB实现的PC机与单片机串行通讯 [J], 黄安贻;罗金成
3.基于VB6.0的PC机与单片机串口通讯的实现 [J], 魏延萍
4.VB实现PC机与单片机(8051)的串行通讯 [J], 刘艳美;姜波
5.基于VB
6.0实现PC机与单片机的串行通讯 [J], 杨佩璐
因版权原因,仅展示原文概要,查看原文内容请购买。
基于VB的PC机与单片机串行通信关键技术实现
冯新宇;王娟;王安华
【期刊名称】《煤炭技术》
【年(卷),期】2006(25)8
【摘要】主要论述了PC机与单片机进行通信时的关键技术,并着重阐述了在VB 环境下实现的主要过程。
【总页数】2页(P108-109)
【关键词】单片机;VB;串行通信
【作者】冯新宇;王娟;王安华
【作者单位】黑龙江科技学院电气与信息工程学院
【正文语种】中文
【中图分类】TN91
【相关文献】
1.基于VB6.0编程实现PC与单片机的串行通信 [J], 孟昕元
2.基于VB的PC机与单片机串行通信系统研究与实现 [J], 马壮;吴铮;王永强
3.基于VB6.0的PC机与多单片机串行通信设计与实现 [J], 孔德刚;肖海荣;安国建;刘文江
4.利用VB8.0实现PC机与多单片机串行通信的方法 [J], 王平根
5.基于VB实现PC机与单片机的串行通信 [J], 王圆妹;许劲;李涛
因版权原因,仅展示原文概要,查看原文内容请购买。
用VB6标准模块实现微机与单片机间的通信源程序1、模块的使用方法:' (1) 在窗体中放置一个 MSComm 控件' (2) 设置好 MSComm 控件下面属性:' CommPort = 端口号 '端口号如为1,即COM1' Handshaking = 0 '无握手协议' InputMode = 1 '二进制收发模式' Settings = "9600,n,8,1" '波特率/奇偶校验/数据位/停止位' (3) 在程序入口放置下列命令:' Set CommControl = 窗体名.MSComm控件名' 如: Set CommControl = Form1.MSComm1'==============================================================' InitPort 函数说明打开指定端口并进行端口初始化' PortNum 指定端口号' ClosePort 函数说明关闭当前打开的端口' SendData 函数说明发送数据子程序' Addr 下位机地址号' Cmd 命令' Datas 数据(可选参数,调用时如不指定则发送一无数据的命令串)' Timeout 超时时间,单位:秒(s)' (每发送一帧数据后需接收一个回应数据,等于 0 - 成功不等于 0 - 失败)' GetData 函数说明接收数据子程序' lData 要接收数据长度(纯数据长度,不包含其它固定格式数据)' Buffer 接收数据缓冲区' Addr 要接收数据下位机地址(不指定时自动采用最后一次发送地址)' Timeout 超时时间,单位:秒(s)' 各个函数返回值' 0 vbSuccess '通信成功' 1 vbBusy '端口忙' 2 vbOpenPortFailed '端口打开失败,端口可能已被其它应用程序所占用' 3 vbTimeout '通信超时' 4 vbInvalidData '接收的数据有误' 5 vbPortNotOpened '端口还未初始化'==============================================================2、模块的程序设计:Option Explicit'======== 通信结果枚举定义 ========'Public Enum CommResultvbSuccess = 0vbBusy = 1vbOpenPortFailed = 2vbTimeout = 3vbInvalidData = 4vbPortNotOpened = 5End Enum'======== 通信常数定义 ========'Public Const SOI = &HAA '定义开始位Public Const EOI = &HBB '定义停止位Public Const VER = &H10 '定义版本号'========模块内部变量定义========'Public CommControl As MSComm '定义模块内部控件名Public DefAddr As Byte '定义默认下位机地址'------------------------------------------------------------------------------------------------Public Function ClosePort() As CommResult'打开通讯端口If Not CommControl.PortOpen ThenClosePort = vbPortNotOpened '端口还未初始化Exit FunctionEnd IfClosePort = vbSuccessCommControl.PortOpen = False '关闭端口End Function'------------------------------------------------------------------------------------------------Public Function InitPort(ByVal PortNum As Byte) As CommResult'打开通讯端口If CommControl.PortOpen Then '如果端口已打开,返回 vbBusyInitPort = vbBusyExit FunctionElse '否则尝试打开端口On Error Resume NextmPort = PortNumCommControl.PortOpen = TrueIf Err.Number <> 0 Then '如果打开失败,返回 vbOpenPortFailedInitPort = vbOpenPortFailedExit FunctionEnd IfEnd If '成功,继续End Function'------------------------------------------------------------------------------------------------Public Function GetData(ByVal lData As Byte, Buffer As String, Optional ByVal Addr As Byte = 0, _ Optional ByVal Timeout As Long = 1) As CommResultCheckComm '检测 CommControl 对象If Not CommControl.PortOpen Then '如果端口还未打开,返回GetData = vbPortNotOpenedExit FunctionEnd If'定义变量Dim CheckSum As Long, CheckSum2 As Long, i As ByteDim tmpBuffer As String, OldTimer As SingleIf Addr = 0 Then Addr = DefAddr '如果不指定地址,则以发送地址为接收地址lData = lData + 8CommControl.InputLen = lDataOldTimer = TimerDo '判断通信是否超时,是则中断通信并提示If CommControl.InBufferCount >= lData Then tmpBuffer = CommControl.Input: Exit DoIf Timer - OldTimer >= Timeout Then GetData = vbTimeout: Exit FunctionDoEventsLoop While TrueIf AscB(MidB(tmpBuffer, 1, 1)) <> SOI Or AscB(MidB(tmpBuffer, 2, 1)) <> VER Or _AscB(MidB(tmpBuffer, 3, 1)) <> Addr Or AscB(MidB(tmpBuffer, lData, 1)) <> EOI ThenGetData = vbInvalidDataExit FunctionEnd If'======== 算出收到数据的 CheckSum ===========CheckSum = 0lData = AscB(MidB(tmpBuffer, 5, 1))For i = 2 To lData + 5CheckSum = CheckSum + AscB(MidB(tmpBuffer, i, 1))NextCheckSum = CheckSum And &HFFFF&CheckSum2 = AscB(MidB(tmpBuffer, 7 + lData, 1)) * 256 + AscB(MidB(tmpBuffer, 6 + lData, 1)) '判断 CheckSum 是否正确If CheckSum2 <> CheckSum Then GetData = vbInvalidData: Exit Function'所有检测通过则返回正确数据Buffer = tmpBufferGetData = vbSuccessEnd Function'------------------------------------------------------------------------------------------------Public Function SendData(Addr As Byte, Cmd As Byte, Optional Datas As String = "", Optional ByVal Timeout As Long = 1) As CommResultCheckComm '检测 CommControl 对象If Not CommControl.PortOpen Then '如果端口还未打开,返回SendData = vbPortNotOpenedExit FunctionEnd If'定义变量Dim BinData() As Byte, i As Long, lData As LongDim CheckSum As LonglData = LenB(Datas)ReDim BinData(1 To 8 + lData) '将数据转储到<字节数组>BinData(1) = SOIBinData(2) = VERBinData(3) = AddrDefAddr = AddrBinData(4) = CmdBinData(5) = lDataCheckSum = BinData(2) + BinData(3) + BinData(4) + BinData(5) '算出收到数据的 CheckSum For i = 6 To lData + 5BinData(i) = AscB(MidB(Datas, i - 5, 1))CheckSum = CheckSum + BinData(i)NextBinData(i) = CheckSum And &HFFBinData(i + 1) = (CheckSum \ &H100) And &HFFBinData(i + 2) = EOICommControl.Output = BinData '发送数据Dim Response As String '定义回应数据缓冲区SendData = GetData(1, Response, , Timeout) '接收回应数据If SendData = vbSuccess Then '接收回应:等于 0 - 成功不等于 0 - 失败SendData = IIf(AscB(MidB(Response, 6, 1)) = 0, vbSuccess, vbInvalidData) 'End IfEnd Function'------------------------------------------------------------------------------------------------Private Sub CheckComm()'检测 CommControl 对象If CommControl Is Nothing ThenErr.Raise -1, , "请先设置 CommControl 对象的引用,格式为" & vbCrLf & vbCrLf & _" Set CommControl = 窗体名.MSComm控件名" & vbCrLf & vbCrLf & _"如 Set CommControl = Form1.MSComm1"End IfEnd Sub'------------------------------------------------------------------------------------------------Public Function ErrMsg(nErr) As StringErrMsg = Choose(nErr + 1, "成功", "端口忙", "端口打开失败", "通信超时", "数据有误", "端口还未打开")End Function'------------------------------------------------------------------------------------------------;=========================================================================================== ======;单片机与微机间串行通信AT89C52单片机部分程序 (单片机晶振振荡频率 11.0592MHZ)RT_CONTROL BIT P3.2 ;RS-485串口通信控制(接收低电平,发送高电平);----------------------------------------------------------------------------;变量定义RD_ADDRESS EQU 5FH ;接收PC数据地址指针PCBUF EQU 60H ;PC读写数据缓冲区:60H-DFH,128BYTESTD_ADDRESS EQU 60H ;PC发送数据首址SOI_PC EQU 60H ;开始位 [地址]VER_PC EQU 61H ;版本号 [地址]ADR_PC EQU 62H ;地址位 [地址]CMD_PC EQU 63H ;命令位 [地址]LEN_PC EQU 64H ;数据长度[地址]DATBUF_PC EQU 65H ;数据首 [地址];----------------------------------------------------------------------------;数据赋值SP_ADDRESS EQU 0E0H ;堆栈指针值SOI_DATA EQU 0AAH ;开始位VER_DATA EQU 10H ;硬件版本:1.0ADR_DATA EQU 01H ;从机地址:1EOI_DATA EQU 0BBH ;结束位;----------------------------------------------------------------------------;设定程序入口地址ORG 0000HLJMP MAIN_INITORG 0023HLJMP UARTI;============================================================================;主程序MAIN_INIT: ;主程序初始化MOV SP,#SP_ADDRESS ;设定栈基址MOV TMOD,#20H ;TIMER1工作在MODE2MOV TH1,#0FDH ;波特率9600MOV TL1,#0FDH ;SETB TR1 ;启动TIMER1计时MOV SCON,#50H ;UART工作在MOWE1,SM1=1,REN=1;-------------------------------------------------------MOV IE,#10010000B ;UART中断激活;-------------------------------------------------------CLR RT_CONTROL ;允许RS-485接收; .;============================================================================; 中断服务子程序UARTI: CLR EA ;关中断PUSH A ;保护现场PUSH PSWMOV PSW,#00010000B ;使用三区寄存器MOV A,#05H ;接收数据数量 SOI-VER-ADR-CMD-LEN =[5 BYTE] MOV RD_ADDRESS,#PCBUF ;设置接收PC数据地址指针LCALL R_DATA ;调用接收数据子程序MOV A,SOI_PCCJNE A,#SOI_DATA,UARTI_B_E ;SOI不正确,则转移MOV A,VER_PCCJNE A,#VER_DATA,UARTI_B_E ;VER不正确,则转移MOV A,ADR_PCCJNE A,#ADR_DATA,UARTI_B_E ;ADR不正确,则转移MOV A,LEN_PC ;判断LEN,再接收 nDATA-CHK-EOIADD A,#03H ;接收数据数量MOV RD_ADDRESS,#DATBUF_PC ;设置接收PC数据地址指针LCALL R_DATA ;调用接收数据子程序LCALL CHECKSUM ;调用CHECKSUM子程序JNZ UARTI_B_E ;CHECKSUM不正确,则转移MOV DATBUF_PC,#00H ;接收数据正确,则返回#00HLCALL T_PC_BACK ;调用回应子程序LCALL CHK_R_DATA ;调用接收数据处理子程序AJMP UARTI_OUTUARTI_B_E:MOV DATBUF_PC,#0FFH ;接收数据不正确,则返回#0FFHLCALL T_PC_BACK ;调用回应子程序UARTI_OUT:POP PSW ;恢复现场POP ACLR RT_CONTROL ;允许RS-485接收SETB EA ;开中断RETI;;============================================================================; 接收数据子程序R_DATA: CLR RT_CONTROL ;允许RS-485接收MOV R0,A ;接收数据数量装入R0MOV R1,RD_ADDRESS ;接收数据首址装入R1MOV R2,#00HMOV R3,#00HR_WAI: JBC RI,R_JMP ;检测SCON的RI是否为1?是则表示接收到8位数据DJNZ R3,$DJNZ R2,R_WAILJMP R_OUT ;R_JMP: MOV A,SBUF ;SBUF装入AMOV @R1,AINC R1 ;地址加一CLR RI ;清除RIDJNZ R0,R_WAIR_OUT: RET ;;-------------------------------------------------------; 发送数据子程序T_DATA: SETB RT_CONTROL ;允许RS-485发送MOV R0,A ;发送数据数量装入R0MOV R1,#TD_ADDRESS ;发送数据首址装入R1T_LOOP: MOV A,@R1 ;MOV SBUF,A ;数据装入SBUFMOV R2,#00HMOV R3,#00HT_WAI: JBC TI,T_JMP ;检测SCON的TI是否为0?是则表示已发送8位数据DJNZ R3,$DJNZ R2,T_WAILJMP T_OUTT_JMP: INC R1 ;地址加一DJNZ R0,T_LOOP ;T_OUT: CLR RT_CONTROL ;允许RS-485接收RET ;;=========================================================================================== ======。
中国校外教育计算机教学08/2010VB6.0在PC 机与单片机串行通信中的应用田玉1张文友2蔚明2赵雅楠2(1.河北移动承德分公司;2.承德广播电视大学)摘要!在开发微机控制及数据采集系统中,要实现PC 机与单片机中的串行通信,经常用到的是RS232接口。
我们普通PC 机后面的COM 端口即RS232接口。
VB6.0提供了M SC OMM 通信控件,只需编写少量的程序代码,即可在W i ndow s 环境下轻松实现串口的数据交换。
本文以笔者曾研制的压力测定系统为例简单介绍通过VB 实现计算机串口通信的方法。
关键词!串口通信RS232VB6.0随着计算机技术的迅速发展及其在各领域的广泛应用,远程控制以及数据采集系统多采用上位机和下位机的主从工作方式,由于串行通信具有高效可靠、价格便宜,遵循统一的标准等特点,因而成为主要的通信手段。
微机的分析处理能力较强,有很好的人机界面和大容量的多种存储方式,所以上位机一般采用微机。
而单片机具有价格低,功能强,抗干扰能力好,以及面向控制等特点,所以下位机采用单片机来构成主从式多机工作模式。
一、VB6.0实现串行通信方法VB 提供的通信控件M sco mm 32.ocx ,使用前只需从Pro j ect 菜单下的Co mponents 中选择M i crosoft Co mm C ontro l6.0把M sco mm32.ocx 控件调入工具框中即可使用。
利用该控件可对串行通信的数据发送和接收进行设置,还可对串口状态及串行通信的信息格式和协议进行设置。
在通信过程中可以通过触发On C o mm 事件来追踪、处理通信和错误事件的发生。
由于每个通信控件对应一个串口,如果要访问多个通信口,则要设计多个通信控件。
硬件连接:(1)当单片机以RS232接口为端子连接时,单片机与计算机的连接如下图:(2)当仪表以RS485接口(其它接口如422等类同)为端子连接时,单片机与计算机的连接如下图:2.M S CO MM 控件简介为支持串行通信的实现,VB6.0中M scomm 控件提供了众多的串行通信属性,但首先必须要熟悉的几个属性主要包括:C o mmPor:t 设置并返回通讯端口号。
VB实现电脑跟单片机通讯任务说明:电脑端通过串口将数字(00,01,….,FF,十六进制)发送给单片机,单片机收到后回传这个数字,电脑接收到回传数据后显示出来,若发送的数据和接受的数据一致,则串口通讯正常,否则错误。
起始符是数字00,结束符是数字FF。
一、软件界面设计如下:二、VB程序代码如下:'将数字(0,1,2,3...255,转换为16进制)传给单片机,单片机收到后回传这个数字,PC机接收到回传数据后显示出来,'若发送和接收的数据相同,显示通信正常,否则通信不正常'发送以00开始,以FF结束'定义变量Dim data, data1 As V ariant '串口初始化'在窗体的Load事件中加入下列代码对串口进行初始化:Private Sub Form_Load()mPort = 1MSComm1.InputMode = 1MSComm1.RThreshold = 1MSComm1.SThreshold = 1MSComm1.Settings = "9600,n,8,1"MSComm1.PortOpen = Truesenddata.Text = "00"End Sub'单击清空文本框Private Sub senddata_Click()senddata.Text = ""Cmdsend.Enabled = TrueEnd SubPrivate Sub senddata_Change()senddata.Text = UCase(senddata.Text)End SubPrivate Sub senddata_KeyPress(KeyAscii As Integer)If (KeyAscii >= Asc("a") And KeyAscii <= Asc("f")) ThenKeyAscii = KeyAscii - 32End IfEnd Sub'向单片机发送数据Private Sub Cmdsend_Click()If Len(senddata.Text) <> 2 ThenMsgBox ("请输入2位16进制数!")Exit SubEnd Ifc = senddata.TextIf (c = "FF") Thendata1 = "&H" & cdata = Chr(data1)Elsea = Left(c, 1) '截取senddata左边字符b = Right(c, 1) '截取senddata右边字符data1 = "&H" & senddata.Text 'data1没有将senddata中的字符拆开data = Chr("&H" & a) & Chr("&H" & b) '将senddata中的字符拆开存入data中,这样就会解决例如A1接收不正确的问题End IfMSComm1.Output = dataCmdsend.Enabled = FalseEnd Sub'获取温度测量值并显示'每发送一次指令,触发下面事件,返回数据串Private Sub MSComm1_OnComm()Dim Inbyte() As ByteDim buffer As Variant'读取仪表返回数据串Select Case mEventCase comEvReceiveInbyte = MSComm1.InputFor i = LBound(Inbyte) To UBound(Inbyte)buffer = buffer + Hex(Inbyte(i))Next iCase comEvSendEnd SelectIf Len(Trim(buffer)) = 1 Thenreturndata.Text = Str("0") & bufferElsereturndata.Text = bufferEnd IfIf "&H" & buffer = data1 ThenLabel1.ForeColor = QBColor(13)Label1.Caption = "通信正常!"End IfIf "&H" & buffer <> data1 ThenLabel1.ForeColor = QBColor(12)Label1.Caption = "通信不正常!"Label1.Caption = "未接收到数据"End IfIf Trim(buffer) = "FF" ThenLabel1.ForeColor = QBColor(12)Label1.Caption = "输入00重新开始!"End IfEnd Sub'当退出程序时,关闭串行口Private Sub Cmdquit_Click()Unload MeEnd SubPrivate Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) MSComm1.PortOpen = False '关闭串口End Sub三、单片机代码:。
在各种单片机应用系统的设计中,常常遇到单片机与PC的通信问题,在速度要求不高、传送距离不远的场合一般采用RS 232标准串行接口实现,在传送距离较远的场合,也有学者研究通过网络实现PC间的通信。
但是,要同时满足高速度和远距离PC与单片机通信这是一个迫切需要解决的问题。
随着信息技术的发展,计算机和网络越来越普及,对单片机的远程控制与测量的要求也越来越多。
本文在结合现有研究的基础上,对相关的设计进行一定的改进和创新,设计一个远程通信系统,他由3部分构成:远端PC、本地端PC和单片机系统。
通过VB 可视化编程,远端PC利用局域网向本地端PC发出命令,本地端PC接到命令后,自动与单片机通过打印机接口以EPP1.9协议进行通信(串行接口作为备用通信口),并将接到的单片机数据实时传送给远端PC,以实现高速远程情况下PC与单片机通信的要求。
1 系统结构与设计系统构成如图1所示,远端PC通过局域网和本地PC通信,在通信中使用Winsock控件和TCP/1P协议;本地端PC通过并行通信接口或串行通信接口与单片机通信,在并口通信中使用WINIO并口通信驱动程序、EPP协议和LPT打印机接口,在串口通信中使用MsComm控件、RS 232C协议和COM口。
在此结构中,本地PC端起到中继的作用,当本地端PC接收到从远端PC传送过来的命令,在选择通信方式后,与单片机通信,使单片机向远端PC传送数据。
2 远端PC与本地端PC通信设计TCP/IP是目前在网络通信中广泛采用的一组完整的网络协议,该协议的核心是TCP,IP和UDP协议。
TCP/IP网络环境下应用程序通过网络系统编程界面套接字(Socket)实现与内核的交互。
利用Socket通信编程接口编写程序,其目的是在TCP/IP所组建网络的不同机器之间利用客户/服务器模式建立通信连接,开发人员只要提供一些基本的连接信息,其余由操作系统内核完成。
WinSock(Windows Socket)是Windows操作系统下的通用的TCP/IP应用程序的网络编程接口,通过调用WinSock的接口函数来调用TCP/IP的各种功能。
用VB Active X 控件实现PC与单片机的串行通信
刘鹏;于复生;刘迎春
【期刊名称】《兵工自动化》
【年(卷),期】2004(023)002
【摘要】用VB ActiveX控件可实现单片机与上位PC间的串行通讯.上位机用VB6.0编程,打开VB项目,添加Mscomm、Label、TextBox等控件并设置控件属性,再进行代码设计.下位机用汇编语言编程,设置串行口的工作方式与波特率、发送并接收数据.单片机从EEPROM中读取数据,通过RS-232将其传入PC进行校验,校验正确回送校验指令1,单片机继续发送数据并将数据存储,校验不正确,回送数据0,单片机重发数据直到正确为止.
【总页数】3页(P70-72)
【作者】刘鹏;于复生;刘迎春
【作者单位】山东建工学院,机电系,山东,济南,250014;山东建工学院,机电系,山东,济南,250014;山东潍坊科技职业学院,山东,寿光,262700
【正文语种】中文
【中图分类】TP393.03
【相关文献】
1.用VB实现PC机与MSP430单片机串行通信的研究 [J], 孙瑞杰;吴晓宇;张瑜;马铁华
2.基于VB的PC机与单片机串行通信系统研究与实现 [J], 马壮;吴铮;王永强
3.利用VB8.0实现PC机与多单片机串行通信的方法 [J], 王平根
4.基于VB实现PC机与单片机的串行通信 [J], 王圆妹;许劲;李涛
5.用VC++控件实现PC与单片机之间的串行通信 [J], 马风格;胡书屏;王敏
因版权原因,仅展示原文概要,查看原文内容请购买。
摘要:本文给出了一种以数传电台为通讯媒体,由控制中心PC机和多个AT89C51单片机系统组成的远程无线通信系统,重点介绍了利用VB实现PC机与多个单片机控制系统远程无线通讯程序设计方法,实现了PC机对多个远端单元的实时控制与管理。
关键词:Visual Basic、串行通讯、数传电台、单片机、远程控制
1 引言
随着现代电子与信息技术的不断发展,计算机与单片机控制系统之间的远程无线通讯技术得到了广泛的应用,而数传电台目前已发展成为远程无线通信的一种重要工具,它使用灵活、性价比高,环境适应能力强,非常适用于大范围、分散控制系统及在恶劣环境中,不适于铺设有线网络的实时监控系统,数传电台已成功应用于电力设备监控、计算机实时监控与数据采集(SCADA)以及实时交易数据遥测遥控等领域。
同时VB6.0具有界面友好、编程简便高效、数据处理及驱动底层硬件功能强等优点,成为许多用户开发PC 机与单片机串行通信程序的首选工具。
本文以美国MDS OEM EL705数传电台为通讯媒体,利用VB6.0的通讯控件MSComm实现了控制中心PC机与多个远端AT89C51单片机控制系统之间远程无线通讯,实现了控制中心PC机对多个远端单元的实时控制与管理,并应用于工程设计中,通过实际应用,取得了满意的效果。
2 系统的组成及工作原理
2.1系统的组成
系统由控制中心和多个远端单元RTU(Remote Terminal Unit)组成。
控制中心主要由上位机PC和数传电台组成,各远端单元由数传电台、AT89C51单片机系统及现场设备组成,各远端单元根据实际需要分布在距控制中心一定距离的范围内,控制中心及远端单元结构分别如图1、图2所示。
2.2工作原理
控制中心作为系统的数据终端设备DTE(Data Terminal Equipment),负责实现对远端单片机系统的实时控制与管理,打印单片机系统工作状态信息、自检信息、记录报表信息及远程单片机系统故障报警信息
等,并可通过局域网与其它PC机进行信息传递。
PC机与数传电台通过RS232通讯电缆相连接,电台采用连续相位频移键控(CPFSK)调制方式,数据直接启动电台发射,空中无线传输速率为9600bps,端口数据传输速率可根据系统需要设置为1200bps~
19200bps。
各远端单元数传电台通过RS232通讯电缆与单片机系统相连接,单片机系统通过固态继电器以离散量的形式控制现场设备。
单片机系统(图2虚线框中部分)采用MAX232芯片实现与数传电台之间信号的电平转换,并通过2片8位移位寄存器74LS164和2片74LS373锁存器,实现串行输入并行输出16位开关量,分别控制16个固态继电器的通断,从而控制16路现场设备。
单片机系统还有复位、故障报警及高能蓄电
池供电等系统。
图1 控制中心结构示意图
图2 远端单元结构示意图
综上所述,系统是以数传电台为通信媒体,组成点到多点的主从式远程无线通信网络系统。
控制中心PC 机和远端单元之间通过数传电台以同频异步半双工方式进行数据信息传输,PC机通过串口发送信息到数传电台,数传电台通过高频载波信号将控制信息发送给远端单元,收到正确信息的远端单元向控制中心回送正确接收信息,并执行控制命令控制现场设备的接通与关断,从而实现控制中心对各远端现场设备的实时控制与管理。
为实现最大的传输距离并防止各远端单元之间的相互干扰,系统控制中心的电台使用全向天线,远端单元电台使用定向天线,并保证控制中心电台天线高于各远端电台天线的高度。
3 无线串行通信程序设计
3.1通信协议
1、一帧数据位由1位起始位、8位数据位、0位校验位、1位停止位共10位组成。
2、波特率为9600bps。
单片机串行口按方式1工作,波特率用定时器T1控制,为得到准确的波特率,单片机采用振荡频率为11.0592MHz的晶振。
PC机串口波特率通过VB通讯控件MSComm的Settings属性设置,为保证数据传送的准确性,两者的波特率必须一致。
3、PC机发送的信息为固定5个字节:第1和第2字节分别为远端单元地址信息标志(以AAH表示)和具体地址号(本系统有8个远端单元,可分别编址为01H、02H、…08H),第3和第4字节为开关量控制信息(第3字节数据信息控制1到8路继电器,第4字节控制9到16路继电器),第5字节为校验码(CheckSum)数据。
4、远端单片机回送的信息为固定3个字节:第1和第2字节为远端单元地址,第3字节为回送的信息,EEH为接收完毕确认信息,FFH为接收出错重发信息等。
3.2远端AT89C51单片机串行通讯程序设计
远端AT89C51单片机采用中断方式、基于MCS-51汇编语言与上位机进行通讯,中断子程序流程图如图3所示。
控制中心上位机PC每次发送控制信息前必须先发送指定远端单元的地址信息,单片机进入数据接收子程序,如果收到的地址与本机地址相同,置接收数据标志位,连续接收上位机发送过来的控制信息。
数据接收完毕,开始对控制信息进行校验码确认操作,校验正确则回送上位机确认信息,并对两字节控制数据进行移位操作等必要处理,最后输出开关量并返回中断入口处;若校验错误,回送上位机重发信息。
如果远端单片机收到的地址与本机地址不同,程序也返回中断入口处,继续执行其它操作或等待接收新的信息。
这样,就确保上位机把控制信息可靠地传给指定的远端单元,各远端单元回送的信息只能被上位机接收。
由于每个数传电台时刻处于待机状态(也可以根据实际需要,使电台进入休眠状态等待),所以只有先对远端单元地址进行确认,才能保证在某一时刻只有一个远端单元完全接收了上位机发出的数据信息,避免了不必要的资源耗费。
图3 单片机中断子程序流程图
3.3 上位机PC串行通讯程序设计方法及实现
上位机利用VB6.0编程,用VB6.0开发串行通信程序普遍采用以下两种方法:一种是利用Windows的API函数;另一种是采用VB6.0的通讯控件MSComm。
利用API函数编写串行通信程序较为复杂,需要调用许多繁琐的API函数,而VB6.0的MSComm通讯控件提供了标准的事件处理函数、事件和方法,用户不必了解通信过程中的底层操作和API函数,从而比较容易、高效地实现了串口通信。
MSComm控件提供了两种功能完善的串口数据发送和接收功能:一种是查询法,通过检查CommEvent 属性的值来轮询(Polling)事件和通信状态,可以使用定时器或DO…Loop程序实现;另一种是事件驱动法(Event-driven),利用MSComm控件的OnComm事件捕获串口通信错误或事件,并在OnComm事件中编写程序进行相应处理,这种方法响应及时,可靠性高,本软件系统采用了此方法来接收远端单片机的回执信息,以使PC机作出更快的反应。
数传电台基于透明传输,不改变系统原来的通讯程序及传输格式,编程时只需适当考虑无线传输引起的信号时延。
软件采用定时器Timer1控件来实现在数据信息送出30秒后(Timer1.Interval = 30000),PC机仍未收到任何回执信息时,程序自动跳出系统。
实现同样的功能,程序代码会因不同人的编写而略有不同,并且篇幅所限,在此仅给出在VB中对MSComm控件初始化和数据发送与接收的部分源程序,代码如下:
……
初始化MSComm控件程序:
With Comm1 …控件名为Comm1
.CommPort=1 …使用串行端口1
.Settings=“9600,n,8,1”…设置初始化参数
.InputLen=0 …读取缓冲区的全部数据
.InputMode=comInputModeBinary …以二进制方式接收数据
.RThreshold=3 …接收缓冲区达到3个字节时产生OnComm事件
End with …其它属性值为默认即可
……
发送数据程序:
……
Dim Send As Variant …定义变量
Dim OutByteD(5) As Byte …定义发送数据数组
………获取发送数据
Send=OutByteD …将发送的数据赋给发送变量
Comml.Ouput=Send …发送数据
……
数据接收程序:
Private Sub Comm1_OnComm()
Select Case mEvent
Case comEvReceive
Dim Jshuju() As Byte , i%, count%
Dim Rec As Variant
Rec=Comm1.Input
count=UBound(Rec)
ReDim Jshuju(count-1) As Byte
For i=0 to count-1
Jshuju(i)=Rec(i)
Next i
………判断回执信息并进行相应处理,如处理指定远端单元数据接收完毕、数据接收有误请求重发信息、显示、打印自检信息等
End Select
End Sub
4 结论
通过采用上述通讯方法实现了基于数传电台的控制中心上位机对各远端单片机系统的远程实时控制,实现了高速、实时数据的发送和接收。
经过实际应用,系统工作稳定可靠,满足了预期的控制要求。
可以预见,数传电台以其使用灵活简便、全数字化无线通讯及环境适应能力强等优点必将在信息采集、远程监控等领域得到更加广泛的应用。
参考文献:
[1]范逸之,陈立元.Visual Basic与RS-232串行通信控制最新版.北京:中国青年出版社,2002。