首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 网络编程-> C#/CSHARP教程
MSComm控件在中文Windows下的通信问题与处理方法-.NET教程,组件控件开发
作者:网友供稿 点击:182
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 

mscomm控件在中文windows下的通信问题与处理方法
汪晓建 武海鹰
西安武警工程学院 通信工程系
摘 要vb 5.0/6.0的mscomm通信控件提供了一系列标准通信命令的接口,它允许建立串口连接,但在实际通信软件设计过程中,mscomm控件并非像想像中那样完美和容易控制,特别是在中文windows下通信时更会出现问题.本文就mscomm控件在实际应用中可能出现的问题以及编程技巧进行探讨.
关键词 mscomm控件 串口通信 处理
1.mscomm控件的基础理论
一般说来,计算机都有一个或多个串行端口,它们依次为com1,com2,....这些串口还提供了外部设备与pc进行数据传输和通信的通道,这些串口在cpu和外设之间充当解释器的角色.当字符数据从cpu发送给外设时,这些字符数据将被转换成串行比特流数据;当接收数据时,比特流数据被转换为字符数据传递给cpu.再进一步说,在操作系统方面,windows用通信驱动程序(comm.drv)调用api函数发送和接收数据.当用通信控件或声明调用api函数时,它们由comm.drv解释并传递给设备驱动程序.作为一个vb程序员,要编写通信程序,只需知道通信控件提供给windows通信api函数的接口即可,换句话说,只需设定和监视通信控件的属性和事件即可.
2.利用mscomm控件进行数据的接收和发送
搞清楚以上基本属性和事件后就可以开始编写通信程序了:在vb 5.0/6.0中新建一个工程文件,添加microsoft comm control 5.0组件,在窗体form1中加入command命令按钮并取名为cmdtest,mscomm控件取名为mscomm1,写入以下代码:
private sub cmdtest_click()
mscomm1.commport = 1 设定com1口
if mscomm1.portopen = false then
mscomm1.settings = "9600,n,8,1" 9600波特率,无校验,8位数据位,1位停止位
mscomm1.portopen = true 打开串口
end if
mscomm1.outbuffercount = 0 清空发送缓冲区
mscomm1.inbuffercount = 0 清空接收缓冲区
发送字符数据,注意必须用回车符(vbcr)结束
mscomm1.output="this is a good book!" & vbcr
拨打电话号码或发送at命令
mscomm1.output="atdt 0294563622" & vbcr
发送字符数组数据,注意bytearray必须事先定义赋值
dim bytearray as byte() 定义动态数组
redim bytearray(1) 重定义数组大小
bytearray(0)=0
bytearray(1)=1
mscomm1.output = bytearray 发送字符数组数据
end sub
private sub mscomm1_oncomm()
select case mscomm1.commevent
case comevreceive 接收字符数据
dim buffer as variant
mscomm1.inputlen = 0
当inputmode 属性值为0(文本模式)时,变量中含string型数据.
当inputmode属性值为1(二进制模式)时,变量中含byte型数组数据.
mscomm1.inputmode=cominputmodebinary
buffer=mscomm1.input 接收二进制数据
mscomm1.inputmode=cominputmodetext
buffer = mscomm1.input
case else
end select
end sub
3.中文windows下的通信问题与解决方法
3.1 接收的数据少于发送的数据
如果通过mscomm控件一次性传送较多的二进制数据,那么,很可能收到的数据不足.例如在设置为2400bps传输率的情况下,一次性可以传输2048个字符数据,那么在大多数情况下一次只能收到1200个字符左右,这是因为新版的mscomm32.ocx中存在一个影响传输二进制数据的bug.
32位windows api函数使用了几个用commtimeouts结构表示的限时变量,writetotaltimeoutconstant即是其中的一个,它被windows内部设定为5000(即5秒),这个常量决定了在通信驱动程序停止传输之前花费在发送缓冲区中数据的时间的长短.5秒钟意味着通信速度为1200bps情况下仅能发送600个字符,2400bps情况下仅能发送1200个左右的字符.事实上,在一个缓冲区内一次性发送更多的数据是非常可能的.vb 5.0/6.0版本的mscomm控件有一个新增的重要的属性称为commid,commid指的是当串口被打开时,被api所调用的串口句柄(或标志),这也意味着能利用api接口函数去修改这个常量.每次串口关闭后,windows会自动将之恢复为5000,所以,每次打开串口后需要重新设定.以下是api声明代码:
type commtimeouts
readintervaltimeout as long
readtotaltimeoutmultiplier as long
readtotaltimeoutconstant as long
writetotaltimeoutmultiplier as long
writetotaltimeoutconstant as long
end type
declare function setcommtimeouts lib "kernel32" (byval hfile as long , _
lpcommtimeouts as commtimeouts) as long
declare function getcommtimeouts lib "kernel32" (byval hfile as long , _
lpcommtimeouts as commtimeouts) as long
dim timeouts as commtimeouts
dim ret as long
if comm1.portopen = false then
comm1.portopen = true
end if
打开串口后重新设定串口句柄
ret=getcommtimeouts(comm1.commid,timeouts)
set some default timeouts
timeouts.readintervaltimeout = 1
timeouts.readtotaltimeoutmultiplier = 1
timeouts.readtotaltimeoutconstant = 1
timeouts.writetotaltimeoutmultiplier = 1
timeouts.writetotaltimeoutconstant=(comm1.outbuffersize \ val(comm1.settings))*10000+1000
ret=setcommtimeouts(comm1.commid,timeouts)
3.2 如何发送大于128的字符数据
在通信程序中,以单字符方式逐个发送数据时,每一个数据范围为0-255(即十六进制的00-ff).在单字符版本的英文windows或dos版的basic程序中,只需要将相应的数据转换成相应的字⑺偷酵ㄐ哦丝诩纯?但在中文windows下却行不通,假设在中文windows下运行以下程序:
dim i as integer
for i = 0 to 255
mscomm1.output = chr(i)
next i
希望在接收端得到预期的0-255之间的数据,结果却是:前129个数据接收正确,为0-128,后面127个数据为126个0和一个255.造成这种结果的原因在于中文windows使用的是双字节字符集(dbcs)系统.dbcs系统使用0-128之间的数字表示ascii字符,大于128的数字仅作为前导字符,它只是显示是一个非拉丁语系的字符,而并不代表实际意义.上述程序在调用chr()函数时用到了dbcs字符集,因此产生了此类错误.那么,如何发送大于128的数据呢 答案是使用字节数组,将以上程序改为:
dim mydata(255) as byte
for i = 0 to 255
mydata(i) = i
next i
mscomm1.output = mydata
do
doevents
loop until mscomm1.outbuffercount = 0
接收过程
private sub mscomm1_oncomm()
select case mscomm1.commevent
case comevreceive
dim buffer as variant
mscomm1.inputmode = cominputmodebinary
mscomm1.inputlen = 0
buffer = mscomm1.input
for i=lbound(buffer) to ubound(buffer)
text1.text= buffer(i);
next i
case else
end select
end sub
3.3 如何发送中文字符串
vb 5.0/6.0中可以直接把中文字符等同于英文字符发送,如:mscomm1.output="现在发送中文数据!",但这种方法发送的中文数据不能太长,发送缓冲区和接收缓冲区的大小需设定为中文字符的两倍以上,而且发送与接收系统所处的操作系统版本最好要一致,否则会出现接收或发送缓冲区溢出之类的错误.这种方法可用于一般要求不太高的场合.除了上述方法外,还可以采用间接方式发送中文字符串.
在发送端将汉字或字符转换为机器内码或区位码数据数组,然后将转换后的数据发送到串口,在接收端接收到数据后,按照相反的顺序将得到的数据转换为相应的汉字或字符.在转换过程中,要用到位运算,如取得汉字的内码后需要将高字节和低字节分开,而vb 5.0/6.0中并没有提供此类函数,以下是求整数高,低字节的函数.
public function hibyte(a as integer)
dim b as integer
b = a and &hff00
b = b / 256
if b < 0 then b = b + 256
hibyte = b
end function

