用VB控制单片机串口(正确版)
- 格式:pdf
- 大小:314.59 KB
- 文档页数:5
VB环境下实现PC机与单片机的串行通讯随着科技的不断发展,PC机和单片机的联系日益密切,特别是在嵌入式系统领域中,单片机已经成为了必不可少的重要组成部分。
而如何实现PC机和单片机之间的通讯,是一项必须要掌握的技能。
本篇文章主要介绍如何运用VB环境下的串口编程,实现PC机与单片机的串行通讯。
一、概述通讯技术日新月异,各种新的通讯技术层出不穷。
而在普通家庭却使用最为广泛的通讯技术,还是传统的串口通讯。
使用传统的串口通讯,可以实现PC机与单片机之间的数据交互,可靠性高,兼容性强,使用便捷。
要实现PC机与单片机之间的串行通讯,需要掌握两个技能:单片机串行通讯的编程和VB环境下串口编程。
二、单片机串行通讯的编程单片机串行通讯主要是通过寄存器和中断实现的。
单片机通过一个IO口与电脑之间建立一个简单的通讯接口,PC机通过该接口向单片机发送数据,单片机接收到数据,就可以通过该接口把数据返回给PC机。
单片机串口通讯编程的内容主要包括串口数据位、停止位、校验位、波特率等信息,这些信息需要设置在单片机的寄存器中。
同时,还要设置中断信息,以免程序在不接收数据时死等。
三、VB环境下串口编程VB环境下串口编程的关键是掌握控件的使用。
实际上,VB环境下的串口编程非常简单,只需要使用微软提供的MSComm控件就可以实现。
通过MSComm控件的事件和方法,可以轻松地实现数据的读取、发送、接收等功能。
需要注意的是,MSComm控件的BaudRate属性需要与单片机编写的程序的波特率一致,不然可能会出现通讯故障。
四、如何实现串口通讯首先需要硬件上建立好通讯接口。
通常情况下,USB串口转换器和单片机板子都会配套出售,只需要把两者插在一起即可。
其次需要编写单片机的串口通讯程序。
单片机数字口与串口的通讯,就是把串口接到单片机的数字口中,通过串口向外发送数据。
因此,编写单片机的串口通讯程序,需要设置停止位、数据位、奇偶校验位、波特率等参数。
关于使用VB 与单片机通信一、电脑和单片机通信(以MCS51 为例),必须进行电平转换,推荐使用单5V 供电的MAX232CPE ,只需简单地外接几个电容就可实现,具体电路可参考《单片机原理及接口技术》(P382 )。
二、使用VB 与单片机通信,可以利用VB 提供的MSCOMM 控件。
1 、如果工具箱中没有MSComm 控件,其外形是一个小电话,则需要添加该控件。
选择“Project ”菜单的Commponent 项,弹出一个对话框,在控件列表中找到Mircosoft Coun confrol 6.0 ,点击左边的方框,确定即可。
2 、MSCOMM 控件的主要属性。
( 1 )CommPort 设置或返回通讯端口号。
格式为:mPort [ =PortNumber] 。
在设计时,PortNumber 可以设置成从1 到16 的任何数(缺省值为1 )。
但是如果用PorOpen 属性打一个并不存在的端口时,就会产生错误。
还需注意的是必须在打一开端口之前设置CommPort 属性。
例如:mPort=2, 即设置当前通信串口为COM2 口。
( 2 )Settings 以字符串形式设置或返回波特率、奇偶校验、数据位和停止位。
格式为:MSComm.Settings[=ParaString] 。
ParaString 是一个包含四部分的字符串。
第一部份为波特率,其可选值为110 ,300 ,600 ,1200 ,2400 ,9600 ,14400 ,19200 ,28800 。
第二部份为奇偶校验,N 表示不校验,E 表示偶校验,O 表示奇校验,S 表示空格检验,M 表示符号校验。
第三部份为数据位位数,其可选值为4 , 5 ,6 ,7 ,8 ,。
第四部份为停止位位数,其可选值1 ,1.5 ,2 。
Settings 属性的缺省值为“9600 ,N ,8 ,1 ”。
(3 )handshaking 设置或返回硬件握手协议,指的是PC 机与Modem 之间为了控制流通而约定的内部协议。
VB中串口通讯的实现在VB中实现串口通讯需要借助于SerialPort类,该类提供了一系列方法和属性用于串口的配置和通讯操作。
接下来,定义一个SerialPort对象和一个字节数组,用于接收和发送数据。
在窗体加载事件中初始化SerialPort对象,并设置串口的一些属性,如波特率、数据位、校验位等,根据实际需求进行配置。
还可以设置数据接收和发送的事件处理函数。
例如,下面的代码演示了如何配置串口:```vbImports System.IO.PortsPublic Class Form1Dim serialPort As New SerialPortDim receiveBuffer(255) As BytePrivate Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load'配置串口属性serialPort.PortName = "COM1"serialPort.BaudRate = 9600serialPort.DataBits = 8serialPort.Parity = Parity.NoneserialPort.StopBits = StopBits.One'数据接收事件处理函数AddHandler serialPort.DataReceived, AddressOfSerialPort_DataReceived'打开串口serialPort.OpenEnd SubPrivate Sub SerialPort_DataReceived(sender As Object, e As SerialDataReceivedEventArgs)'接收数据Dim bytesToRead As Integer = serialPort.BytesToReadDim bytesRead As Integer = serialPort.Read(receiveBuffer, 0, bytesToRead)'处理接收到的数据If bytesRead > 0 ThenDim receivedData As String =Encoding.ASCII.GetString(receiveBuffer, 0, bytesRead) '显示接收到的数据UpdateReceivedData(receivedData)End IfEnd SubPrivate Sub btnSend_Click(sender As Object, e As EventArgs) Handles btnSend.Click'发送数据Dim sendData As String = txtSendData.TextDim sendBuffer As Byte( = Encoding.ASCII.GetBytes(sendData) serialPort.Write(sendBuffer, 0, sendBuffer.Length)'清空发送框txtSendData.Text = ""End SubPrivate Sub UpdateReceivedData(data As String)'更新接收数据的显示If Me.InvokeRequired Then ' 跨线程调用控件Me.Invoke(Sub( UpdateReceivedData(data))ElselblReceivedData.Text = dataEnd IfEnd SubEnd Class```在上述代码中,我们主要关注Form1_Load事件处理函数和btnSend_Click事件处理函数。
如何用VB 实现电脑串口通信无协技术顾问: 陈文斯什么是串口,为何要学习串口串口是计算机上一种非常通用设备通信的协议。
大多数台式计算机包含两个基于RS232的串口(一般用9针公头接出其中一个接口,如图1所示)。
串口同时也是仪器仪表设备通用的通信协议;很多GPIB 兼容的设备也带有RS-232口。
鉴于串口应用如此广泛,大多数单片机也内置了串口。
通过串口,单片机可以很轻松地与其它设备交换信息。
用VB 编写串口通信的好处Windows 操作系统由于其友好的用户界面赢得了很多用户的青睐。
Visual Basic 即是微软公司基于Windows 操作系统的可视化编程平台。
有些同学会疑问:我又不是计算机专业的,学习VB 是不是十分痛苦。
我告诉你们,非也!要是你对它感兴趣,很快,你会爱上它的。
VB 十分容易入门。
设计用户界面就像我们平时制作PPT 的界面一样。
只需把你需要的控件拖到界面上并调整即可。
VB 的代码也很通俗易懂。
其实基本上都是调用系统函数的。
为抛砖引玉,现举个例子,简要介绍一下VB 编写。
(以下的所有例程都是基于VB6.0的,对于较高.net 版本,可能有所不同)任务1:软件界面上有一个文本框和按钮,当点击按钮时,文本框上显示“爱电子,爱生活。
华南理工大学电子爱好者协会”1、 运行VB ,在新建程序的界面上画出一个文本框(textbox )和按钮(commandbotton )。
如图2所示;2、 双击按钮,出现代码编辑窗口。
并在其中输入代码,如图3所示;3、 运行程序,点击按钮,即可看到如图4所示的效果:是不是很简单呢?!图2图3图1图4个人建议大一大二的师弟师妹应该学习如何用VB操作串口,特别是学会如何实现电脑跟单片机的通信。
这样子,我们日后设计的电子作品必定增色不少。
现在详细讲解一下如何用VB操作串口。
(读者可去图书馆借阅相关图书,掌握串口跟VB的基础知识)要用VB操作串口,需要用到Mscomm控件。
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三、单片机代码:。
Option ExplicitDim Text6change As StringDim a As StringDim j As IntegerPrivate Sub Form_Load()If MSComm1.PortOpen = True ThenMSComm1.PortOpen = FalseEnd IfForm1.Picture = LoadPicture("")BSE1.SchemeStyle = 0BSE1.EndSubClassingBSE1.InitSubClassingCombo1.AddItem "COM1"Combo1.AddItem "COM2"Combo1.AddItem "COM3"Combo1.AddItem "COM4"Combo1.AddItem "COM5"Combo1.AddItem "COM6"Combo1.AddItem "COM7"Combo1.AddItem "COM8"Combo1.AddItem "COM9"Combo1.AddItem "COM10"Combo1.AddItem "COM11"Combo1.AddItem "COM12"Combo1.AddItem "COM13"Combo1.AddItem "COM14"Combo1.AddItem "COM15"Combo1.AddItem "COM16"Combo1.ListIndex = 2MSComm1.Settings = "2400,N,8,1" '2400波特率,无校验,8位数据位,1位停止位MSComm1.RThreshold = 1 '设置 Rthreshold 为 1,接收缓冲区收到每一个字符都会使 MSComm 控件产生 OnComm 事件。
串口通信是MCU跟PC通信经常用到的一种通信方式,做界面、写上位机程序的编程语言、编译环境有不少,诸如VB、VC++,Delphi、LABVIEW等等,不过无论黑猫还是白猫,能够抓到老鼠的就是好猫,用VB无疑是最快速最简便的,实现的功能也足够强大,足以满足我们的基本需要了。
我最近用VB写出了一个用于数据采集的串口上位机程序,实现数据的接收和实时绘图,这里和大家分享一下,让大家也体验一下单片机和PC通信的乐趣。
整个程序只需要不到30行程序,我将会给这30行程序加上最为详备的注释,这样即使你从未使用VB制作过上位机程序,也能照猫画虎的编写出属于自己的上位机程序。
一,制定设计思路首先,我们要制定一下自己的串口通讯协议,为了方便设计,通讯协议中将采用字符型数据(遵循ASCII字符集)进行传输,一共5个字节数据,下位机按照从第一字节到第五字节的顺序以1 符号位2 百位3 十位4 个位注释:1,符号符,+(2B)或—(2D),表示数据的正负2,3,4,百位,十位,和个位数字5,结束符,用大写字母A(41)表示接着,我们就要明确设计思路了,这个程序的设计将采用Microsoft Visual Basic 6.0(以下简称VB6.0)作为m,通过编译环境,运用串口通讯控件MSCom计时器控件实现以查询方式编写的串口数据的接收和实时绘图。
二,程序界面设计(1)创建一个标准EXE工程:启动VB6.0,在自动弹出的“新建工程”窗口中单击“标准EXE”图标,然后单击“打开”按钮即可创建一个标准EXE工程。
将弹出的窗体的Caption属性设置为串口通讯与实时绘图程序。
[attachment=1364699](1)添加串口通信控件MSComm:VB的串口通信控件MSComm并不会主动出现在工具箱中,当我们需要MSComm控件时,首先要把它加入工具箱中,选择“工程”菜单下的“部件...”子菜单,在弹出的“部件”对话框中,在“控件”选项卡属性中选中“Microsoft Comm Control 6.0”,单击“确定”按钮后,在工具箱中就出现了一个形似电话的图标,这就是MSComm控件,选择MSComm控件的图标,将它添加到适当位置,采用默认名称MSComm1。
利用VB实现PC机与多单片机通讯摘要在98下利用的串行通讯控件可实现机与多单片机之间的通讯。
采用定时器控制大大加快了自动化进程,克服了往多握手协议造成的通讯速度缓慢的缺点。
本文以1016单片机为例,详细介绍了机与单片机之间的串行通讯、数据的发送和接收。
关键词通讯属性事件前言在采用以机为控制中心的数据采集自动化控制系统中,通常需要单片机采集数据,然后用异步串行通讯方式传给机,对单片机进行定时控制,需要多个单片机协同工作。
如果系统不很复杂,可通过定时器控件控制收发过程,在必要的地方自动接收装置,使定时控制和通讯过程完美地结合起来。
这样,可以免去握手协议的繁琐过程,简化编程,提高速度。
具有面向对象的设计方法,友好的用户界面,简单方便的串行通讯和实用性强等优点,无论借用其他语言就可以开发出优秀的控制系统通讯软件。
本文介绍在98环境下如何利用来实现机与多个1016单片机之间的串行通讯。
环境下通讯程序的设计提供了串行端口控制来为应用程序提供串行通讯。
该控件屏蔽了通信过程中的底层操作,程序员可以设置、监视控件的属性和事件,结合控件即可完成对串行口的初始化和数据的输入输出工作。
控件的主要属性如下1设置并返回通讯端口号。
端口号可以设置为1~16的任何数,如=2表示设置当前通讯端口为2。
2设置并返回波特率、奇偶校验、数据位、停止位。
格式为=。
是一个包含四部分的字符串第一部分为波特率;第二部分为奇偶校验,表示不校验,表示符号校验,表示偶校验,表示奇校验,表示空格校验;第三部分为数据位数,其可选值为4,5,6,7,8;第四部分为停止位位数,其可选值为1,15,2。
属性的缺省值为9600,,8,1。
3设置并返回通讯端口的状态,也可以打开和关闭端口。
4从接收缓冲区返回和删除字符。
该属性在运行时为只读。
5设置并返回每次属性从接收缓冲区中读取的字符数。
属性的缺省值为0。
设置为0时,将读取接收缓冲区的全部字符。
6向传送缓冲区写数据。
用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], 马风格;胡书屏;王敏
因版权原因,仅展示原文概要,查看原文内容请购买。
用VB实现单片机和计算机的串口通信//ex99 单片机数据发送程序#include //包含单片机寄存器的头文件/*****************************************************函数功能:向PC 发送一个字节数据***************************************************/void Send(unsigned char dat){ SBUF=dat; while(TI==0) ; TI=0;}/*****************************************************函数功能:延时1ms(3j+2)i=(3乘以33+2) 乘以10=1010(微秒),可以认为是1毫秒***************************************************/void delay1ms(){ unsigned char i,j; for(i=0;i<10;i++) for(j=0;j<33;j++) ;}/*****************************************************函数功能:延时若干毫秒***************************************************/void delaynms(unsigned char x){unsigned char i; for(i=0;i<x;i++) delay1ms();}/*****************************************************函数功能:主函数***************************************************/void main(void){ unsigned char i; TMOD=0x20; //定时器T1工作于方式2 TH1=0xfd; //根据规定给定时器T1赋初值TL1=0xfd; //根据规定给定时器T1赋初值PCON=0x00; //波特率9600 TR1=1; //启动定时器t1 SCON=0x40; //串口工作方式1 while(1) { for(i=0;i<200;i++) //模拟检测数据{ Send(i); //发送数据i delaynms(100); //100ms发送一次检测数据} }}tips:感谢大家的阅读,本文由我司收集整编。
如何用VB实现电脑串口通信无协技术顾问:陈文斯什么是串口,为何要学习串口串口是计算机上一种非常通用设备通信的协议。
大多数台式计算机包含两个基于RS232的串口(一般用9针公头接出其中一个接口,如图1所示)。
串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。
鉴于串口应用如此广泛,大多数单片机也内置了串口。
通过串口,单片机可以很轻松地与其它设备交换信息。
用VB编写串口通信的好处Windows操作系统由于其友好的用户界面赢得了很多用户的青睐。
Visual Basic 即是微软公司基于Windows操作系统的可视化编程平台。
有些同学会疑问:我又不是计算机专业的,学习VB是不是十分痛苦。
我告诉你们,非也!要是你对它感兴趣,很快,你会爱上它的。
VB十分容易入门。
设计用户界面就像我们平时制作PPT的界面一样。
只需把你需要的控件拖到界面上并调整即可。
VB的代码也很通俗易懂。
其实基本上都是调用系统函数的。
为抛砖引玉,现举个例子,简要介绍一下VB编写。
(以下的所有例程都是基于VB6.0的,对于较高.net版本,可能有所不同)任务1:软件界面上有一个文本框和按钮,当点击按钮时,文本框上显示“爱电子,爱生活。
华南理工大学电子爱好者协会”1、运行VB,在新建程序的界面上画出一个文本框(textbox)和按钮(command botton)。
如图2所示;2、双击按钮,出现代码编辑窗口。
并在其中输入代码,如图3所示;3、运行程序,点击按钮,即可看到如图4所示的效果:是不是很简单呢?!图2图3图1图4个人建议大一大二的师弟师妹应该学习如何用VB操作串口,特别是学会如何实现电脑跟单片机的通信。
这样子,我们日后设计的电子作品必定增色不少。
现在详细讲解一下如何用VB操作串口。
(读者可去图书馆借阅相关图书,掌握串口跟VB的基础知识)要用VB操作串口,需要用到Mscomm控件。
VB的工具箱默认是没有该控件的。
可通过“工程—>“部件”—>“Microsoft Comm Control6.0”,添加该控件。
在开始使用MSComm控件之前,需要先了解其主要的属性和事件属性描述CommPort设置或返回通信端口号Settings以字符串的形式设置或返回波特率、奇偶校验、数据位和停止位PortOpen设置或返回通信端口的状态。
也可以打开和关闭端口Input返回和删除接收缓冲区中的字符Output将字符串写入发送缓冲区通信事件包含了下面的设置:常量值描述ComEvSend1发送缓冲区中的字符数比Sthreshold值低ComEvReceive2接收到了Rthreshold个字符。
持续产生该事件,直到使用了Input属性删除了接收缓冲区中的数据ComEvCTS3CTS(Clear To Send)线改变ComEvDSR4DSR(Data Set Ready)线改变。
当DSR从1到0改变时,该事件发生ComEvCD5CD(Carrier Detect)线改变ComEvRing6检测到响铃信号ComEvEOF7收到了EOF字符(ASCII字符26)以上的事件中,我们一般只用到ComEvSend和ComEvReceive事件。
学习过单片机串口通讯的同学都知道,读写串口数据有两种方法:事件驱动(中断)和查询方式。
VB方面也是如此。
另外,Mscomm控件还有一个重要的属性,那就是InputMode。
当其值为0时,为文本模式;为1时,为二进制模式。
这两种模式,区别很大。
下面我用几个简单实例工程来详解这两种模式的要点和注意事项。
任务2:电脑显示单片机发送过来的文本数据单片机端:使用51系列单片机AT89S52。
如果单片机与电脑端的RS-232串口通信,需要在其间连接电平转换芯片(如MAX232)。
当然,也可以使用USB转串口芯片完成单片机跟电脑的硬件连接。
注意,单片机使用11.0592M晶振。
有些同学可能纳闷为什么会有这么一个精确到小数点后四位的晶振。
我猜想那是为单片机和电脑通信而设计的。
电脑的串口波特率不像单片机那样,可以随意设置。
电脑端的合法波特率有“110,300,600,1200,2400, 4800,9600,14400,19200,38400,56000,57600,115200,128000,256000”,默认为9600。
那我们看看如何编写单片机和电脑的代码来完成这个任务。
单片机端源代码:#include<reg52.h>//单片机的寄存器说明的头文件#include<stdio.h>//printf函数的头文件void main(){SCON=0X40;//串口:方式1TMOD=0X20;//定时器1:模式2,8位自动重装模式,用于产生波特率TH1=0XFD;//初值设定波特率为9600,晶振:11.0592MTL1=TH1;EA=1;//开启总允许开关TR1=1;//开启定时器1printf("%s","我love你");//调用printf函数,将文本从串口输出while(1);}电脑端源代码:(只需在前面的例子中添加Mscomm控件)Private Sub Form_Load()‘窗体加载时运行的函数mPort=4‘我用的是USB转串口,设备管理器中看到端口号为4 MSComm1.Settings="9600,n,8,1"‘波特率为9600,无检验,8位数据,1位停止位MSComm1.InputMode=comInputModeText‘该任务中只用到文本,使用文本模式MSComm1.RThreshold=1‘串口每收到1字节的数据,即产生接收中断MSComm1.PortOpen=True‘打开串口End SubPrivate Sub MSComm1_OnComm()‘串口中断事件入口函数If(mEvent=comEvReceive)Then‘如果串口收到数据Text1.Text=Text1.Text+MSComm1.Input‘在文本框中予以显示End IfEnd Sub运行效果如图5所示:注意:实际上,单片机的发送数据线上传送了8B的数据(十六进制表示为:CE D26C6F7665C4E3)。
而文本框中的“我love你”占用了12B的内存。
这又是为什么呢?因为VB中使用的编码为Unicode。
每个字符均占用2B。
串口的接收缓冲区中的数据为CE D26C6F7665C4E3。
由于将串口的接收模式为文本模式,这就告诉系统,接收区中的数据均为文图5本。
当我们把串口接收的数据直接赋予文本框显示时,系统自动将其转换为Unicode。
也就是说文本框“我love你”的内存内容十六进制表示为:CE D26C00 6F0076006500C4E3。
系统是怎么办到的呢?我们知道,一个中文是用2字节表示。
每个字节最高位均为1.,而英文字母的ASCII码的最高位均为0。
当系统发现第一个数据为CE,其最高位为1,认为这是个非拉丁语系的字符,它会等待后面的一个数据也就是D2,CE D2就是”我”的编码了。
收到6C时,发现其最高位为0,认为这是个拉丁语系的字符,也就是字母“l”,“l”的Unicode为D200。
依次类推。
同理,要是在按钮Commmand1的Click事件中输入一下代码:MSComm1.output=text1.text,运行后,点击按钮,此时在数据线上传送的也只有8B的数据,这是因为串口自动把字符串中的00过滤掉。
要是dim bytBuffer()as Byte bytBuffer=text1.text MSComm1.output= bytBuffer,此时在数据线上传送的是12B的数据。
这是很多初学者比较困惑的。
要是我们要传送的数据有00或者说整个数据流中有各种类型的数据,我们如何接收并解析呢?这个就需要将电脑端的串口的输入模式设置为二进制。
任务3:接收各种类型数据,并解析现在我们假设如下情况:我们在任务2中单片机printf函数后加入如下代码:delayms(10);SBUF=0X02;delayms(10);SBUF=0X00;delayms(10);SBUF=0X01; delayms(10);SBUF=0X00;(delayms为毫秒延时函数,这里就不列出了,延时是等待上个数据发送完再继续发送下一个数据)。
这时串口数据线上传送的数据为:CE D2 6C6F7665C4E302000100,一共12B。
我们想这样解析这12B数据:前8B是字符,后4B是数值。
电脑端要在文本框中显示这帧数据。
即是“我love你2010”。
我们一起看看VB如何实现这个功能。
Private Sub Form_Load()mPort=4‘我用的是USB转串口,设备管理器中看到端口号为4 MSComm1.Settings="9600,n,8,1"‘波特率为9600,无检验,8位数据,1位停止位MSComm1.InputMode=comInputModeBinary‘设置输入模式为二进制MSComm1.PortOpen=True‘打开串口End SubPrivate Sub Command1_Click()‘单片机给电脑发送数据后,点击按钮Dim bytBuffer()As Byte‘定义Byte型数字,用来缓存串口数据,只能为动态的‘也就是说不能写成dim bytBuffer(11)as byte Dim i As IntegerIf MSComm1.InBufferCount=12Then‘要是串口缓冲区中的数据量为12B bytBuffer=MSComm1.Input‘获取串口数据Dim bytText(7)As Byte‘缓存文本For i=0To7‘获取文本数据(我love你),一共8B bytText(i)=bytBuffer(i)Next iText1.Text=StrConv(bytText,vbUnicode)‘转换数据类型,返回12B的文本For i=8To11‘获取2010,并分别转换成字符并在文本框中显示Text1.Text=Text1.Text+Hex(bytBuffer(i))Next iElse‘防止误操作,要是按下按钮时电脑没收到12B的数据,重发Text1.Text=Hex(MSComm1.InBufferCount)‘看看到底是收到多少,分析用MSComm1.InBufferCount=0‘清空串口End IfEnd Sub运行效果如图6所示:至此,我们基本上分析完了串口的整个操作流程。
希望对大家有所帮助。
当然,冰冻一尺,非一日之寒。