您现在所在的是:

工控软件

回帖:4个,阅读:1692 [上一页] [1] [下一页]
5264
jczwfy 版主
文章数:2260
年度积分:56
历史总积分:5264
注册时间:2005/5/7
发站内信
09工控人生征文
发表于:2009/6/29 20:28:21
#0楼
一、概述
   串口通讯作为一种古老而又灵活的通讯方式,被广泛地应用于pc间的通讯以及pc和单片机之间的通讯之中。 提到串口通讯的编程,人们往往立刻想到c、汇编等对系统底层操作支持较好的编程语言以及大串繁琐的代码。
 实际上,只要我们借助相关activex控件的帮助,即使是在底层操作一向不被人看好的vb中,一样能够实现串口通 讯,甚至其实现方法和c、汇编相比,要更加快捷方便。下面,笔者就介绍一下在vb中实现串口通讯的方法。
   在visual basic中有一个名为microsoft communication control(简称mscomm)的通讯控件。我们只要通 过对此控件的属性和事件进行相应编程操作,就可以轻松地实现串口通讯。下面,笔者就简要地介绍一下
mscomm控件的使用方法。
二、mscomm控件的主要属性、事件
1、mscomm的属性
   由于mscomm控件属性很多,在此笔者仅介绍与实现串口通讯密切相关的核心属性。
   commport:设置通讯所占用的串口号。如设成1(默认值),表示对com1进行操作。
   setting:对串口通讯的相关参数。包括串口通讯的比特率,奇偶校验,数据位长度、停止位等。其默认值 是“9600,n,8,1”,表示串口比特率是9600bit/s,不作奇偶校验,8位数据位,1个停止位。
   portopen:设置串口状态,值为true时打开串口,值为false时关闭串口。
   input:从输入寄存器读取数据,返回值为从串口读取的数据内容,同时输入寄存器将被清空。
   ouput:发送数据到输出寄存器。
   inbuffercount:设置输入寄存器所存储的字符数,当将其值设为0时,则输入寄存器将被清空。
  inputmode:设置从输入寄存器中读取数据的形式。若值为0,则表示以文本形式读取;值为1,则表示以 二进制形式读取。
   outbuffercount:设置输出寄存器所存储的字符数,当将其值设为0时,则输出寄存器将被清空。
   rthreshold:设置在mscomm控件设置commevent属性为comevreceive并产生oncomm事件之前要接受的字符 数。
   commevent属性:返回最近的通讯事件或错误。通过对它具体属性值的查询,我们就可以获得通讯事件和通 讯错误的完整信息。当其值是comevreceive时表示接收到数据。
2、mscomm的事件
   除了公共事件之外,mscomm只有一个oncomm事件。当commevent属性值变化时将发生oncomm事件,指示发生 一个通讯事件或错误。当我们设置rtheshold属性值为0时,将使得捕获comevreceive事件无效。
三、串口通讯编程实例
   在完成了对mscomm控件的简要介绍之后,笔者就以实际程序为例,介绍一下串口通讯的具体实现方法。
1、pc机间的串口通讯
 (1)、实现方法:
  a、新建一个窗体,在上面放两个text控件、两个commandbutton控件和两个label控件(如图1.bmp所示)。
具体见下表:
控件类型           名称            caption属性          作用
-------------------------------------------------------------------------------
text                text1            -------          输入所要发送的信息
text                text2            -------          显示接收到的信息
commandbutton       command1         发  送             ---------            
commandbutton       command2         退  出             ---------
label               label1         发送的数据             提示
label               label2         接收的数据             提示
  b、在控件工具箱中的空白处点击鼠标右键,在弹出的菜单中选择“部件”,在弹出的窗口中的控件列表中 找到“microsoft comm control”,将其选中,在点击“应用”、“关闭”,在控件工具栏中就会出现一个电 话的小图标。
  c、用串口线将两台电脑连接起来。您可以使用com1对com1的对应连接,也可以使用com1和com2的交叉连接。
本程序使用的是com1对com1的连接。
  d、输入以下代码:
