难道真的没有--人

gongwen 2002-01-26 11:09:41
动态获取com口数据
串口编程
能提供资料者定给分

...全文
57 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
jett 2002-01-26
  • 打赏
  • 举报
回复
收藏
jiandan 2002-01-26
  • 打赏
  • 举报
回复
vb5.0自带的帮助里也有。中文的。
msdn里也有
大帮手软件 2002-01-26
  • 打赏
  • 举报
回复
微软最简单的例子,其帮助文件中有详细用法说明,到msdn中查找就可以,很详细。
The following simple example shows basic serial communications using a modem:

Private Sub Form_Load ()
' Buffer to hold input string
Dim Instring As String
' Use COM1.
MSComm1.CommPort = 1
' 9600 baud, no parity, 8 data, and 1 stop bit.
MSComm1.Settings = "9600,N,8,1"
' Tell the control to read entire buffer when Input
' is used.
MSComm1.InputLen = 0
' Open the port.
MSComm1.PortOpen = True
' Send the attention command to the modem.
MSComm1.Output = "ATV1Q0" & Chr$(13) ' Ensure that
' the modem responds with "OK".
' Wait for data to come back to the serial port.
Do
DoEvents
Buffer$ = Buffer$ & MSComm1.Input
Loop Until InStr(Buffer$, "OK" & vbCRLF)
' Read the "OK" response data in the serial port.
' Close the serial port.
MSComm1.PortOpen = False
End Sub

Note The MSComm control can use polling or an event-driven method to retrieve data from the port. This simple example uses the polling method. For an example of the event-driven method, see help for the OnComm event.

Jneu 2002-01-26
  • 打赏
  • 举报
回复
使用 Communications 控件


Communications 控件可以用来提供简单的串行端口通讯功能,也可以用来创建功能完备(full-featured)、事件驱动的高级通讯工具。

Communications 控件



Communications 控件提供了一系列标准通讯命令的使用界面。使用它可以建立与串行端口的连接,通过串行端口连接到其它通讯设备(例如调制解调器),发出命令,交换数据,以及监视和响应串行连接中发生的事件和错误。

用途
拨打电话号码。


监视串行端口的输入数据。


创建功能完备的终端程序。
示例应用程序:Dialer.vbp 和 VBTerm.vbp
Dialer.vbp 和 VBTerm.vbp 示例应用程序位于 Visual Basic CD-ROM 的 Program Files\Microsoft Visual Studio\Common\Samples\vb directory 目录中,它们分别演示了 Communications 控件的简单编程技术和复杂编程技术。

串行通讯的基本知识
每台计算机都提供了一个或多个串行端口。它们被依次命名为:COM1、COM2 等等。在标准的 PC 中,鼠标通常被连接到 COM1 端口。调制解调器可能连接到 COM2,扫描仪被连接到 COM3,等等。串行端口提供了计算机与这些外部串行设备之间的数据传输通道。

串行端口的本质功能是作为 CPU 和串行设备间的编码转换器。当数据从 CPU 经过串行端口发送出去时,字节数据被转换为串行的位。在接收数据时,串行的位将被转换为字节数据。

要完成数据的传输,还需要进一步一个解释层。在操作系统一边,Windows 使用了通讯驱动程序 Comm.drv,以便使用标准的 Windows API 函数发送和接收数据。驱动程序通常由串行设备制造商提供,以便将其硬件与 Windows 连接。在使用 Communications 控件时,实际上使用了 API 函数,API 函数将被 Comm.drv 解释并传输给设备驱动程序。

作为程序员,只需关心如何与 Windows 打交道。作为 Visual Basic 程序员,只需要关心 Communications 控件提供的对 Windows 通讯驱动程序的 API 函数的接口。换句话说,只需要设置和监视 Communications 控件的属性和事件。

建立串行端口连接
使用 Communications 控件的第一步是建立与串行端口的连接。下表列出了用于建立串行端口连接的属性:

属性 描述
CommPort 设置或返回通讯端口号。
Settings 以字符串形式设置或返回波特率、奇偶校验、数据位和停止位。
PortOpen 设置或返回通讯端口的状态。以及打开和关闭端口。


打开串行端口
要打开串行端口,可以使用 CommPort、PortOpen 和 Settings 属性。例如:

'打开串行端口
MSComm1.CommPort = 2
MSComm1.Settings = "9600,N,8,1"
MSComm1.PortOpen = True

CommPort 属性确定打开哪个串行端口。假如 COM2 上连接有一个调制解调器,则在上面的例子中需要将值设置为 2 (COM2) 才能连接到该调制解调器。CommPort 属性值可以设置为 1 到 16 之间的任何值(缺省值为 1),然而,如果将该值设置为系统中并不存在的 COM 端口,将会产生错误。

Settings 属性可以用来指定波特率、奇偶校验、数据位数和停止位数。按照缺省规定,波特率被设置为 9600。奇偶校验设置为了进行数据校验。这通常是不用的,并设置为“N”。数据位数指定了代表一个数据块的比特数。停止位指出了何时接收到一个完整数据块。

