用VB控制电脑串口(正确版)_第1页
用VB控制电脑串口(正确版)_第2页
用VB控制电脑串口(正确版)_第3页
用VB控制电脑串口(正确版)_第4页
用VB控制电脑串口(正确版)_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 如何用VB实现电脑串口通信 无协技术顾问: 陈文斯什么是串口,为何要学习串口串口是计算机上一种非常通用设备通信的协议。大多数台式计算机包含两个基于RS232的串口(一般用9针公头接出其中一个接口,如图1所示)。串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。鉴于串口应用如此广泛,大多数单片机也内置了串口。通过串口,单片机可以很轻松地与其它设备交换信息。图1用VB编写串口通信的好处Windows操作系统由于其友好的用户界面赢得了很多用户的青睐。Visual Basic即是微软公司基于Windows操作系统的可视化编程平台。有些同学会疑问:我又不是计算机专业的

2、,学习VB是不是十分痛苦。我告诉你们,非也!要是你对它感兴趣,很快,你会爱上它的。VB十分容易入门。设计用户界面就像我们平时制作PPT的界面一样。只需把你需要的控件拖到界面上并调整即可。VB的代码也很通俗易懂。其实基本上都是调用系统函数的。为抛砖引玉,现举个例子,简要介绍一下VB编写。(以下的所有例程都是基于VB6.0的,对于较高.net版本,可能有所不同)图2任务1:软件界面上有一个文本框和按钮,当点击按钮时,文本框上显示“爱电子,爱生活。 华南理工大学电子爱好者协会”1、 运行VB,在新建程序的界面上画出一个文本框(textbox)和按钮(command botton)。如图2所示;2、

3、双击按钮,出现代码编辑窗口。并在其中输入代码,如图3所示;3、 运行程序,点击按钮,即可看到如图4所示的效果:是不是很简单呢?! 图3图4个人建议大一大二的师弟师妹应该学习如何用VB操作串口,特别是学会如何实现电脑跟单片机的通信。这样子,我们日后设计的电子作品必定增色不少。现在详细讲解一下如何用VB操作串口。(读者可去图书馆借阅相关图书,掌握串口跟VB的基础知识)要用VB操作串口,需要用到Mscomm控件。VB的工具箱默认是没有该控件的。可通过“工程“部件”“ Microsoft Comm Control 6.0”,添加该控件。在开始使用MSComm控件之前,需要先了解其主要的属性和事件属性

4、描述CommPort 设置或返回通信端口号Settings 以字符串的形式设置或返回波特率、奇偶校验、数据位和停止位PortOpen 设置或返回通信端口的状态。也可以打开和关闭端口Input 返回和删除接收缓冲区中的字符Output 将字符串写入发送缓冲区通信事件包含了下面的设置: 常量 值 描述ComEvSend 1 发送缓冲区中的字符数比Sthreshold值低ComEvReceive 2 接收到了Rthreshold个字符。持续产生该事件,直到使用了Input属性删除了接收缓冲区中的数据ComEvCTS 3 CTS(Clear To Send)线改变ComEvDSR 4 DSR(Data

5、 Set Ready)线改变。当DSR从1到0改变时,该事件发生ComEvCD 5 CD(Carrier Detect)线改变ComEvRing 6 检测到响铃信号ComEvEOF 7 收到了EOF字符(ASCII字符26)以上的事件中,我们一般只用到ComEvSend和ComEvReceive事件。学习过单片机串口通讯的同学都知道,读写串口数据有两种方法:事件驱动(中断)和查询方式。VB方面也是如此。另外,Mscomm控件还有一个重要的属性,那就是InputMode。当其值为0时,为文本模式;为1时,为二进制模式。这两种模式,区别很大。下面我用几个简单实例工程来详解这两种模式的要点和注意事项

6、。任务2:电脑显示单片机发送过来的文本数据单片机端:使用51系列单片机AT89S52。如果单片机与电脑端的RS-232串口通信,需要在其间连接电平转换芯片(如MAX232)。当然,也可以使用USB转串口芯片完成单片机跟电脑的硬件连接。注意,单片机使用11.0592M晶振。有些同学可能纳闷为什么会有这么一个精确到小数点后四位的晶振。我猜想那是为单片机和电脑通信而设计的。电脑的串口波特率不像单片机那样,可以随意设置。电脑端的合法波特率有“110, 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 38400, 56000, 57600, 115200,

7、 128000, 256000”,默认为9600。那我们看看如何编写单片机和电脑的代码来完成这个任务。单片机端源代码:#include /单片机的寄存器说明的头文件#include/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);电脑端源代码:(只

