博文

VisualBasic4.0通信程序设计(2005-09-23 12:06:00)

摘要: VisualBasic4.0通信程序设计
南京 孙海健 潘文 钱俞寿
 龚建伟评论:本文对在VB4.0中使用ActiveX控件MSComm进行串口编程,给出了一个实例,因我不懂VB,无法评论其实用性,但经常有网友问及VB的串口编程,故我也放在这里,读者自已去看吧。

摘要:Visual Basic4.0 中通信控件及其在Windows平台下的通信软件设计方法,并结合具体实例给出了基本的通信程序。

关键词:Visual Basic MSCOMM.VBX通信控件 程序设计

1992年Crescent Software Inc.公司专为VB设计了MSCOMM.VBX用户通信控件,它提供了通过串口发送和接收数据的串行通信能力,不但包括了全部Windows API中关于串行通信的16个函数所完成的功能,而且开拓了更多的使用户设计方便的对象属性来满足不同用户不同业务的需求。目前国内众多的VB资料中很少涉及该通信控件的介绍,本文将详细介绍MSCOMM.VBX通信控件及编程方法,并结合工作中的一个实例给出基本通信程序。

1 MSCOMM.VBX通信控件描述

MSCOMM.VBX通信控件可直接从VB的ToolBox中加入窗体Form,即可用其进行通信。若ToolBox中无此控件,则用Tools的Custom Controls 将MSCOMM.VBX从Windows的System子目录中加入VB的ToolBox中。

1.1 通信方式

MSCOMM.VBX有2种不同的方式来处理和解决各类通信软件的开发和设计问题

1、事件驱动。它与C/C++写Windows 软件时的窗口回调函数类似,是1种功能强大的处理问题的方法。在实际工作中,往往要处理许多通信中的相关事件,例如:当线路数据到达本端或CD线和RTS信号线状态发生变化时,要求我们使用相应的事件来跟踪和处理,该控件是使用OnComm事件来实现的,它也包括检测和处理通信错误等方面的问题,CommEvent 值返回最近的通信事件或错误的数字代码。通信控件详细的错误和事件举例有:

MSCOMM-ER-BREAK 收到1个Break Signal

阅读全文(2229) | 评论:0

MSComm控件使用详解(2005-09-23 12:03:00)

摘要: MSComm控件使用详解
龚建伟:这篇东西来不及好好整理,因有朋友经常提及,先放在这里,如果有必要,再详细理顺一下,更为详细的信息请去看MSDN。
摘要:本文详细介绍了MSComm控件在串口编程中使用。
         目  次
MSComm控件两种处理通讯的方式
CommPort属性
RThreshold 属性
CTSHolding 属性
SThreshold 属性
CDHolding 属性
DSRHolding 属性
Settings 属性
InputLen 属性
EOFEnable 属性

Handshake 常数
OnComm 常数
InputMode 常数
错误消息


     MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。MSComm控件在串口编程时非常方便,程序员不必去花时间去了解较为复杂的API函数,而且在VC、VB、Delphi等语言中均可使用。 Microsoft Communications Control(以下简称MSComm)是Microsoft公司提供的简化Windows下串行通信编程的ActiveX控件,它为应用程序提供了通过串行接口收发数据的简便方法。具体的来说,它提供了两种处理通信问题的方法:一是事件驱动(Event-driven)方法,一是查询法。 1.MSComm控件两种处理通讯的方式 MSComm控件提供下列两种处理通讯的方式:事件驱动方式和查询方式。 
1.1 事件驱动方式 事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。在许多情况下,在事件发生时需要得到通知,例如,在串口接收缓冲区中有字符,或者 Carrier Detect (CD) 或 Request To Send (RTS) 线上一个字符到达或一个变化发生时。在这些情况下,可以利用 MSComm 控件的 OnComm 事件捕获并处理这些通讯事件。OnComm 事件还可以检查和处理通讯错误。所有通......

阅读全文(2541) | 评论:0

VB串口编程的几个问题(2005-09-23 12:01:00)

摘要: VB串口编程的几个问题
易兵 目次:

串口数据接收方式
如何处理不定长数据的接收
用字符方式收发码值大于127的字符数据
串口通讯问答2


串口数据接收方式

1、 在OnComm 事件中接收数据:
这种方式能充分MSCOMM控件的特性。OnComm 事件还可以检查和处理通讯错误;可以通过检查 CommEvent 属性的值来查询事件和错误;对于不定长数据以及对数据进行处理比较复杂的情况,此法不是很方便。

Private Sub MSComm_OnComm ()
Select Case MSComm1.CommEvent

' 错误
Case comEventBreak ' 收到 Break。
Case comEventCDTO ' CD (RLSD) 超时。
Case comEventCTSTO ' CTS Timeout。
Case comEventDSRTO ' DSR Timeout。
Case comEventFrame ' Framing Error
Case comEventOverrun '数据丢失。
Case comEventRxOver'接收缓冲区溢出。
Case comEventRxParity' Parity 错误。
Case comEventTxFull '传输缓冲区已满。
Case comEventDCB '获取 DCB] 时意外错误

