VB中串口通讯的实现(通用4篇)
用Visual Basic 实现无线通讯
中科院空间中心
姜棣昭
www2.ccw.com.cn/tips/9908/080303-11.zip
---- 一、概述
---- Visual Basic 是Mcrosoft公司推出的强有力的系列开发软件之一,而且以其实用、方便、快捷、开发周期短、广泛而强大的功能越来越被广大编程人员所亲赖,广为流传,似乎有些专业的编程人员放弃了Visaul C++ 而改用了Visaul Basic之类的RAD编程工具,尽管Visaul C++在灵活性、代码紧凑、运行速度快及底层开发等方面Visaul Basic无法比拟的,但编写C++应用程序过长的调试和开发周期确实有点不适应当今的应用程序开发环境,
---- ... ...
---- 二、VB串行通讯
---- 利用VB开发通信程序主要的方法有两种,一是利用VB本身提供的控件(CONTRALS),另一种方法是利用WINDOWSAPI应用程序接口,WINDOWS API 主要提供了三个动态连接库KERNEL.EXE、USER.EXE、GDI.EXE供开发人员调用,其中KERNEL.EXE 主要包括一些底层操作函数,完成一些资源管理、任务、内存等操作,USER.EXE包含了一些与WINDOWS管理有关的函数,如通讯、菜单、消息、光标、插入符、计时器以及绝大多数非显示函数,GDI.EXE图形设备接口库,主要内容为与设备输出有关的函数。和串口通讯有关系的函数BuilidCommDCB、ClearCommBreak、SetCommBreak、FlushComm、GetCommError、GetCommState、WriteComm、ReadComm、SetCommState、CloseComm等均在Windowssystem 子目录下的USER.EXE动态连接库中,在VB调用之前应该先在全局变量定义处声明API通讯函数、定义常量。
---- 在我们的实践中,用VB 控件实现通讯的方法比调用SDK的API动态连接库的方法更加方便、快捷,而且用较少的代码可以实现相同的功能,这就是用VB 控件实现通讯的优点所在,下面主要介绍一下利用VB 控件实现无线通讯的问题。
---- 在VB的控件工具箱中,提供了一个使用非常方便的串行通讯控件MSComm,它全面的提供了使用RS-232串行通讯上层开发的所有细则,它既可以使用查询方式又可以使用事件驱动方式来完成串行通讯。
---- ... ...
---- 三、无线传输接口和协议
---- 在我们的项目中用Intel 586/120的PC机为上位机,通讯程序使用VB开发的,用8031单片机做CPU、AD574作数据采集的下位机,上位机作数据接收和数据处理中心站,下位机实时采集数据之后,进行简单的数据平均计算,当收到上位机发来的发送指令之后,开始向上位机发送数据。
---- 上位机无线通讯接口使用的是一块插在ISA扩展槽中的无线MODEM ZX-02,无线MODEM与KENWOOD公司的TK-378无线对讲机相连,数字信号通过无线MODEM调制成为音频信号之后,送到TK-378无线对讲机上的MIC口,
---- 下位机有一台外置无线MODEM ZX-01,单片机的数字信号经过串口送入无线MODEM,MODEM对信号进行调制后送入KENWOOD TK-378无线对讲机上,接收数据的方式与上述相同,由TK-378收到信号后,经无线MODEM将音频信号解调为数字信号进入计算机或单片机处理。
---- 由于在我们的通讯网络中,并非点对点的通讯,而是一点对多点的广播式的通讯方式,因此,我们在通讯协议中曾加站点识别码,每个站有自己特定的识别码,给下位机编码可以保证网络通讯的有序性。
---- 由于无线通讯可能会有空间的燥声干扰,因此,我们采取了多项抗干扰措施,首先是包头识别码,在发送了传输命令之后,下位机开始以打包的形式传输数据,每一包都有一个包头和包尾识别码,假如识别码有误,这一次的传输为不正常数据处理。打包发送另外一个原因是TK-270对讲机连续发送数据的时间不能超过一分钟,超过一分钟就会自动中断发送,因此,当数据较多时不打包连续发送的时间就会超过一分钟,发送数据中断。
---- 在下位机中有32KB的NVRAM,可以保存32KB的数据该数据可以由上位机发送清除命令的方法清楚掉,当32KB满了以后,最早放入的数据就会丢掉,由于我们的采样速率不高,在慢采的情况下,两天的时间才能存满,这样不论上位机或下位机出现断电、死机等问题,数据不会丢失掉。
---- 在发送过程中,由于干扰的原因数据传输出现错误,上位机不给下位机发送清楚命令,数据保存在NVRAM中,下次上位机发送传输命令之后,这些数据还会重新发送到上位机来,这样可以避免了线路带来的数据损失,从下位机向上位机传送的代码有ASCII码和BCD码,测量数据部分用的是BCD码主要是为了节省资源,由上位机向下位机发送的命令均为ASCII码。
---- 我们还对字段长度和包的长度作了规定,一个字段有多少个字节,一包有多少个字段组成,如果数据最后不够一整包,也按照整字段的格式作为半包发送过来。
---- 考虑到下位机的分散性,可能固定在偏远、不宜接近的地带,用上位机对下位机发送校时命令并校时的方法来统一网络时间。
---- 由于我们使用的无线MODEM 所限,传输速率只能达到2400BPS,而在我们的使用中1200BPS、N PARITY、8 DATA、1 STOP为较稳定状态。
---- 上位机向下位机发送的命令有校时命令并校时、请内存命令、发送数据命令、快采命令和慢采命令等。发送命令有两种发送方式,即手动方式和自动方式,自动方式是由定时器来完成的。
---- 在无线通讯过程中,除了规定合理的协议之外,为了保证通讯的正确性,在数据发送时适当的增加延时是必要的,当速度较慢的计算机向速度较快的计算机发送数据时应适当的增加延时。
---- 四、应用实例
---- 由于该项目的软件源代码较长,我们只拿出和串口通讯有关的程序片段来供大家参考。在我们的工作中实践了三种通讯方式,即查询方式、事件驱动方式、事件驱动转查询方式,这三种方式各有利敝,查询方式有方便可靠的特点,可利用协议或设定时钟进入和退出查询状态,但不是资源的有效利用方式,事件触发方式对于定长通讯非常有效,但定长通讯在有些场合不实用,事件驱动转查询方式既有事件驱动的特点又有转查询方式特点,可以说是集二者之长,有效利用资源。下面着重介绍事件驱动转查询方式。
.
.
.
---- 五、结论
---- 根据我们实践工作的经验,在本项目中无线通讯和有线通讯的主要区别在于用MSCOMM控件的RTSEnable属性对无线Modem的PTT操作以及适当的延时,延时的长短和使用的计算机有关。在开发的过程中,把握好上述两条,设定一个合理的通信协议,选择合适的硬件是至关重要的。
粗糙度检测仪广泛应用于各种金属与非金属的加工表面的检测, 该仪器是传感器主机一体化的袖珍式仪器, 可以根据需要在任何地方进行测量。
在太阳能硅片的制程中, 硅块磨面后的表面粗糙度对后序的硅片质量有影响, 一般情况下, 硅块表面粗糙度越大, 后序的切割硅片良品率会下降。日本三丰SJ-20P粗糙度检测仪则是硅块表面测量最常用的一种型号。虽然SJ-201P能提供检测结果, 但是在特殊情况下还需要进一步了解硅块表面的大致轮廓图形及最大值和最小值。虽然厂家提供了专用小型打印机打印出轮廓图形, 但不具有最小值和最大值的方案, 且价格昂贵。再加上使用率不高, 打印纸也不常用。
本文探究通过粗糙度检测仪的串口, 实现与普通计算机的通信, 获取硅块表面测量的轮廓数据, 满足各方面的统计需求。如果将计算机连接打印机本实例还能实现数据或曲线图的打印功能。
1 粗糙度检测仪SJ-201P简介
SJ-201P配备有符合ISO、DIN、ANSI、JIS标准的多种粗糙度评估参数。提供19种分析参数, 其中包括Ra, Rq, Rz, 和Ry等基本参数。测量范围在-200~+150μm。SJ-201P型机器可以通过RS-232C连接线连接专用打印机不仅能输出SPC (statistical process control统计过程控制) 格式数据, 还可以将测量的轮廓打印出来。通过RS-232C连接线 (选件) 可以将数据传送到PC或者其他设备上, 产品资料中提供了常用的通讯报文格式。
2 PC与SJ-201 P的硬件连接
SJ-201P的RS-232C通讯采用RJ-11接口, 与PC的9针D-SUB连接如图1所示。
3 串口通讯的编程实现
本实例采用VB6.0编程平台, 新建Form1窗口, 拖曳串口通讯部件Ms Comm到窗口Form1窗口中, Ms Comm相关文件是MSCOMM32.OCX。
3.1 串口通讯的参数设置
接收数据报文格式根据发送命令报文的类别有所不同, 正常接收数据时都是以“OK”开始, 回车符结束。如接收测试条件的报文格式:“OK”+数据 (占21个字节) +Chr$ (13)
接收工作异常的信息报文格式:“NG”+数据 (占2个字节) +Chr$ (13)
由于串口每次发送一个字节, 所以一般会在循环中读串口数据后连接每个读取数据, 当读到是回车键Chr$ (13) 时循环结束。程序设计中定义了函数sts_rd () 用于接收报文。
3.2 获得检测条件
发送”读测试条件”命令的报文格式如表1所示。
”接收检测条件”的报文格式如表2所示。
表2中:EM表结束标志, CR表回车。每一格代表占用一个字节。
*1表示截取长度, 2时是0.25mm, 3时是0.8mm, 4时是2.5mm。
*2表示样本数量。如1时是1。
本实例中获取样本长度的语句如下:
如果要获取其他测试条件, 可依据编写程序。
3.3 获得轮廓数据
必须启动测量, 在测量过程中获得轮廓数据。
启动测量的发送报文格式如下:
接收的格式如下:
本实例中开始测量语句如下:
本实例的语句如下:
4 结论
本文详细描述了粗糙度度检测仪SJ-201P的报文格式, 以及与普通计算机的通讯方式, 并用实例说明了实现过程。由于串口协议具有广范的通用性, 粗糙度检测仪也在光伏行业中广泛使用, 因此本文对串口协议的编程也对粗糙度检测仪的进一步应用都有很好的借鉴意义和应用价值。
摘要:在光伏行业的硅片制程中粗糙度检测仪广泛用于检测硅块表面的粗糙度, 文中利用VB6.0编程平台探究如何通过粗糙度检测仪的串口, 实现了与普通计算机的通信, 获取了表面测量的轮廓数据, 这对粗糙度检测仪的进一步的应用具有一定的指导意义。
关键词:VB6.0,粗糙度检测仪,串口通讯,RS-232
参考文献
[1]刘天惠.Visual Basic程序设计教程[M].北京:清华大学出版社, 2006.
关键词:串口通信;监控;VB6.0
中图分类号:TP393文献标识码:A文章编号:1009-3044(2007)18-31487-01
VB6.0 Equipment with Serial Communication and Monitoring Capabilities
GU Huan-yu
(Shanghai Telecom Technology Development Ltd.,Shanghai 200065,China)
Abstract:In practical applications,the computer serial port and external serial devices commonly used data transmission channel.This paper introduces the basic principles of serial communication function and presented in windows environment serial communication under the general methods and steps, and Visual Basic 6.0 programming under.
Key words:Serial Communication;Monitor;VB6.0
1 引言
计算机串口是通过串行通讯方式进行通信,即一条信息的各位数据被逐位按顺序传送。串行通讯的特点是:数据位传送按位顺序进行,最少只需一根传输线即可完成,成本低、速度较慢,距离可以从几米到几千米。数据通讯量不是很大时,在工控领域广泛地使用串口通信对设备进行监控。
2 问题描述
为了完成对IP网关相应设备是否正常的监视,包括监视输入线路馈电是否正常,控制前端机完成对使用线路与备用线路之间的切换,随时查询控制状态和监视结果,设计计算机串口通信程序。
通讯指标:通信方式为波特率9600bps的主从半双工串行方式,数据包内字节间最大时隙1.5ms,前端机对主站下行指令的最大响应时间为10ms。
数据包格式为:
(3)校验字为长度字和数据字符段的模256算术和。
3 设计思路
系统主要实现以下功能,即对设备发送读指令,读取设备状态;对设备发送控制指令,控制设备动作。下面以N=0(设备号为0)为例,简单说明程序设计的思想。
(1)系统初始化,系统对N=0的设备发出写控制字命令,所有线路走A路。监测前端机返回状态。
(2)监测线路状态,向前端机发出读状态字命令,分析前端机返回状态,并通过可视界面即时显示。
(3)控制设备:如切换电路等,由系统向设备发出写控制字命令,控制设备动作,通过监测前端机返回状态,判断动作是否成功完成。
4 系统实现
随着Windows的广泛应用,越来越多的微机用户已习惯于Windows操作系统。现在有诸多应用软件都可以帮助我们比较方便实现以上功能,编程工作量相对较小,只需进行主要应用功能的编程和少量界面控制的编程。VB的通讯控件友好、功能强大,编程速度快,加上VB的易学、易用,快速开发等特点,数据通讯量不是很大时,在单片机通讯领域广泛地使用VB开发PC上层通讯软件。下面以VB6.0为例简要说明串口通信的实现。
在VB的控件工具箱中,提供了一个使用非常方便的串行通讯控件MSComm,它全面的提供了使用RS-232串行通讯上层开发的所有细则,它既可以使用查询方式又可以使用事件驱动方式来完成串行通讯。在窗体中加入MSComm控件, 取名为MSComm1, 加入Command命令按钮并取名为initialize. 写入以下代码实现系统初始化:
Private Sub initialize_Click()
If MSComm1.PortOpen = True Then MSComm1.PortOpen = False
MSComm1.InBufferSize = 40 '设置MSComm1接收缓冲区为40字节
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
'清空接收缓冲区
outL(0) = "10"(十进制)
outL(1) = "18"
outL(2) = "208"
outL(3) = "0"
……
outL(19) = "0"
outL(20) = "226"
outL(21) = "13" (outL数组设为Byte 数据类型,存储为单精度型、无符号整型、8 位(1个字节)的数值形式,范围在 0 至 255 之间。)
MSComm1.Output = outL
With MSComm1
.InputMode = comInputModeBinary '设置接收数据模式为二进制形式
'为了实现实时监测功能,接收数据的读取要尽可能的快速,则设置MSComm1的属性如下:
.RThreshold = 1'设置接收一个字节产生OnComm事件
.InputLen = 1 '设置Input 一次从接收缓冲读取字节数为1
.OutBufferCount = 0 '清除发送缓冲区
MaxW = -99 '最大值赋初值
MinW = 99 '最小值赋初值
w = 0 '数据个数计数器清零
If .PortOpen = False Then'判断通信口是否打开
.PortOpen = True '打开通信口
If Err Then'错误处理
MsgBox "串口通信无效"
Exit Sub
End If
End If
End With
End Sub
控件MSComm提供了一个事件OnComm,该事件可以截取串口的任何消息,转入事件处理程序。OnComm可以扑获通讯时发生的串口事件和错误信息,当有串口事件或错误发生时,VB会立刻触发一个OnComm事件,程序就会自动转入OnComm事件处理程序中。MSComm1_OnComm的事件处理程序只处理 comEvReceive事件,首先判断帧数据的开始字节,关闭OnComm接收事件,然后接收数据字节。具体源代码如下:
Dim ab(6) As Byte '字节数据类型数组,用来存储接收到的一组字节数据
Dim av As Variant '用来从接收缓冲区读取数据
Private Sub MSComm1_OnComm()
With MSComm1
Select Case .CommEvent'判断MSComm1通信事件
Case comEvReceive'收到Rthreshold个字节产生的接收事件
av = .Input'读取一个接收字节
ab(1) = av(0)'转换保存到字节数据类型数组
If ab(1) = 10 Then'判断是否为数据开始标志
RThreshold = 0'关闭OnComm事件接收
Do
Loop Until .InBufferCount >= 5
'循环等待MSComm1接收缓冲区>=5个字节
w = w + 1 '计数器累加计数
For i = 2 To 6
av = .Input '读取第二个数据字节(BCD码高位字节)
ab(i) = av(0)'转换保存到字节数据类型数组
Next i
Else
MsgBox "接收数据错误", vbOKOnly, "提示"
Exit Sub
End If
.InBufferCount = 0'清除接收缓冲区
.OutBufferCount = 0 '清除发送缓冲区
End With
End Sub
读状态,响应状态的程序设计也是相似的,但接收到响应状态字需要分析数据。
5 结论
本系统利用VB6.0下的ActiveX控件的串行通信功能,实现了在Windows环境下用单台PC机监控的任务,完成对IP网关相应设备是否正常的监视,监视输入线路馈电是否正常,控制前端机完成对使用线路与备用线路之间的切换,可随时查询控制状态和监视结果。且可结合数据库,纪录通话时间等,模拟交换机功能。整个控制系统灵活方便,具有很大的实用性。
参考文献:
[1]范逸之,陈立元.Visual Basic与RS-232串列通信控制(最新版).清华大学出版社,2002.
[2]Evangelos Petroutsos,Kevin Hough. Visual Basic 6高级开发指南.电子工业出版社,1999.
DOS操作系统以其内核小、操作简单、技术成熟等优点使其在嵌入式操作系统领域占据着重要的地位,因此大部分的嵌入式计算机的程序设计都是在DOS平台上完成的.而在DOS操作系统下,不能像Windows操作系统一样有API(应用编程接口),只能是直接操作硬件端口(异步通信适配器8250)来实现编程.
1 PC机异步通信适配器8250及其编程操作
1.1 INS8250内部寄存器及其选择方式
PC机主板上负责串行通信的核心器件为8250(或器件冗余器件)异步通信适配器(UART).程序通过对8250内部的寄存器进行读写进而控制8250.表1为8250内部寄存器的定义和描述.
从表1中可以看出,INS8250借助线控制寄存器的最高位D7,通过3条寄存器选通线A2A1A0,实现对寄存器进行寻址.当D7为0时,寄存器0和1分别为接收/发送数据寄存器和中断允许寄存器;当D7为1时,则分别为低8位除数锁存器LSB和高8位除数锁存器MSB.D7也通常被称为除数锁存器访问位DLAB.
1.2 中断I/O通信方式相关设置
当采用中断I/O方式时,通过对中断允许寄存器的低4位操作,可产生UART支持的4类中断.由前述内容已知,当线路控制寄存器D7位为0时,寄存器1即为中断允许寄存器,其各位定义如下:
D7~D4:保留,恒为0;
D3:该位为1表示允许MODEM状态变化中断,即在任何一个计算机的RS-232C输入端改变状态时,产生一个中断;
D2:该位为1时,表示当接收到有错信息(包括奇偶校验错、超越错、帧格式错)或间断条件时,允许接收器产生中断;
D1:该位为1时,表示允许发送保持寄存器空中断,即当从发送器的保持寄存器中移一个字节到发送器的移位寄存器时,产生一个中断;
D0:该位为1时,表示允许接收器数据就绪中断,即当接收器的缓冲寄存器中有待读的有效字节时,产生一个中断.
若要禁止某类中断,只需将相应位置0即可.对于采用I/O通信方式的寄存器,应将中断允许寄存器置0.
如何来确定中断的优先级呢?中断标识寄存器就是用来保持优先级最高的中断请求的标识码的.
在CPU处理这个特定的中断请求之前,不接受其他的中断请求.因此,在中断服务程序内部必须通过读取中断标识寄存器才能识别出确切的中断源,然后转入相应的中断处理子程序.中断标识寄存器是只读寄存器,D7~D3恒为0,其余各位如表2.
2 多串口通讯软件的设计
软件采用C语言编程,工作于DOS6.22平台系统下,可读性好,能够方便移植到其他平台.程序流程见图1.
此处省略了初始化串口的部分,介绍了一个可重用的DOS下多串口通信程序的中断服务函数.
在多串口通讯程序中,由于各串口接收数据时,处理代码会有所不同,会有各自存放数据的变量,这些都需要在自己的中断服务程序中完成.定义好各串口对象后,只要将中断服务函数的入口地址指针送到相应的中断号中即可.
3 高号中断8259A可编程中断控制器的控制
有时在处理多串口时,要对中断进行扩展,很典型的实例就是在PC104中对多串口的控制,PC104与IBMPC是兼容的,但留了多余的中断号供编程者使用.
在IBMPC及其兼容机中,通过CPU的NMI(非屏蔽中断)和2个8259A可编程中断控制器芯片为系统提供了16级中断,硬件中断结构如图2所示,2片8259A构成主从式级联控制结构,与CPU相连的称为主片,下一层的称为从片,从片中断请求信号INT与主片的IRQ2相连.
中断初始化编程时,当用主片中IRQ0~IRQ7时,只须在屏蔽寄存器中打开相应中断,在中断服务程序中,中断结束后,发一次中断结束命令EOI;而涉及从片中IRQ7~IRQ15高号中断时,除在从片中的屏蔽寄存器中打开相对应的中断,还须打开主片中的IRQ2,且在中断服务程序中中断结束时,要发2次EOI命令,分别使主片和从片执行中断结束命令.下面就IRQ11的初始化和中断服务程序处理给出Turbo C的源代码编程说明.
首先说明一个中断指针oldvect以保存原来的中断向量,在中断服务程序ser_program()结束后,分别向主片和从片的中断控制寄存器ICR送中断结束信号EOI.
中断初始化时要先保存IRQ11对应的地址73H存储的原中断向量,然后将自己的中断服务程序入口地址装入,再分别打开主片IRQ2和从片IRQ11.
最后,不要忘记在程序关闭前关中断和恢复原中断向量.
4 应注意的问题
在实际应用时,应该考虑以下问题:
(1)设置中断向量,以保证CPU执行中断服务程序时有一个正确的入口地址.可使用C语言的库函数setvect()和getvect()对中断向量进行设置和读取.
(2)中断服务程序什么时候结束,CPU无法知道,8259中断控制器也无法知道,必须通过指令通知8259中断控制器.对于PC机,这条指令就是向端口地址20H写入一个命令字20H.
(3)为保证通讯的可靠性以及不耽误CPU响应其他中断,中断服务程序应尽量短,一些费时的操作如数据存盘等应放在中断服务程序以外.
(4)在把一个数据写入发送保持寄存器(THR)之前,必须检查线路状态寄存器LSR,以保证发送保持寄存器为空.
(5)初始化中断系统时,应该关闭中断,初始化完成后再开放.可使用C语言的库函数disable()和enable()来完成.
5 结 论
较全面地介绍了DOS平台下多串口通讯的软、硬件的原理和过程,提出的方案确保了中断请求的无漏检测和服务,并有效解决了多个串口共享同一中断源时所造成的冲突和丢失等问题.由于已成功应用于实际项目中,表明方案是可行、有效的.
摘要:DOS系统由于技术成熟等优点在嵌入式操作系统领域始终占据着重要的地位,因此大部分的嵌入式计算机的程序设计都是在DOS平台上完成的.介绍了如何通过直接对INS8250的内部寄存器操作来实现串行通讯,以及多串口通讯在DOS平台上的中断服务函数的程序设计,并解决了多串口通讯的高号中断问题.
关键词:多串口,串行通讯,中断
参考文献
[1]徐海燕,付炎.嵌入式系统技术与应用[M].北京:机械工业出版社,2002:7-18.
[2]龚建伟,熊光明.串口通信编程实践[M].北京:电子工业出版社,2005:169-195.
【VB中串口通讯的实现】推荐阅读:
单片机串口通信实验10-17
安全的通讯稿12-12
读书活动的通讯稿12-13
团日活动的通讯稿01-15
通讯分场的工作总结06-12
迎接校园检查的通讯稿01-10
基层通讯员的作用03-08
文艺演出的通讯稿03-08
数学公开课的通讯稿07-11
通讯稿:新闻通讯稿写法09-19