首页 用VB控制电脑串口(正确版)

用VB控制电脑串口(正确版)

举报
开通vip

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

用VB控制电脑串口(正确版)
如何用VB实现电脑串口通信 无协技术顾问: 陈文斯 什么是串口,为何要学习串口 串口是计算机上一种非常通用设备通信的 协议 离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载 。大多数台式计算机包含两个基于RS232的串口(一般用9针公头接出其中一个接口,如图1所示)。串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。鉴于串口应用如此广泛,大多数单片机也内置了串口。通过串口,单片机可以很轻松地与其它设备交换信息。 用VB编写串口通信的好处 Windows操作系统由于其友好的用户界面赢得了很多用户的青睐。Visual Basic即是微软公司基于Windows操作系统的可视化编程平台。有些同学会疑问:我又不是计算机专业的,学习VB是不是十分痛苦。我告诉你们,非也!要是你对它感兴趣,很快,你会爱上它的。VB十分容易入门。设计用户界面就像我们平时制作 ppt 关于艾滋病ppt课件精益管理ppt下载地图下载ppt可编辑假如ppt教学课件下载triz基础知识ppt 的界面一样。只需把你需要的控件拖到界面上并调整即可。VB的代码也很通俗易懂。其实基本上都是调用系统函数的。为抛砖引玉,现举个例子,简要介绍一下VB编写。(以下的所有例程都是基于VB6.0的,对于较高.net版本,可能有所不同) 任务1:软件界面上有一个文本框和按钮,当点击按钮时,文本框上显示“爱电子,爱生活。 华南理工大学电子爱好者协会” 1、​ 运行VB,在新建程序的界面上画出一个文本框(textbox)和按钮(command botton)。如图2所示; 2、​ 双击按钮,出现代码编辑窗口。并在其中输入代码,如图3所示; 3、​ 运行程序,点击按钮,即可看到如图4所示的效 果:是不是很简单呢?! 个人建议大一大二的师弟师妹应该学习如何用VB操作串口,特别是学会如何实现电脑跟单片机的通信。这样子,我们日后设计的电子作品必定增色不少。现在详细讲解一下如何用VB操作串口。(读者可去图书馆借阅相关图书,掌握串口跟VB的基础知识) 要用VB操作串口,需要用到Mscomm控件。VB的工具箱默认是没有该控件的。可通过“ 工程 路基工程安全技术交底工程项目施工成本控制工程量增项单年度零星工程技术标正投影法基本原理 —>“部件”—>“ Microsoft Comm Control 6.0”,添加该控件。 在开始使用MSComm控件之前,需要先了解其主要的属性和事件 属性 描述 CommPort 设置或返回通信端口号 Settings 以字符串的形式设置或返回波特率、奇偶校验、数据位和停止位 PortOpen 设置或返回通信端口的状态。也可以打开和关闭端口 Input 返回和删除接收缓冲区中的字符 Output 将字符串写入发送缓冲区 通信事件包含了下面的设置: 常量 值 描述 ComEvSend 1 发送缓冲区中的字符数比Sthreshold值低 ComEvReceive 2 接收到了Rthreshold个字符。持续产生该事件,直到使用了Input属性删除了接收缓冲区中的数据 ComEvCTS 3 CTS(Clear To Send)线改变 ComEvDSR 4 DSR(Data Set Ready)线改变。当DSR从1到0改变时,该事件发生 ComEvCD 5 CD(Carrier Detect)线改变 ComEvRing 6 检测到响铃信号 ComEvEOF 7 收到了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 //单片机的寄存器说明的头文件 #include //printf函数的头文件 void main() { SCON=0X40;//串口:方式1 TMOD=0X20;//定时器1:模式2,8位自动重装模式,用于产生波特率 TH1=0XFD; //初值设定 波特率为9600,晶振:11.0592M TL1=TH1; EA=1; //开启总允许开关 TR1=1; //开启定时器1 printf ("%s ","我love你"); //调用printf函数,将文本从串口输出 while(1); } 电脑端源代码:(只需在前面的例子中添加Mscomm控件) Private Sub Form_Load() ‘窗体加载时运行的函数 MSComm1.CommPort = 4 ‘我用的是USB转串口,设备管理器中看到端口号为4 MSComm1.Settings = "9600,n,8,1" ‘波特率为9600,无检验,8位数据,1位停止位 MSComm1.InputMode = comInputModeText ‘该任务中只用到文本,使用文本模式 MSComm1.RThreshold = 1 ‘串口每收到1字节的数据,即产生接收中断 MSComm1.PortOpen = True ‘打开串口 End Sub Private Sub MSComm1_OnComm() ‘串口中断事件入口函数 If (MSComm1.CommEvent = comEvReceive) Then ‘如果串口收到数据 Text1.Text = Text1.Text + MSComm1.Input ‘在文本框中予以显示 End If End Sub 运行效果如图5所示: 注意:实际上,单片机的发送数据线上传送了8B的数据(十六进制表示为:CE D2 6C 6F 76 65 C4 E3)。而文本框中的“我love你”占用了12B的内存。这又是为什么呢?因为VB中使用的编码为Unicode。每个字符均占用2B。串口的接收缓冲区中的数据为CE D2 6C 6F 76 65 C4 E3。由于将串口的接收模式为文本模式,这就告诉系统,接收区中的数据均为文本。当我们把串口接收的数据直接赋予文本框显示时,系统自动将其转换为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”的Unicode为D2 00。依次类推。同理,要是在按钮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 6C 6F 76 65 C4 E3 02 00 01 00,一共12B。我们想这样解析这12B数据:前8B是字符,后4B是数值。电脑端要在文本框中显示这帧数据。即是“我love你2010”。 我们一起看看VB如何实现这个功能。 Private Sub Form_Load() MSComm1.CommPort = 4 ‘我用的是USB转串口,设备管理器中看到端口号为4 MSComm1.Settings = "9600,n,8,1" ‘波特率为9600,无检验,8位数据,1位停止位 MSComm1.InputMode = comInputModeBinary ‘设置输入模式为二进制 MSComm1.PortOpen = True ‘打开串口 End Sub Private Sub Command1_Click() ‘单片机给电脑发送数据后,点击按钮 Dim bytBuffer() As Byte ‘定义Byte型数字,用来缓存串口数据,只能为动态的 ‘也就是说不能写成dim bytBuffer(11) as byte Dim i As Integer If 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 i Else ‘防止误操作,要是按下按钮时电脑没收到12B的数据,重发 Text1.Text = Hex(MSComm1.InBufferCount) ‘看看到底是收到多少,分析用 MSComm1.InBufferCount = 0 ‘清空串口 End If End Sub 运行效果如图6所示: 至此,我们基本上分析完了串口的整个操作流程。希望对大家有所帮助。当然,冰冻一尺,非一日之寒。要熟练掌握串口,也需要不断练习和总结。总之,编写VB的串口程序是个有趣的过程。通过电脑串口,我们站在微软天才软件工程师的肩膀上,制作出令人耳目一新的电子作品,更快,更好的实现我们的创意。最后,希望大家能积极利用无协的各种资源,不断提升自己,同时也尽己所能为无协服务!
本文档为【用VB控制电脑串口(正确版)】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_043512
暂无简介~
格式:doc
大小:149KB
软件:Word
页数:5
分类:生产制造
上传时间:2011-03-25
浏览量:29