' 事件
Case comEvCD ' CD 线状态变化。
Case comEvCTS ' CTS 线状态变化。
Case comEvDSR ' DSR 线状态变化。
Case comEvRing ' Ring Indicator 变化。
Case comEvReceive ' 收到 RThreshold # of chars.
Case comEvSend ' 传输缓冲区有 Sthreshold 个字符 '
Case comEvEof ' 输入数据流中发现 EOF 字符

End Select
End Sub

阅读全文(2666) | 评论:0

用VB进行串口实时数据采集(2005-09-23 12:00:00)

摘要: 用VB进行串口实时数据采集 长沙交通学院信息与计算科学系 (410077) 李湘江    ---- 本文介绍VB6.0利用MSComm通信控件,开发微机通过串口对工业仪表进行实时数据采集的编程技术。给出的程序代码具有通用性,并有详细的注释,可以直接或稍加改动后用于其他数据采集或实时控制程序中。 ----一台工业专用实时检测仪表,接高精度位移传感器,用于测量微小形变或微量位移,仪表测量精度为0.01毫米,测量范围最大值为50毫米。该仪表带有一个9针的RS-232C 串口,能与微机进行串口数据通信,实时传送检测数据,通过微机软件处理可实现工业实时监控。 ----该仪表的串口数据通信协议是:数据传输速率为 9600bps,1位开始位,8位数据位,1位停止位,无奇偶校验位。仪表每秒发送50帧检测数据,每帧数据由4个字节组成。第一个字节定义为二进制常数0F0H,是每帧数据开始的标志字节;后面连续2个字节为数据字节,采用压缩的BCD码编码方式,高位在前,低位在后,即一个字节表示两位十进制数,则两个字节表示四位十进制数,小数点采用固定形式,定义在两字节中间;第四个字节为符号字节,该字节第八位为1,即: ----则为负数;第八位为0,即: ----则为正数。 ----例如:0F0H 26H 87H 80H 0F0H 34H 62H 00H 表示 -26.87 34.62。 ----通信传输速率为9600bps,则最快速度1.04ms发送一个字节,仪表每秒发送50帧数据,每帧数据有4个字节,即每秒发送200个字节,平均5.0ms 发送一个字节,连续读取串口数据时要在程序中添加循环等待程序。 ----为了实现实时监测功能,接收数据的读取要尽可能的快速,则设置MSComm1的属性如下: RThreshold = 1 接收缓冲区收到一个字节产生OnComm事件 InputLen = 1 每次读取一个字节 ----仪表每秒发送50帧数据,微机收到一帧完整数据至少需要20 ms时间,然后再进行数据处理。如果微机在下一帧数据接收前即20ms内能将数据计算处理完毕,则接收缓冲区内只会保存有一帧数据,不会存有两帧以上数据,接收缓冲区的大小不会影响实时监测效果(接收缓冲区>4字节......

阅读全文(2893) | 评论:0

Pocket PC: Migrating a GPS (2005-09-22 21:40:00)

摘要: Pocket PC: Migrating a GPS App from the Desktop to eMbedded Visual Basic 3.0 Joshua Trupin This article assumes you're familiar with Visual Basic Level of Difficulty     1   2   3  Download the code for this article: GPS.exe (42KB) SUMMARY A Global Positioning System (GPS) device captures lots of interesting information that can be used in many ways. This article presents a custom application built with Visual Basic that collects data from a GPS satellite and charts the course of a user relative to the satellite.
Such an application is obviously well suited for use on a handheld PC and porting the original application to eMbedded Visual Basic for Windows CE is described. The differences between Visual Basic and eMbedded Visual Basic, such as support for specific control and data types, are explained. Tips for dealing with reduced screen real estate on a handheld PC, debugging, and running in an emulator are also di......

阅读全文(2556) | 评论:0

利用Visual Basic 实现无线通讯(2005-09-22 21:14:00)

摘要: 利用Visual Basic 实现无线通讯 作者: 姜棣昭(中科院空间中心)   一、 概述 Visual Basic 是Mcrosoft公司推出的强有力的系列开发软件之一,而且以其实用、方便、快捷、开发周期短、广泛而强大的功能越来越被广大编程人员所亲赖,广为流传,似乎有些专业的编程人员放弃了Visaul C++ 而改用了Visaul Basic之类的RAD编程工具,尽管Visaul C++在灵活性、代码紧凑、运行速度快及底层开发等方面Visaul Basic无法比拟的,但编写C++应用程序过长的调试和开发周期确实有点不适应当今的应用程序开发环境。 在Visaul Basic开发工具中提供了大量的控件(或称控制、组件)供编程人员使用,可以方便的利用这些组件中的属性、方法、语言等以事件驱动方式开发应用程序,还可以利用WINDOWS SDK中的API中的应用程序接口等工具开发应用程序。VB还自带一个控件开发软件包CDK,利用CDK可以开发自己需要的Controls 。在通讯问题中我们可以使用VB提供的通讯控件或调用WINDOWS API通讯函数。 二、 VB串行通讯 利用VB开发通信程序主要的方法有两种,一是利用VB本身提供的控件(CONTRALS),另一种方法是利用WINDOWS API应用程序接口,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等均在 \Windows\system 子目录下的USER.EXE动态连接库中,在VB调用之前应该先在全局变量定义处声明API通讯函数、定义常量。 在我们的实践中,用VB 控件......

阅读全文(2248) | 评论:0

VB GPS 编程源程序(2005-09-22 21:02:00)

摘要: VB GPS 编程源程序 gisant 发表于 2005-3-18 9:31:56
Private Sub GPSComm_OnComm()
    On Error GoTo ErrHdl

    Dim oData As String
    Dim aData() As String
    Dim aDataLen As Integer
    Dim counter1 As Integer
    
    oData = CStr(GPSComm.Input)
    
    If Mid(oData, 1, 1) <> "$" Then
        Exit Sub
    End If
    
    aData = Split(oData, vbCrLf)
    aDataLen = 8
    
    For counter1 = 1 To aDataLen Step 1
      If Len(aData(counter1)) < 6 Then
        Exit For
 ......

阅读全文(2389) | 评论:0

VB_窗口固定(2005-09-22 20:46:00)

摘要: VB_窗口固顶 点击数:6    发布日期:2005-4-16 9:45:00   【评论】【打印】【收藏此页到365Key】


      Option Explicit

    Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long

    Private Const HWND_TOPMOST& = -1
    ' 将窗口置于列表顶部,并位于任何最顶部窗口的前面
    Private Const SWP_NOSIZE& = &H1
    ' 保持窗口大小
    Private Const SWP_NOMOVE& = &H2
    ' 保持窗口位置

    Private Sub Form_Load()
        SetWindowPos Me.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE
        ' 将窗口设为总在最前
   &n......

阅读全文(3336) | 评论:0

VB必藏小技巧(2005-09-22 20:45:00)

摘要: VB_小技巧
 
  获取X字符串包含字母“B”的数量,最简单方法===========================
    UBound(Split(x, "B"))

剪贴板相关===========================================================

  '全选
  Private Sub mnuSelectAll_Click()
  RichTextBox1.SelStart = 0
  RichTextBox1.SelLength = Len(RichTextBox1.Text)
  End Sub
  
  '粘贴
  Private Sub mnuPaste_Click()
  RichTextBox1.SelText = Clipboard.GetText
  End Sub
  
  '查找
  Private Sub mnuFind_Click()
  sFind = InputBox("请输入要查找的字、词:", "查找内容", sFind)
  RichTextBox1.Find sFind
  End Sub
  
  '继续查找
  Private Sub mnuFindOn_Click()
  RichTextBox1.SelStart = RichTextBox1.SelStart + RichTextBox1.SelLength + 1
  RichTextBox1.Find sFind, , Len(RichTextBox1)
  End Sub


TextBox操作==========================================================

1、限制只能输入数字

参考下列程序:
Sub Text1_KeyPress(KeyAscii As Integer)
If K......

阅读全文(2215) | 评论:0

身份证号码校验位计算函数(VB版)(2005-09-22 20:43:00)

摘要: 身份证号码校验位计算函数(VB版) 点击数:443    发布日期:2005-7-8 9:24:00   【评论】【打印】【收藏此页到365Key】


  function fcs(s)'s为17位号码,含“19”,仅返回最后的校验位
sum1 = Mid(s, 1, 1) * 7 + Mid(s, 2, 1) * 9 + Mid(s, 3, 1) * 10 + Mid(s, 4, 1) * 5 + Mid(s, 5, 1) * 8 + Mid(s, 6, 1) * 4 + Mid(s, 7, 1) * 2 + Mid(s, 8, 1) + Mid(s, 9, 1) * 6 + Mid(s, 10, 1) * 3 + Mid(s, 11, 1) * 7 + Mid(s, 12, 1) * 9 + Mid(s, 13, 1) * 10 + Mid(s, 14, 1) * 5 + Mid(s, 15, 1) * 8 + Mid(s, 16, 1) * 4 + Mid(s, 17, 1) * 2
Select Case sum1 Mod 11
Case 0
fcs = "1"
Case 1
fcs = "0"
Case 2
fcs = "x"
Case 3
fcs = "9"
Case 4
fcs = "8"
Case 5
fcs = "7"
Case 6
fcs = "6"
Case 7
fcs = "5"
Case 8
fcs = "4"
Case 9
fcs = "3"
Case 10
fcs = "2"
End Select
end function......

阅读全文(2533) | 评论:0