在指定了要打开的端口,以及如何进行数据通讯之后,就可以使用 PortOpen 属性建立连接了。它是一个布尔值,即取值范围为 True 或 False。然而,如果端口无效,或者 CommPort 属性设置有误,或者该设备不支持指定的设置,就会产生错误;即使没有产生错误,外部设备也不能正常工作。将 PortOpen 属性设置为 False 即可关闭该端口。

操作调制解调器
在绝大多数情况下,使用 Communications 控件的目的是为应用程序提供对调制解调器的操作。利用 Communications 控件,可以使用标准的 Hayes 兼容的命令集拨打电话号码,或连接到另一调制解调器,并与它进行交互操作。

用 CommPort、Settings 和 PortOpen 属性建立了串行端口连接之后,就可以使用 Output 属性激活该调制解调器,并与它进行交互操作。Output 属性用来发出命令,控制调制解调器之间的交互操作。如下所示:

'激活调制解调器,并拨打电话号码。
MSComm1.Output = "ATDT 555-5555" & vbCr

在上面的示例中,“AT”命令初始化连接,“d”进行拨号,“T”指定使用音频(而不是脉冲)。在输出到终端时必须指定回车符 (vbCr)。在输出字节数组时,无须添加返回字符。

如果命令被正确处理,返回的结果码将是“确定”。检查该结果码即可确定命令是否被正确处理。

详细信息 要得到完整的 Hayes 兼容的命令列表,请查看调制解调器的文档。

在设计时设置接收和发送缓冲区属性
在端口被打开后,就创建了接收和发送缓冲区。为了管理这些缓冲区,Communications 控件提供了一系列属性,在设计时可以通过该控件的“属性页”设置这些属性。

在设计时设置缓冲区属性



缓冲区内存分配
InBufferSize 和 OutBufferSize 属性指定了为接收和发送缓冲区分配的内存数量。按照缺省规定,它们被分别设置为上图所示的值。这两个值设置得越大,应用程序中可用的内存就越少。然而,如果缓冲区太小,就要冒缓冲区溢出的风险,除非采用握手信号。

注意 鉴于现在大多数微机可用的内存量,由于有更多的可用资源,缓冲区内存分配已不那么至关紧要了。换言之,可以把缓冲区的值设得高一些而不影响应用程序的性能。

RThreshold 和 SThreshold 属性
RThreshold 和 SThreshold 属性,表示在 OnComm 事件发生之前,接收缓冲区或发送缓冲区中可以接收的字符数。OnComm 事件被用来监视和响应通讯状态的变化。如果将每个属性的值都设置为零 (0),就可以避免发生 OnComm 事件。如果将该值设置为非零的值(比如 1),那么每当缓冲区中接收到一个字符时,就会产生 OnComm 事件。

详细信息 有关这些属性的详细信息,请参阅本主题的“OnComm 事件和 CommEvent 属性”。

InputLen 和 EOFEnable 属性
如果把 InputLen 属性设置为 0,那么在使用 Input 属性时,Communications 控件将读出接收缓冲区中的所有内容。如果读取以定长的数据块的形式格式化了的数据时,则需要将该属性设置为合适的值。

EOFEnable 属性用来指出在输入数据期间何时发现的文件结束 (EOF) 字符。如果将该属性设置为 True,在发生这种情况的时候将导致输入停止,并且产生 OnComm 事件以通知用户。

详细信息 请参阅本主题的“管理接收和发送缓冲区”和“OnComm 事件和 CommEvent 属性”。

管理接收和发送缓冲区
如上面提到的,在打开端口以后,接收和发送缓冲区即被创建。接收和发送缓冲区用来保存传入的数据和传出的数据。为了使用户能够管理这些缓冲区,Communications 控件提供了一系列的属性,利用它们可以放置或获取数据、返回每个缓冲区大小、处理文本和二进制数据。如何正确地管理这些缓冲区是 Communications 控件应用中的一个重要课题。

接收缓冲区
Input 属性被用来保存和接收从接收缓冲区获取的数据。例如,如果希望从接收缓冲区获取数据,并将其显示在一个文本框中,可以使用下面的代码:

TxtDisplay.Text = MSComm1.Input

如果需要获得接收缓冲区的所有内容,就必须将 InputLen 属性设置为 0。这可以在设计时或运行时设置。

InputMode 属性可以设置为如下 Visual Basic 常数:comInputModeText 或 comInputModeBinary,即可分别以文本或二进制格式接收传入的数据。该数据将以字符串或 Byte 数组中的二进制数据格式访问。对 ANSI 字符集的数据应使用 comInputModeText;而对其它数据,比如嵌入了控件字符、空值等的数据,应使用 comInputModeBinary。

