正文

串口通讯及其在VB平台下的实现2005-09-23 12:29:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/iamben250/5154.html

分享到:

串口通讯及其在VB平台下的实现
冯杰

  摘要:本文首先介绍串行通讯的基础知识,然后结合示例剖析在VB平台下的串口通讯的编程技巧。

  随着计算机系统的普及与外围设备技术的发展,计算机与外围设备之间的通讯就显得越来越重要了。由于串行通信是在一根传输线上一位一位的传送信息,所用的传输线少,并且可以借助现成的电话网进行信息传送,因此,特别适合于远距离传输。对于那些与计算机相距不远的人-机交换设备和串行存储的外部设备如终端、打印机、逻辑分析仪、磁盘等,采用串行方式交换数据也很普遍。在实时控制和管理方面,采用多台微机处理机组成分级分布控制系统中,各CPU之间的通信一般都是串行方式。所以串行接口是微机应用系统常用的接口,而相应的应用程序也成为今年来研究的热点。本文旨在阐述一般的穿口通讯的原理及其程序设计,希望借此能够抛砖引玉,为更深入的研究打下一定的基础。

  一、串行通讯的基本原理

  所谓"串行通信"是指外设和计算机间使用一根数据信号线,数据在一根数据信号线上按位进行传输,每一位数据都占据一个固定的时间长度。这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,当然,其传输速度比并行传输慢。相比之下,由于高速率的要求,处于计算机内部的CPU与串口之间的通讯仍然采用并行的通讯方式,所以串行口的本质就是实现CPU与外围数据设备的数据格式转换(或者称为串并转换器),即当数据从外围设备输入计算机时,数据格式由位(bit)转化为字节数据;反之,当计算机发送下行数据到外围设备时,串口又将字节数据转化为位数据。

  二、串口通讯的程序设计原理

  前面介绍了串行通讯的基本原理,那么如何在程序设计中实现它呢?事实上,这个过程并不复杂,一般有两种实现途径:其一就是使用MSCOMM控件,此控件提供很多方便操作的属性和方法,利用它们可以很方便地实现你的目的;另外一种途径就是使用Windows API,微软为开发者提供了很多相关的串行操作的编程接口,使用这些接口,可以很完成更为强大的功能。限于篇幅以及本文的宗旨,这里着重介绍第一种方法,第二种方法实际思路与第一种方法一样,不同的是它利用API函数代替了控件。

  无论使用哪一种途径,其基本的操作步骤大致一样的:首先初始化串口,比如端口号,波特率等属性,然后打开端口,通过接受缓冲区读上行数据,通过发送缓冲区来写下行数据。最后通过事件驱动来反映数据的到达与发送过程,另外在通讯过程中的错误的产生也可以通过CommEvent属性来管理。
 

  三、VB平台下的实现

  使用MSCOMM控件主要是通过事件来处理串行口的交互,即当数据到达时,控件的OnComm的事件就会来捕获或处理这些通讯事件。而OnComm事件也可以用来捕获和处理通讯错误。在实际应用中,一个MSCOMM控件就对应一个串行口,所以如果要处理多个串行口的话,必须有相应数量的控件与之对应。下面介绍一下此控件的主要属性:

  CommPort---------设置或者返回串行端口号

  Settings-------------用来设置和返回波特率,奇偶校验,数据位和结束位

  PortOpen----------设置或者返回通讯端口的状态,也可以打开和关闭一个端口

  Input----------------从接受缓冲区里获取或删除数据

  Output-------------给发送缓冲区里写数据

  另外对于OnComm事件来说,每当CommEvent的数值发生改变时就会产生这种事件,这就表明要么就是一个通讯事件的产生,要么是一个通讯错误产生。CommEvent属性里面包含了通讯事件或者产生的错误的编号。
那么为了能够更加清楚的说明上述问题,下面给出一个例程,例程要实现的功能很简单,就是在一个过程里给一个特定的串行口发送数据,然后在另外一个过程里实时检测此串行口以便一旦此串行口的发送缓冲区有数据就显示消息,如果发送空数据就会显示"无数据的字样"。界面如下:



  主要核心代码如下:

Private Sub Command1_Click()
If Text1.Text = "" Then
List1.AddItem "发送缓冲区无数据"
Exit Sub
End If
MSComm1.Output = Text1.Text
End Sub
Private Sub Command2_Click()
Unload Me
End Sub

'主要进行串口的初始化
Private Sub Form_Load()
'选择com1
MSComm1.CommPort = 1
'设置波特率为9.6kpbs,没有奇偶校验,8位数据位,1位结束位
MSComm1.Settings = "9600,N,8,1"
'读取全部的输入缓冲区
MSComm1.InputLen = 0
'端口打开
MSComm1.PortOpen = True
MSComm1.RThreshold = 10
MSComm1.SThreshold = 10
'以下就可以进行数据的发送了
End Sub

'所有的通讯事件都可以激发MSComm1控件的OnComm事件
Private Sub MSComm1_OnComm()
Select Case MSComm1.CommEvent
Case comEvReceive
'此处的代码可以进行当串口的接受缓冲区里有RThreshold个字符的处理
Case comEvSend
'此处的代码可以进行当串口的发送缓冲区里有SThreshold个字符的处理
List1.AddItem "发送缓冲区有数据"
End Select
End Sub

  四、小结

  虽然上面的例程实现的功能简单,但是从文中的分析不难看出,通过控件MSCOMM的input 和output属性可以很方便的接受和发送串口缓冲区的数据。当然要编制比较完善的通讯应用程序,还需要进行更深入的研究,比如通过使用"握手"的机制来增强通讯的安全性和稳定性,另外通过数据的重复的发送达到收发数据的准确性等等。这些方面希望读者在实际开发中多实践,以便能够满足实际的需要。

阅读(3300) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册