admin 管理员组文章数量: 1086019
2024年3月19日发(作者:数据库课程设计体育器材管理系统)
如何用
VB
实现电脑串口通信
无协技术顾问:陈文斯
什么是串口,为何要学习串口
串口是计算机上一种非常通用设备通信的协
议。大多数台式计算机包含两个基于RS232的串口
(一般用9针公头接出其中一个接口,如图1所示)。
串口同时也是仪器仪表设备通用的通信协议;很多
GPIB兼容的设备也带有RS-232口。鉴于串口应用
如此广泛,大多数单片机也内置了串口。通过串口,
单片机可以很轻松地与其它设备交换信息。
图1
用VB编写串口通信的好处
Windows操作系统由于其友好的用户界面赢得了很多用户的青睐。VisualBasic
即是微软公司基于Windows操作系统的可视化编程平台。有些同学会疑问:我又不
是计算机专业的,学习VB是不是十分痛苦。我告诉你们,非也!要是你对它感兴趣,
很快,你会爱上它的。VB十分容易入门。设计用户界面就像我们平时制作PPT的界
面一样。只需把你需要的控件拖到界面上并调整即可。VB的代码也很通俗易懂。其
实基本上都是调用系统函数的。为抛砖引玉,现举个例子,简要介绍一下VB编写。
(以下的所有例程都是基于VB6.0的,对于较高.net版本,可能有所不同)
任务1:软件界面上有一个文本框和按钮,当点击按钮时,文本框上显示“爱电子,
爱生活。华南理工大学电子爱好者协会”
1、运行VB,在新建程序的界面上画出一个
文本框(textbox)和按钮(command
botton)。如图2所示;
2、双击按钮,出现代码编辑窗口。并在其中
输入代码,如图3所示;
3、运行程序,点击按钮,即可看到如图4
所示的效
果:是不是很简单呢?!
图2
图3
图4
个人建议大一大二的师弟师妹应该学习如何用VB操作串口,特别是学会如何实
现电脑跟单片机的通信。这样子,我们日后设计的电子作品必定增色不少。现在详细
讲解一下如何用VB操作串口。(读者可去图书馆借阅相关图书,掌握串口跟VB的基
础知识)
要用VB操作串口,需要用到Mscomm控件。VB的工具箱默认是没有该控件的。
可通过“工程—>“部件”—>“MicrosoftCommControl6.0”,添加该控件。
在开始使用MSComm控件之前,需要先了解其主要的属性和事件
属性描述
CommPort设置或返回通信端口号
Settings以字符串的形式设置或返回波特率、奇偶校验、数据位和停止位
PortOpen设置或返回通信端口的状态。也可以打开和关闭端口
Input返回和删除接收缓冲区中的字符
Output将字符串写入发送缓冲区
通信事件包含了下面的设置:
常量值描述
ComEvSend1发送缓冲区中的字符数比Sthreshold值低
ComEvReceive2接收到了Rthreshold个字符。持续产生该事件,直到使
用了Input属性删除了接收缓冲区中的数据
ComEvCTS3CTS(ClearToSend)线改变
ComEvDSR4DSR(DataSetReady)线改变。当DSR从1到0改变时,
该事件发生
ComEvCD5CD(CarrierDetect)线改变
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
#include
voidmain()
{
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控件)
PrivateSubForm_Load()‘窗体加载时运行的函数
rt=4‘我用的是USB转串口,设备管理器中看到端口号为4
gs="9600,n,8,1"‘波特率为9600,无检验,8位数据,1位停止位
ode=comInputModeText‘该任务中只用到文本,使用文本模式
hold=1‘串口每收到1字节的数据,即产生接收中断
en=True‘打开串口
EndSub
PrivateSubMSComm1_OnComm()‘串口中断事件入口函数
If(ent=comEvReceive)Then‘如果串口收到数据
=+‘在文本框中予以显示
EndIf
EndSub
运行效果如图5所示:
注意:实际上,单片机的发送数据线上传送了
8B的数据(十六进制表示为:CED26C6F76
65C4E3)。而文本框中的“我love你”占用
了12B的内存。这又是为什么呢?因为VB中
使用的编码为Unicode。每个字符均占用2B。
串口的接收缓冲区中的数据为CED26C6F
7665C4E3。由于将串口的接收模式为文本
模式,这就告诉系统,接收区中的数据均为文
图
5
本。当我们把串口接收的数据直接赋予文本框显示时,系统自动将其转换
为Unicode。也就是说文本框“我love你”的内存内容十六进制表示为:CED26C00
6FC4E3。系统是怎么办到的呢?我们知道,一个中文是用2字节表
示。每个字节最高位均为1.,而英文字母的ASCII码的最高位均为0。当系统发现第
一个数据为CE,其最高位为1,认为这是个非拉丁语系的字符,它会等待后面的一个数
据也就是D2,CED2就是”我”的编码了。收到6C时,发现其最高位为0,认为这是个拉丁
语系的字符,也就是字母“l”,“l”的Unicode为D200。依次类推。同理,要是在按钮
Commmand1的Click事件中输入一下代码:=,运行后,点击
按钮,此时在数据线上传送的也只有8B的数据,这是因为串口自动把字符串中的00
过滤掉。要是dimbytBuffer()asBytebytBuffer==
bytBuffer,此时在数据线上传送的是12B的数据。这是很多初学者比较困惑的。
要是我们要传送的数据有00或者说整个数据流中有各种类型的数据,我们如何
接收并解析呢?这个就需要将电脑端的串口的输入模式设置为二进制。
任务3:接收各种类型数据,并解析
现在我们假设如下情况:我们在任务2中单片机printf函数后加入如下代码:
delayms(10);SBUF=0X02;delayms(10);SBUF=0X00;delayms(10);SBUF=0X01;
delayms(10);SBUF=0X00;(delayms为毫秒延时函数,这里就不列出了,延时是等
待上个数据发送完再继续发送下一个数据)。这时串口数据线上传送的数据为:CED2
6C6F7665C4E302000100,一共12B。我们想这样解析这12B数据:前8B是
字符,后4B是数值。电脑端要在文本框中显示这帧数据。即是“我love你2010”。
我们一起看看VB如何实现这个功能。
PrivateSubForm_Load()
rt=4‘我用的是USB转串口,设备管理器中看到端口号为4
gs="9600,n,8,1"‘波特率为9600,无检验,8位数据,1位停止位
ode=comInputModeBinary‘设置输入模式为二进制
en=True‘打开串口
EndSub
PrivateSubCommand1_Click()‘单片机给电脑发送数据后,点击按钮
DimbytBuffer()AsByte‘定义Byte型数字,用来缓存串口数据,只能为动态的
‘也就是说不能写成dimbytBuffer(11)asbyte
DimiAsInteger
erCount=12Then‘要是串口缓冲区中的数据量为12B
bytBuffer=‘获取串口数据
DimbytText(7)AsByte‘缓存文本
Fori=0To7‘获取文本数据(我love你),一共8B
bytText(i)=bytBuffer(i)
Nexti
=StrConv(bytText,vbUnicode)‘转换数据类型,返回12B的文本
Fori=8To11‘获取2010,并分别转换成字符并在文本框中显示
=+Hex(bytBuffer(i))
Nexti
Else‘防止误操作,要是按下按钮时电脑没收到12B的数据,重发
=Hex(erCount)‘看看到底是收到多少,分析用
erCount=0
EndIf
EndSub
运行效果如图6所示:
‘清空串口
至此,我们基本上分析完了串口的整个操作
流程。希望对大家有所帮助。当然,冰冻一尺,
非一日之寒。要熟练掌握串口,也需要不断练习
和总结。总之,编写VB的串口程序是个有趣的过
图
6
程。通过电脑串口,我们站在微软天才软件工程
师的肩膀上,制作出令人耳目一新的电子作品,更快,更好的实现我们的创意。最后,
希望大家能积极利用无协的各种资源,不断提升自己,同时也尽己所能为无协服务!
版权声明:本文标题:用VB控制单片机串口(正确版) 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://roclinux.cn/p/1710853508a576363.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论