VB上位机通过串口与单片机通信视频教程
- 格式:doc
- 大小:75.50 KB
- 文档页数:2
VB环境下实现PC机与单片机的串行通讯随着科技的不断发展,PC机和单片机的联系日益密切,特别是在嵌入式系统领域中,单片机已经成为了必不可少的重要组成部分。
而如何实现PC机和单片机之间的通讯,是一项必须要掌握的技能。
本篇文章主要介绍如何运用VB环境下的串口编程,实现PC机与单片机的串行通讯。
一、概述通讯技术日新月异,各种新的通讯技术层出不穷。
而在普通家庭却使用最为广泛的通讯技术,还是传统的串口通讯。
使用传统的串口通讯,可以实现PC机与单片机之间的数据交互,可靠性高,兼容性强,使用便捷。
要实现PC机与单片机之间的串行通讯,需要掌握两个技能:单片机串行通讯的编程和VB环境下串口编程。
二、单片机串行通讯的编程单片机串行通讯主要是通过寄存器和中断实现的。
单片机通过一个IO口与电脑之间建立一个简单的通讯接口,PC机通过该接口向单片机发送数据,单片机接收到数据,就可以通过该接口把数据返回给PC机。
单片机串口通讯编程的内容主要包括串口数据位、停止位、校验位、波特率等信息,这些信息需要设置在单片机的寄存器中。
同时,还要设置中断信息,以免程序在不接收数据时死等。
三、VB环境下串口编程VB环境下串口编程的关键是掌握控件的使用。
实际上,VB环境下的串口编程非常简单,只需要使用微软提供的MSComm控件就可以实现。
通过MSComm控件的事件和方法,可以轻松地实现数据的读取、发送、接收等功能。
需要注意的是,MSComm控件的BaudRate属性需要与单片机编写的程序的波特率一致,不然可能会出现通讯故障。
四、如何实现串口通讯首先需要硬件上建立好通讯接口。
通常情况下,USB串口转换器和单片机板子都会配套出售,只需要把两者插在一起即可。
其次需要编写单片机的串口通讯程序。
单片机数字口与串口的通讯,就是把串口接到单片机的数字口中,通过串口向外发送数据。
因此,编写单片机的串口通讯程序,需要设置停止位、数据位、奇偶校验位、波特率等参数。
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 取决你使用的串行口,在设备管理器中查看。
Private Sub Command1_Click() ' 发送功能代码: Dim Num As Integer ' 发送的数据变量Dim OutB (0) As Byte ' 发送字节数组Num=Val(Text1.text) ' 类型转换OutB (0)=CByte(Num) ' 转换为二进制MSComm1.OutBufferCount=0 ' 清空发送缓冲区MSComm1.Output=OutB ' 发送数据End Sub接收功能代码:Private Sub MSComm1_OnComm()Dim Array1(0) As Byte ' 接收字节数组Select Case mEventCase comEvReceive ' 触发接收事件Dim Buffer As VariantMSComm1.InputLen = 0Buffer=MSComm1.Input ' 接收数据Array1 (0)=AscB(InData) ' 类型转换Text2.text= Array1 (Buffer) ' 显示数据MSComm1.InBufferCount=0 ' 清空接收缓冲区End SelectEnd Sub单片机部分程序代码Private Sub Form_Load()mPort = 11 '使用COM 作为通信端口MSComm1.Settings = "300,N,8,1" '设置通信参数波特率为9600,' 无奇偶校验位, 8 个数据位, 一个停止位MSComm1.InputLen = 0 '读取缓存区的所有字符MSComm1.InBufferSize = 1024 '设置接收缓存区为1024MSComm1.OutBufferSize = 512 '设置发送缓存区为512MSComm1.PortOpen = True '打开串口MSComm1.SThreshold = 1 '不触发发送事件MSComm1.RThreshold = 1 '每一个字符到接收缓存区都触发接受事件MSComm1.InBufferCount = 0 '清除发送缓存区的数据MSComm1.OutBufferCount = 0 '清除接收缓存区的数据MSComm1.InputMode = comInputModeBinary ' 采用二进制方式End SubPrivate Sub Comsend_Click()Dim x As StringIf Textsend.Text = "" Then '发送数据不能为空x = MsgBox("发送数据不能为空", 16)Exit SubEnd IfIf Not MSComm1.PortOpen Then '保证串口打开MSComm1.PortOpen = TrueEnd IfMSComm1.Output = Textsend.Text + Chr$(13)For i = 1 To 20000000 '延时NextEnd SubPrivate Sub Command1_qkfs_Click()Textsend.Text = "" '清空发送缓存区Textsend.SetFocusEnd SubPrivate Sub Command2_qkjs_Click()TextReceive.Text = "" '清空接收缓存区Textsend.SetFocusEnd SubPrivate Sub MSComm1_OnComm()Select Case mEvent '检验串口事件'错误处理Case comEventOverrun '数据丢失Textsend.Text = "" '清空发送缓存区TextReceive.Text = "" '清空接收缓存区Textsend.SetFocusExit SubCase comEventRxOver '接收缓存区溢出Textsend.Text = "" '清空发送缓存区TextReceive.Text = "" '清空接收缓存区Textsend.SetFocusExit SubCase comEventTxOver '发送缓存区已满Textsend.Text = "" '清空发送缓存区TextReceive.Text = "" '清空接收缓存区Textsend.SetFocusExit Sub'事件处理Case comEReceive '接收缓存区内有数据Dim str As Stringsrt = MSComm1.Input '从接收队列中读入字符串TextReceive.Text = TextReceive.Text + str '读出字符串送显End SelectEnd SubPrivate Sub Commandguanbi_Click()MSComm1.PortOpen = FalseUnload MeEnd Sub/share/269187588/12858676890?from=010*******&ref=hotnewsfeed&sf et=110&fin=5&ff_id=269187588。
'初始化代码Private Sub Form_Load() '窗体被加载时产生If MSComm1.PortOpen = True Then '串口查看是否打开,打开则关闭MsgBox "端口已经打开", 2'MSComm1.PortOpen = FalseEnd IfWith MSComm1.CommPort = 3 '设置串口3.Settings = "9600,n,8,1".InputLen = 0 '读取接收缓冲区所有字符.InBufferSize = 1024 '设置接收缓冲区1024字节.OutBufferSize = 512 '设置发送缓冲区512字节.InputMode = comInputModeText. '采用文本传输'.PortOpen = True '打开串口.SThreshold = 0 '一发送数据就触发OnComm事件.RThreshold = 1 '接收到一个字节就触发OnComm事件.InBufferCount = 0 '清除发送缓冲区数据.OutBufferCount = 0 '清除接收缓冲区数据End WithText_send.Text = ""Text_recv.Text = ""Text_send_16.Text = ""End Sub'清空对话框数据Sub Command3_Click(Index As Integer)Text_send.Text = ""Text_recv.Text = ""Text_send_16.Text = ""End Sub'通讯端口选择Private Sub Combo1_Click()If Combo1.Text = "com1" Then '通讯端口号设置mPort = 1'Text1 = 1ElseIf Combo1.Text = "com2" ThenmPort = 2'Text1 = 2ElseIf Combo1.Text = "com3" ThenmPort = 3'Text1 = 3ElseIf Combo1.Text = "com4" ThenmPort = 4'Text1 = 4ElsemPort = 5'Text1 = 5End IfEnd SubPrivate Sub Combo2_Click()If Combo2.Text = "9600,e,8,1" ThenMSComm1.Settings = "9600,e,8,1"ElseIf Combo2.Text = "9600,n,8,1" ThenMSComm1.Settings = "9600,n,8,1"ElseIf Combo2.Text = "57600,n,8,1" ThenMSComm1.Settings = "57600,n,8,1"End IfEnd Sub'发送数据Private Sub Command1_Click(Index As Integer)'判断是否选择了端口与通讯方式If CBool(Combo1.Text = "请选择") Or CBool(Combo2.Text = "请选择") = 1 Then MsgBox "请设置端口号与通讯方式", 2Exit SubEnd If'保证串口打开If Not MSComm1.PortOpen ThenMSComm1.PortOpen = TrueEnd If'发送数据MSComm1.Output = Text_send.Text'延时For i = 1 To 2000000Next iEnd Sub'发送16进制数据Private Sub Command4_Click(Index As Integer)'判断是否选择了端口与通讯方式If CBool(Combo1.Text = "请选择") Or CBool(Combo2.Text = "请选择") = 1 Then MsgBox "请设置端口号与通讯方式", 2Exit SubEnd If'保证串口打开If Not MSComm1.PortOpen ThenMSComm1.PortOpen = TrueEnd If'发送数据Dim a, b As String'Dim a As Long, b As Stringa = Text_send_16.Textb = CLng("&H" & a)MSComm1.Output = b'延时For i = 1 To 2000000Next iEnd SubPrivate Sub Command2_Click(Index As Integer)'判断是否选择了端口与通讯方式If CBool(Combo1.Text = "请选择") Or CBool(Combo2.Text = "请选择") = 1 Then MsgBox "请设置端口号与通讯方式", 2Exit SubEnd If'保证串口打开If Not MSComm1.PortOpen ThenMSComm1.PortOpen = TrueEnd If'接受数据Dim str As Stringstr = MSComm1.Input '从接收队列中读入字符串Text_recv.Text = Text_recv.Text & str '读出字符串送显Text_recv.Text = Text_recv.Text & "" & vbCrLf '文本换行符End Sub。
1.你还有为购买昂贵的硬件而烦恼吗?PROTUES仿真帮助你解决这个问题
2.你还在为数据采集而烦恼吗?你还在为上位机控制单片机烦恼吗?
3.这套视频将从头到尾解决你所遇到的上位机数据采集和控制单片机的问题,使你触类旁通。
东电隆重推出VB上位机控制单片机视频教程
地址:
或:
店内搜索:VB上位机通过串口与单片机通信
视频截图1—实现的功能
视频截图2—实现功能界面
视频截图3—单片机数据采集界面
视频截图4—添加网络号
视频截图5—添加元件
视频截图6—概况
视频截图7—编写程序1
视频截图8—编写数据采集程序2
视频截图9—编写程序
视频截图10—采集数据成功
视频截图11—添加串口
视频截图12—编写串口程序
视频截图13—编写串口程序
视频截图14—串口接收数据
视频截图15—串口调试助手控制发光二极管的亮和灭
视频截图16—编写VB上位机软件
视频截图17—编写VB上位机软件
视频截图18—VB代码编写过程
视频截图19—VB采集数据代码
视频截图20—串口选择
视频截图21—二极管亮灭程序
视频截图22—控制亮
视频截图23—控制灭
视频截图24—VB编写的上位机界面视频截图25—虚拟串口
视频截图26—所有资料。
设计基本原理主要功能:上位机和下位机连接好后握手,如果成功,上位机就可以发字符串让下位机的LCD显示出来,如果没有握手就不显示上位机发来的内容.下位机设计:主程序首先初始化串口和LCD,然后进入一个死循环,这个循环往LCD写dataArray这个数组中的数据,因此只要改变了这个数组中的第0-31位的内容就相当于改变了屏幕上显示的内容. 当串口发来消息的时候,执行中断号为4(串口中断)的服务子程序.这时候还不能让上位机往下位机传字符串,因此需要判断是否已经握手,判断的标志就是dispEn (display enable),如果等于0说明还没有握手,就把用户发来的数据当成是控制字control,如果是等于1说明之前已经握过手了,就把用户发来的数据放到dataArray中.最后判断控制字是否是握手,如果control等于0x00是就握手信号,然后回复0x01.然后把dispEn=1,最后把控制字control改掉(因为下一次中断可能已经不是握手信号了)上位机设计:由于已经把端口号写在vb程序中了,所以要改端口号的话要进vb的代码中把mPort = 4 中的4 改为自己需要的串行端口号.然后运行程序,打开端口,此时没有和下位机握手,所以输入数据后单击发送是没有反应的,所以需要先单击握手按钮,向传哭发送0x00,然后延时800毫秒等待回复,然后接收数据,如果回复的是0x01那就表明握手成功,如果没有回复那就是握手失败.用户点击发送信息,上位机把字符串拆分成字符来发送一次发送一个字符,每个字符发送延时30毫秒避免因为连续发送而造成的乱码.a)原理框图b)硬件电路原理图AT89C521~8:I/OP1口(P1.0~P1.7);9:复位脚(RST/Vpd);10~17:I/OP3口(P3.0=RXD,P3.1=TXD,P3.2=-INT0,P3.3=-INT1,P3.4=T0,P3.5=T1,P3.6=-WR,P3.7=-RD)主要是此引脚;18、19:晶振(18=XTAL2,19=XTAL1);20:地(Vss);21~28:I/OP2口(P2.0~P2.7);29:-PSEN;30:ALE/-PROG;31:-EA/Vpp32~39:I/OP0口(P0.7~P0.0);40:+5V电源。
Option Explicit Dim count1 As String 'Dim count11 As String Dim flag As Integer 'Dim flag_1 As Integer Dim jinji_flag As Integer Dim jinji_flag1 As Integer Dim dxbian As Integer Dim nbbian As Integer Dim count_sheding As Integer Dim count_shedingnb As Integer Dim strData As String '串口变量 'Dim flag As Integer Dim sj(0 To 4 As Integer Dim sj1(0 To 4 As Integer Dim sj2(0 To 4 As Integer Dim sj3(0 To 4 As Integer Private Sub Command2_Click( MSComm1.PortOpen = False Unload Me End Sub Private Sub Form_Load( count1 = count_sheding count_sheding = 60 dxbian =count_sheding count_shedingnb = 60 nbbian = count_shedingnb Text1.Text = ""Text5.Text = "" ' flag = 0 ' jinji_flag = 1 Text9 = "" '串口初始化 mPort = 1 MSComm1.InputMode = comInputModeBinary '数据通过 Input 属性以文本形式取回。
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三、单片机代码:。
《自动化技术与应用》2007年第26卷第11期94 | T echniques of Automation & Applications 经验交流Technical CommunicationsVB 实现PC 机与单片机(8051)的串行通讯刘艳美, 姜 波(新疆大学电气工程学院 新疆 乌鲁木齐 830008)摘 要:本文主要论述PC机与单片机之间实现异步串行通讯需要解决的问题以及如何利用VB提供的串行通讯控件MSComm来实现PC机与51单片机的通讯。
关键词:MSComm; 串行通讯; 波特率中图分类号:TP368.1 文献标识码:B 文章编号:1003-7241(2007)11-0094-03Implementation of Serial Communication between PC andMicroprocessor by Using VBLIU Yan-mei, JIANG Bo(XinJiang University Electronical Institute,Urumchi 830008 China)Abstract: This paper discusses the asynchronous serial communication between PC and the Microprocessor and the use of VBmodule of MSComm to imdement this serial communication.Key words: MSComm; serial communication; Baud rate收稿日期:2007-03-271 引言PC机具有强大的监控和管理功能,而单片机则具有快速及灵活的控制特点,通过PC机的RS-232串行接口与外部设备进行通讯,是许多测控系统中常用的一种通信解决方案。
本文将论述在VB环境下PC机与单片机之间实现异步串行通讯需要解决的问题并给出其部分通讯程序。
1.你还有为购买昂贵的硬件而烦恼吗?PROTUES仿真帮助你解决这个问题
2.你还在为数据采集而烦恼吗?你还在为上位机控制单片机烦恼吗?
3.这套视频将从头到尾解决你所遇到的上位机数据采集和控制单片机的问题,使你触类旁通。
东电隆重推出VB上位机控制单片机视频教程
地址:
或:
店内搜索:VB上位机通过串口与单片机通信
视频截图1—实现的功能
视频截图2—实现功能界面
视频截图3—单片机数据采集界面
视频截图4—添加网络号
视频截图5—添加元件
视频截图6—概况
视频截图7—编写程序1
视频截图8—编写数据采集程序2
视频截图9—编写程序
视频截图10—采集数据成功
视频截图11—添加串口
视频截图12—编写串口程序
视频截图13—编写串口程序
视频截图14—串口接收数据
视频截图15—串口调试助手控制发光二极管的亮和灭
视频截图16—编写VB上位机软件
视频截图17—编写VB上位机软件
视频截图18—VB代码编写过程
视频截图19—VB采集数据代码
视频截图20—串口选择
视频截图21—二极管亮灭程序
视频截图22—控制亮
视频截图23—控制灭
视频截图24—VB编写的上位机界面视频截图25—虚拟串口
视频截图26—所有资料。