版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、关于M 控件的一些说明的m 通信控件提供了一系列标准通信命令的接口,它允许建立串口连接,可以连接到其他通信设备(如 Modem)还可以发送命令、进行以及监视和响应在通信过程中可能发生的各种错误和事件,从而可以用它创建全双工 、事件驱动的、高效实用的通信程序。但在实际通信设计过程中,m 控件并非像想像中那样完美和容易控制特别是在中文 Wln9598 下通信时更会出现问题。下面就从基础开始介绍,然后逐步讨沦控件在编程中出现的问题以及编程技巧。m一、用m 控件通信1串口通信基础知识一般悦来,计算机都有一个或多个串行端口,它们依次为、2、,这些串口还提供了外部设备与进行数据传输和皿信的通道。这些串口在
2、 CPU 和外设之间充当解释器的角色。当字符数据从 CPU发送给外设时,这些字符数据将被转换成串行比特流数据;当接收数据时,比特流数据被转换为字符数据传递给 CPU,再进一步说,在操作系统方面,Windows 用通信驱动程序(COMM.DRV)调用 API 函数发送和接收数据,当用通信控件或时,它门由 COMM. DRV 解释并传递给设备驱动程序,调用 API 函数作为一个 vB 程序员,要编写通信程序只需知道通信控件提供给 Windows 通信AP1 函数的接口即可换句话说,只需设定和监视通信控件的属性和事件即可。2使用在开始使用属性 CommPort Settings PortOpen I
3、nput Outputm 控件m 控件之前。需要先了解其属性、事件或错误描述设置或返回通信端以字符串的形式设置或返回波特率、奇偶校验、数据位和停止位设置或返回通信端口的状态。也可以打开和关闭端口返回和删除接收缓冲区中的字符将字符串写入发送缓冲区CommEvent 属性为通信事件或错误返回下列值之一。在该控件的对象库中也可以找到这些常量。常量 ComEventBreak ComEventCTSTO值10011002描述收到了断开信号Clear To Send Timeout。在发送字符时,在系统指定的事 1 件内,CTS(Clear To Send)线是低电平ComEventDSRTO1003D
4、ata Set Ready Timeout。在发送字符时,在系统指 Set Ready)线是低电平数据帧错误。硬件检测到一个数据帧错误端口溢出。硬件中的字符尚未读,下一个字符又到达,定的事件内,DSR(DataComEventFrame1004ComEventOverrun 1006并且丢失ComEventCDTO1007Carrier Detect Time。在发送字符时,在系统指定 Detect)线是低电平。CD的事件内,CD(Carrier也称为 RLSD(Receive Line Singal Detect,接收线信号检测)ComEventRxOver1008ComEventRxPar
5、ity 1009ComEventTxFull1010接收缓冲区溢出。在接收缓冲区中没有空间奇偶校验错。硬件检测到奇偶校验错误 7发送缓冲区满。在对发送字符排队时,发送缓冲区满检取端口 DCB(Device Control Blick)时发生了没ComEventDCB有预料到的错误1011通信事件包含了下面的设置:常量 ComEvSend ComEvReceive值12描述发送缓冲区中的字符数比 Sthreshold 值低接收到了 Rthreshold 个字符。持续产生该事件,直到使用了 Input 属性删除了接收缓冲区中的数据ComEvCTS ComEvDSR 该事件发生 ComEvCD34C
6、TS(Clear To Send)线改变DSR(Data Set Ready)线改变。当 DSR 从 1 到 0 改变时,5CD(Carrier Detect)线改变 ComEvRing6 检测到响铃信号。一些 URAT(Universal AsynchronousReciver-Transmitters,通用异步收发器)不支持该事件ComEvEOF7收到了 EOF 字符(ASCII 字符 26)Error 消息(常量m 控件)下表列出了值m 控件可捕获的错误消息:描述ComInvalidPropertyValue ComSetNotSupported ComGetNotSupported C
7、omPortOpen380383394800080018002800380048005800680078008800980108011801280138014801580168018无效的属性值属性只读属性只读端口打开时该存在无效超时设置必须比 0 值大无效的端属性只在运行时有效 属性在运行时是只读的端口已经打开设备标识符无效或不支持不支持设备的波特率指定的字节大小无效缺省参数错误硬件不可用(被其他设备锁住)函数不能分配队列设备没有打开设备已经打开不能使用通信通知不能设置通信状态不能设置通信事件该存在只在端口打开是有效ComPortInvalidComPortAleadyOpenComNoOp
8、enmSeFailedComPortNotOpen801980208021设备忙通信设备读错误检取端口设备控制块时出现内部错误ComReadError ComDCBError搞清楚以上基本属性后,就可以开始编写通信许程序了。在 VB5.0/6.0 中新建一个工程文件。添加件,在简体 Form1 中加入Comm Control 5.0 组d 命令按钮并取名为 CmdTest,m 控件取名为m1,加入如下程序代码。Private Sub cmdTestClick ( )mPort =2打开串口 设定 Com2Ifml.PortOpen = False Then m1.Settings = 9600
9、,n,8,19600 波特率,无校验,8 位数据位,1 位停止位m1.PortOpen = True End ifm1.OutBufferCount = 0m1.InBufferCount = 0打开串口清空发送缓冲区 滑空接收缓冲区发送字符数据时注意必须用回车符(vbcr)结束 m1.Output=This is a qood book ! &vbCr泼打号码或发送 AT 命令m1.Output = ATDT 05778191898 , & vbCr发送字符数组数据时注意 ByteArray 必须事先定义赋值Dim ByteArray as byte( )定义动态数组 ReDim ByteA
10、rray(1)重定义数组大小 ByteArray ( 0 ) =0ByteArray ( 1 ) = 1m1.Output End Sub=ByteArrayprivate Sub Select CasemEvent( )mEventCase comEvReceiveDim Buffer As Variant m1.InputLen = 0接收二进制数据m1.InputMode= ComInputModeBinary m1.Input接收字符数据InputModeText ml.InputBuffer = Case else End Select End sub( 程序 1)二、中文 Win
11、9598 下的通信问题与解决方法1接收的数据少于发送的数据如果通过m 控件传送较多的二进制数据,那么,很可能收到的数据不足。例如在设置为 24oobps 传输率的情况下,可以传输 2048 个字符数据 那么在大多数情况下。一次只能收到 1200 个字符左右,这址出为新版的m32OCX 中存在一个影响传输二进制数据的臭虫(bug)注意这不是特性。32 位 Windows API 函数(以下简称 API)使用了几个用 COMMTIMEOUTS 结构表示的限时变量,WriteTotalTimeOonstant 即是其中的一个,它被Windows 内部设定为 5000(即 5 秒),这个常量决定了在通
12、信驱动程序停止传输之前花费在发送缓冲区中数据的时间的长短,5 秒钟意味着通信速度为 1200bps 情况下仅能发送 600 个字符,24oobps情况下仅能发送 1200 个左右的字符。事实上,在一个缓冲区内发送的数据是非常可能的。这个 bug 同样也能问题,甚至在高速串口门通信情况下,即使系统在使用流控制,无论丛流(XonXofI)还是硬件流(CTSRTS)。假如数据在发送缓冲区中时,流控制停止了传输,如果停止时间超过 5秒钟则数据就会丢失。在某些环境下,5 秒钟可能相当短不过也不必担心,VB 5.0/6.0 版本的m 控件有一个新增的重要的属性称为 CommID, CommID 指的是当串
13、口被打开时,被 API 所调用的串口句柄或称标志,这也意味着能利用 API 接口函数去修改这个常量。每次串口关闭后,Windows 会自动将之恢复为 5000,所以,每次打开串口后需要重斩设定以下 API Type COMMTIMEOUTS,其代码见下程序。ReadervalTimeout AsLongr As LongReadTotalTimeoutMultipReadTotalTimeoonstantAs Longr As LongWriteTotalTimeoutMultipWriteTotalTimeoonstant As Long End TypeDeclare Function (
14、BYVal hFile As Long, Declare Function (ByVal hFile As Long,mTimeouts Lib Kernel32m TimeoutsAs COMMTIMEOUTS) As Long mTimeouts Lib Kernel32mTimeouts As COMMTIMEOUTS) As LongDim timeouts As COMMEOUTS Dim Ret As LongIf Comm1.PortOpen = False Then Comm1.PortOpen = TrueEnd ifmTimeouts (Set some default t
15、imeoutsmID , timeouts )timeOuts.ReadervalTimeout = 1timeouts.ReadTotalTimeoutMultipr =1=1r =1timeouts.ReadTotalTimeoonstanttimeouts.WriteTotalTimeoutMultiptimeouts.WriteTotalTimeoonstant=( Comm1.OutBufferSizeVal(Comm1.Settings)*10000mTimeouts(mID , timeouts )( 程序 2)2如何发送大于 128 的字符数据在通信程序中,以单字符方式逐个发送
16、数据时,每一个数据范围 0-255(即进制的 00-FF)。在单字符版本的英文 Win95 或DOS 版的 BASIC 程序中,只需要将相应的数据转换成相应的字符发送到通信端口即可。但在中文 Win95/98 下却行不通,假设在中文Win9598 下运行以下程序:Dim iFor i=0 to 255m1.Outp Next ihr(i)希望在接收端得到预期的 0-255 之间的数据,结果却是:前 129 个数据接收正确,为 0-128,后面 127 个数据为 126 个 0 和一个 255,造成这种给果的原因在于中文 Windows 使用的是双字节字符集(DBCS)系统。DBCS系统使用 0
17、-128 之间的数字表示 ASCII 字符,大于128 的数字仅作为前导字符,它只是显示是一个非拉丁语系的字符,而并不代表实际意义。上述程序在调用 CHR()函数时用到了DBCS 字符集,冈此产生了此类错误。那么,如何发送人于 128 的数据呢?是使用字符数组,将以上程序改为:Dim cc(255) As Byte For i = 0 To 255 cc(i) = iNext im1.Output= ccDo DoEvents Loop Until 接收过程Select Casem1.OutBufferCount = 0m() mEventCase comEvReceiveDim Buffer
18、 As Variant, b1,iInputModeBinerym1.InputLen = 0Buffer =m1.InputFor i=LBound (Buffer) To UBound (Buffer )Debug.Pr Next iBuffer ( i ) ;Case . . . . .3如何发送 0 字符(00H,NULL)在 VisuaI C中使用串口控件发送 0 字符有些麻烦,但在 VB5.0/6.0 中只要注意以下两点即可:(1)设置m 控件的属性 NullDiscard=False;。(2)使用二进制接收,即用解决问题;InputModeBinary 便可以4如何发送递中文字符串(DBcS 字符)VB5.0/6.0 的各种参考书上均指明m 通信控件不能发送或接收双字节字符集系统 DBCS)的二进制数据,这对于我国及亚洲一些使用 DBCS 字符集的国家不能不说是一大人遗憾。但是我在实践中发现,用控
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2026学年广东省汕尾市高三第二次调研历史试卷含解析
- 2026品优购面试题目及答案
- 2026深度文案面试题及答案
- 违法解协议书范本
- 职工离职保密协议书
- 资源纠纷协议书
- 鸭子宠物领养协议书
- 签约合同廉洁协议书
- 2026数据常见面试题及答案
- 湘美版(2024)初中美术七年级上册《传承非遗手艺》教学课件
- 2026年公文写作考试题库(含参考答案)
- 2026年贵州铝业集团第二次公开招聘考试模拟试题及答案详解
- 2026浙江丽水缙云县国有企业招聘工作人员43人笔试备考试题及答案详解
- 2026年无人机驾驶证通关题库及答案详解(典优)
- (2026年)萍乡市莲花县辅警考试公安基础知识考试真题库及参考答案
- 2026年高中政治教师招聘经典试题及答案
- RTCA∕DO-160G 机载设备环境条件和试验程序
- 办公室装修工程施工现场临时用电方案
- 人教版小学一年级数学下册各单元练习题
- 安徽省合肥一中、安庆一中等六校2026届高一下生物期末复习检测试题含解析
- 2026高压电工证资格考试核心题库(答案及解析)
评论
0/150
提交评论