public function lowbyte(a as integer)
dim b as integer
b = a and &hff
lowbyte = b
end function
3.4如何在通信过程中进行延时
在某些通信过程中,常常需要在发送完一组数据后进行一段延时,以等待对方处理上组数据,以下是延时函数代码.
public sub delay(pausetime as single)
dim start
start = timer
设定开始时间
do while timer < start + pausetime
doevents
loop
end sub
4.结束语
随着计算机应用领域的不断扩展,计算机之间的远程通信用得也越来越广泛.作为rad开发工具代表的visual basic同样提供了一系列标准通信命令的接口,它允许建立串口连接,可以连接到其他通信设备(如modem),还可以发送命令,进行数据交换以及监视和响应在通信过程中可能发生的各种错误和事件等,可以满足通常情况下的串口通信需求.如果在实际应用过程中,能够很好的掌握mscomm控件的特性,灵活变通,就可以达到安全,稳定,高效通信的目的.


文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·使用C#编写Windows Forms应用程序(转)-.NET教程,Windows开发
·C#学习杂记-.NET教程,C#语言
·将文本格式的文章转换为html/xml格式文本的功能封装到Javabean-JSP教程,Java技巧及代码
·用java小程序applet实现无限级树结构-JSP教程,Java技巧及代码
·《.net编程先锋C#》第一章 C#简介-.NET教程,C#语言
·企业人事信息管理系统1.0-ASP教程,数据库相关
·《.net编程先锋C#》第三章 第一个C#应用程序-.NET教程,C#语言
·《.net编程先锋C#》第二章 理论基础-公用语言 运行环境-.NET教程,C#语言
·Windows应用程序调试必备的--符号文件(Symbols)-.NET教程,评论及其它
·c#反编译微软msdn2003的帮助文档,并将反编译结果保存到一个sqlserver数据库中
最新文章
·vista的新特性:懒人的安全感_windows vista
·photoshop为情侣照片打造韩式梦幻相框_photoshop教程
·专访seobbs站长乐思蜀_站长访谈
·嘟嘟网络陈艺光:诚信是一种信仰_站长访谈
·俺自己黄修源:只问耕耘,不问收获_站长访谈
·李向华:如何提高论坛用户粘性_站长访谈
·给windows vista系统网络和共享中心“换脸”_windows vista
·胡宪东谈搜索优化的实战_站长心得
·网站快速成功的九个步骤_站长心得
·google pr数字背后的含意_google推广
相关主题
  • mscomm文字传输_visualbasic教程
  • mscomm32的简单应用_delphi教程
  • 西部数码虚拟主机

    友情链接
    CNNIC 西部数码
    万网 自助建站
    虚拟主机 asp空间
    域名注册 域名
    域名申请 主页空间
    论坛空间 网站空间
    国际域名 虚拟空间
    空间租用 DDOS防火墙
    成都主机托管 四川主机托管
    主机租用 服务器租用
    网站目录 自助建站
    虚拟主机 网址大全
    软件下载
    自助链接
    虚拟主机资讯 特价虚拟主机
    版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
    关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
    特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
    发表评论 打印  刷新     关闭