private sub command1_click()
...发送数据
mscomm1.outbuffercount = 0 ...清空输出寄存器
mscomm1.output = text1.text ...发送数据
end sub
private sub command2_click()
...退出
unload me
end sub
private sub form_load()
...初始化
mscomm1.commport = 1 ...使用com1口
mscomm1.settings = 9600,n,8,1 ...设置通讯参数
mscomm1.portopen = true ...打开串口
end sub
private sub mscomm1_oncomm()
...通讯事件发生
select case mscomm1.commevent
case comevreceive ...有接受事件发生
text2.text = mscomm1.input ...接受显示数据
mscomm1.inbuffercount = 0 ...清空输入寄存器
end select
end sub
2、pc机与单片机之间的通讯
  pc机与单片机之间的通讯被广泛的用于工业、医疗测控等领域之中。在应用中,我们通常将单片机作为“感 受器”和“效应器”,负责数据采集、响应计算机发出的指令对电路进行控制,有时也进行一些简单的运算, 最后再将执行数据反馈给计算机处理。本程序将实现在pc机上输入一个0-255之间的整数,将此数据发送到单片 机,单片机接收到数据后,将数据在显示管上显示,再将此数除以2,将得数返回给pc机。(运行效果如图 3.bmp所示)其实现方法如下:
   a、同pc机间通讯的实现方法a-b。
   b、连接电脑和单片机。注意!由于pc机端的rs232电平与单片机端ttl的并不不匹配,故应注意电平转换。
   c、在vb中输入以下代码:
private sub mscomm1_oncomm()
...通讯事件发生
dim indata as variant
dim bte(0) as byte
select case mscomm1.commevent
case comevreceive ...有接受事件发生
indata = mscomm1.input
...注意!要通过mscomm控件发送或接收二进制数据必须用variant类型的变量对二进
...制byte类型的变量进行转换!
bte(0) = ascb(indata)
text2.text = bte(0)
mscomm1.inbuffercount = 0 ...清空输入寄存器
end select
end sub
private sub command1_click()
...发送数据
dim num as integer
dim outbte(0) as byte
num = val(text1.text)
outbte(0) = cbyte(num)
mscomm1.outbuffercount = 0 ...清空输出寄存器
mscomm1.output = outbte(0) ...发送数据
end sub
private sub command2_click()
...退出
unload me
end sub
private sub form_load()
...初始化
mscomm1.commport = 1 ...使用com1口
mscomm1.settings = 9600,n,8,1 ...设置通讯参数
mscomm1.portopen = true ...打开串口
end sub
   d、单片机工作方式置于1,比特率设为9600bit/s。在单片机上,我们只得使用汇编语言编写,并且调用中 断实现对串口数据的收发工作。源代码如下:
push psw        ;将程序状态字压入堆栈
push acc        ;将累加器压入堆栈
clr ea          ;关闭系统中断          
clr ri          ;清除中断标志位
mov a,sbuf      ;从接收寄存器中读取数据
mov 70h,a       ;分解数据百、十、个位并显示
mov b,#100      
div ab
mov 52h,a       ;分解百位,送入存储器52h
mov a,b
mov b,#10
div ab
mov 51h,a       ;分解十位,送入存储器51h
mov 50h,b       ;分解个位,送入存储器50h
mov a,70h
mov b,#2  
div ab          ;将接受的数据除以2
mov sbuf,a      ;将得数发送到输出寄存器
acall dl1       ;延时保证数据完整发送
acall dl1
clr ri          ;清除中断标志位
setb ea         ;打开系统中断
pop acc         ;累加器出栈
pop psw         ;程序状态字出栈
reti            ;中断程序返回
3、编程环境
    以上程序在windows 2000 professional,visual basic 6.0企业版,at89c52型单片机下调试通过。
四、总结
   从以上程序可以看出,在vb中利用mscomm控件,可以快速开发出串口通讯程序,从而大大提高编程效率。
----------------------------------------------
此篇文章从博客转发
原文地址: Http://blog.gkong.com/more.asp?id=92266&Name=jczwfy
日本人说中日友好,中国人民笑了:你丫骗谁呢?
日本人说自己爱和平,亚洲人民笑了:说的是人话吗?
日本人说自己要维护世界和平,美国人民笑了:问你大爷没?
日本人说自己是人,全世界的狗都叫了:兄弟,做狗要厚道,不能忘本!
欢迎访问我的博客http://blog.gkong.com/blog.asp?name=jczwfy
在线PLC触摸屏问题解答加Q号2*7*5*4*7*0*0*6,加好友注明工控网
匿名用户
文章数:N/A
年度积分:0
历史总积分:0
注册时间:2009/6/29
发站内信
发表于:2009/6/30 0:30:51
#1楼
该用户被锁定,回复内容不予显示!
17528
ahljj
文章数:3387
年度积分:240
历史总积分:17528
注册时间:2002/3/23
发站内信
发表于:2011/12/14 16:53:25
#2楼
学习了。
923
oyoyxixi
文章数:29
年度积分:50
历史总积分:923
注册时间:2011/8/7
发站内信
发表于:2012/1/6 12:04:05
#3楼
存着,以后用!!
848
szyujun41
文章数:25
年度积分:50
历史总积分:848
注册时间:2010/9/18
发站内信
发表于:2012/1/13 14:39:19
#4楼
hao  !!!!!!!

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 非法和不良信息举报

工控网客服热线:0755-86369299
版权所有 工控网 Copyright©2024 Gkong.com, All Rights Reserved

78.0005