接收到的每一个字节都被移入接收缓冲区,同时 InBufferCount 属性加一。这样 InBufferCount 属性就可被用于获得接收缓冲区中字节的数目。将该属性的值设置为 0,即可清空接收缓冲区。

发送缓冲区
Output 属性被用来向发送缓冲区发出命令和数据。

与 Input 属性类似,数据可以以文本或二进制格式发送。Output 属性必须用字符串变体型发送文本,用 Byte 数组变体型发送二进制数据。

可用 Output 属性发送命令、文字字符串或 Byte 数组数据。例如:

'发送 AT 命令
MSComm1.Output = "ATDT 555-5555"

'发送文本字符串
MsComm1.Output = " This is a text string "

'发送 Byte 数组数据
MSComm1.Output = Out

如前面提到的,每发送一行必须以回车字符 (vbCr) 结束。在上例中,Out 被定义为 Byte 数组变体型:Dim Out() As Byte。假如它是字符串变体型,则应定义为:Dim Out() As String。

可用 OutBufferCount 属性监视发送缓冲区中的字节数目。将该值设置为 0 可将发送缓冲区清空。

握手
要保证数据传输成功,必须对接收和发送缓冲区进行管理。例如,要保证接收数据的速度不超出缓冲区的限制。

握手是指一种内部的通讯协议,通过它将数据从硬件端口传输到接收缓冲区。当串行端口收到一个字符时,通讯设备必须将它移入接收缓冲区中,使程序能够读到它。如果数据到达端口的速度太快,通讯设备可能来不及将数据移入接收缓冲区,握手协议保证不会由于缓冲区溢出而导致丢失数据。

设置 Handshaking 属性可以指定在应用程序中使用的握手协议。缺省情况下,该值被设置为空。然而,可将其设置为下面列出的其它协议:

设置值 值 描述
comNone 0 不使用握手协议(缺省)
comXOnXOff 1 XOn/XOff 握手。
comRTS 2 RTS/CTS (请求发送/清除发送) 握手。
comRTSXOnXOff 3 两者,RTS 握手和XOn/XOff 握手。


需要使用什么协议与连接到的设备有关。如果将该值设置为 comRTSXOnXOff,可以同时支持两种协议。

在许多情况中,通信协议本身能处理握手。因而,设置此属性为非 comNone 的其它一些值可能会导致冲突。

注意 如果将该值设置为 comRTS 或 comRTSXOnXOff,则需要将 RTSEnabled 属性设置为 True,否则虽然能够连接并发送数据,但不能接收数据。

OnComm 事件和 CommEvent 属性
根据应用程序的用途和功能,在连接到其它设备过程中,以及接收或发送数据过程中,可能需要监视并响应一些事件和错误。

可以使用 OnComm 事件和 CommEvent 属性捕捉并检查通讯事件和错误的值。

在发生通讯事件或错误时,将触发 OnComm 事件,CommEvent 属性的值将被改变。因此,在发生 OnComm 事件的时候,如果有必要,可以检查 CommEvent 属性的值。由于通讯(特别是通过电话线的通讯)是不可预料的,捕捉这些事件和错误将有助于使应用程序对这些情况作出相应的反应。

下表列出了可能触发 OnComm 事件的通讯事件。对应的值将在发生事件时被写入 CommEvent 属性。

常数 值 描述
ComEvSend 1 发送缓冲区中的字符数少于 SThreshold。
ComEvReceive 2 接收到 Rthreshold 个字符。在使用 Input 属性移去接收缓冲区中的数据之前,该事件将持续产生。
ComEvCTS 3 CTS 信号发生变化。
ComEvDSR 4 DSR 信号发生变化。该事件仅在 DSR 由 1 变为 0 时触发。
ComEvCD 5 CD 信号发生变化。
ComEvRing 6 检测到电话振铃。某些 UART(通用异步收发器)可能不支持本事件。
ComEvEOF 7 收到文件结束符(ASCII 字符 26)。


下列错误同样会触发 OnComm 事件,并且在 CommEvent 属性中写入相应的值。

设置值 值 描述
ComEventBreak 1001 收到 Break 信号。
ComEventFrame 1004 帧错误。硬件检测到帧错误。
ComEventOverrun 1006 端口超限。在下一个字符到达端口之前,前一字符还没有从硬件中读走,因而丢失。
ComEventRxOver 1008 接收缓冲区溢出。接收缓冲区已没有空间。
ComEventRxParity 1009 奇偶校验错误。硬件检测到奇偶校验错误。
comEventTxFull 1010 发送缓冲区满。在试图将字符传入发送缓冲区时,该缓冲区已满。
ComEventDCB 1011 在为端口获取设备控制块 (DCB) 时,发生不可预料的错误。

gongwen 2002-01-26
  • 打赏
  • 举报
回复
有没有mscomm,spcomm资料
给分
jiandan 2002-01-26
  • 打赏
  • 举报
回复
mscomm.ocx 控件有oncomm事件
有数据时触发
spcomm控件也可以啊

7,762

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