8、需在前面的例子中添加Mscomm控件)Private Sub Form_Load()窗体加载时运行的函数MSComm1.CommPort = 4我用的是USB转串口,设备管理器中看到端口号为4MSComm1.Settings = 9600,n,8,1 波特率为9600,无检验,8位数据,1位停止位MSComm1.InputMode = comInputModeText 该任务中只用到文本,使用文本模式MSComm1.RThreshold = 1串口每收到1字节的数据,即产生接收中断MSComm1.PortOpen = True打开串口End SubPrivate Sub MSComm1_OnC

9、omm()串口中断事件入口函数If (MSComm1.CommEvent = comEvReceive) Then如果串口收到数据 Text1.Text = Text1.Text + MSComm1.Input在文本框中予以显示End IfEnd Sub运行效果如图5所示:图5注意:实际上,单片机的发送数据线上传送了8B的数据(十六进制表示为:CE D2 6C 6F 76 65 C4 E3)。而文本框中的“我love你”占用了12B的内存。这又是为什么呢?因为VB中使用的编码为Unicode。每个字符均占用2B。串口的接收缓冲区中的数据为CE D2 6C 6F 76 65 C4 E3。由于将串

10、口的接收模式为文本模式,这就告诉系统,接收区中的数据均为文本。当我们把串口接收的数据直接赋予文本框显示时,系统自动将其转换为Unicode。也就是说文本框“我love你”的内存内容十六进制表示为:CE D2 6C 00 6F 00 76 00 65 00 C4 E3。系统是怎么办到的呢?我们知道,一个中文是用2字节表示。每个字节最高位均为1.,而英文字母的ASCII码的最高位均为0。当系统发现第一个数据为CE,其最高位为1,认为这是个非拉丁语系的字符,它会等待后面的一个数据也就是D2,CE D2就是”我”的编码了。收到6C时,发现其最高位为0,认为这是个拉丁语系的字符,也就是字母“l”,“l”

11、的Unicode为D2 00。依次类推。同理,要是在按钮Commmand1的Click事件中输入一下代码:MSComm1.output=text1.text,运行后,点击按钮,此时在数据线上传送的也只有8B的数据,这是因为串口自动把字符串中的00过滤掉。要是dim bytBuffer() as Byte bytBuffer=text1.text MSComm1.output= bytBuffer,此时在数据线上传送的是12B的数据。这是很多初学者比较困惑的。要是我们要传送的数据有00或者说整个数据流中有各种类型的数据,我们如何接收并解析呢?这个就需要将电脑端的串口的输入模式设置为二进制。任务3

12、:接收各种类型数据,并解析现在我们假设如下情况:我们在任务2中单片机printf函数后加入如下代码:delayms(10);SBUF=0X02; delayms(10);SBUF=0X00; delayms(10);SBUF=0X01; delayms(10);SBUF=0X00;(delayms为毫秒延时函数,这里就不列出了,延时是等待上个数据发送完再继续发送下一个数据)。这时串口数据线上传送的数据为:CE D2 6C 6F 76 65 C4 E3 02 00 01 00,一共12B。我们想这样解析这12B数据:前8B是字符,后4B是数值。电脑端要在文本框中显示这帧数据。即是“我love你2

13、010”。我们一起看看VB如何实现这个功能。Private Sub Form_Load()MSComm1.CommPort = 4 我用的是USB转串口,设备管理器中看到端口号为4MSComm1.Settings = 9600,n,8,1 波特率为9600,无检验,8位数据,1位停止位MSComm1.InputMode = comInputModeBinary设置输入模式为二进制MSComm1.PortOpen = True打开串口End SubPrivate Sub Command1_Click()单片机给电脑发送数据后,点击按钮Dim bytBuffer() As Byte 定义Byte型

14、数字,用来缓存串口数据,只能为动态的也就是说不能写成dim bytBuffer(11) as byteDim i As IntegerIf MSComm1.InBufferCount = 12 Then要是串口缓冲区中的数据量为12B bytBuffer = MSComm1.Input获取串口数据 Dim bytText(7) As Byte缓存文本 For i = 0 To 7获取文本数据(我love你),一共8B bytText(i) = bytBuffer(i) Next i Text1.Text = StrConv(bytText, vbUnicode)转换数据类型,返回12B的文本 For i = 8 To 11获取2010,并分别转换成字符并在文本框中显示 Text1.Text = Text1.Text + Hex(bytBuffer(i) Next iElse防止误操作,要是按下按钮时电脑没收到12B的数据,重发 Text1.Text = Hex(MSComm1.InBufferCount)看看到底是收到多少,分析用 MSC

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论