求助vb串口接收数据并显示

求助vb串口接收数据并显示,第1张

Option Explicit

Dim a As Integer

Dim BytReceived() As Byte

Dim strData As String

Dim lenInput As Integer

Dim bytSendByte() As Byte'发送二进制数据

Dim strSendText As String'发送文本数据

Dim blnAutoSendFlag As Boolean

Dim openFlag As Boolean

Private Sub cmdClear_Click()

strData = ""

txtReceive = ""

End Sub

Private Sub cmdOpen_Click() '打开关闭端口

On Error GoTo Userr

If List1 <>"" And List2 <>"" And List3 <>"" And List3 <>"" And List3 <>"" Then

MSComm1.Settings = List2 &"," &List3 &"," &List5 &"," &List4

If openFlag Then

cmdOpen.Caption = "打开串口"

MSComm1.PortOpen = False '打开端口

Shape1.FillColor = vbRed

Else

MSComm1.CommPort = Val(List1)

MSComm1.PortOpen = True

cmdOpen.Caption = "关闭串口"

Shape1.FillColor = vbGreen

End If

End If

openFlag = Not openFlag

Exit Sub

Userr:

MsgBox ("Err号" &Err.Number &" 串口号错误或已打开!")

End Sub

Private Sub cmdSendASc_Click() '文本发送

Dim sj_Txt As String

sj_Txt = TxtSend

If MSComm1.PortOpen = True Then

MSComm1.Output = sj_Txt

End If

End Sub

Private Sub cmdSendHex_Click() '16进制发送

Dim sj() As Byte

Dim sj_Txt As String

Dim i As Integer

sj_Txt = TxtSend

If Len(TxtSend) Mod 2 = 0 And Len(TxtSend) <>0 Then '检验16进制字符串长

ReDim sj(Len(sj_Txt) / 2 - 1)

For i = 0 To Len(sj_Txt) - 1 Step 2

sj(i / 2) = Val("&H" &Mid(sj_Txt, i + 1, 2))

Next

If MSComm1.PortOpen = True Then

MSComm1.Output = sj

Else

MSComm1.PortOpen = True

Shape1.FillColor = vbGreen

MSComm1.Output = sj

End If

Else

MsgBox ("格式不对!")

End If

End Sub

'字符串表示的十六进制数据转化为相应的字节串,返回转化后的字节数

Private Sub Form_Load()

MSComm1.InputMode = comInputModeBinary '采用二进制传输

MSComm1.InBufferCount = 0 '清空接受缓冲区

MSComm1.OutBufferCount = 0 '清空传输缓冲区

MSComm1.RThreshold = 1 '产生MSComm事件

MSComm1.InBufferSize = 1024

TxtSend = ""

TxtSend = "" '800A00113135323634389794"

txtReceive = ""

Text2 = ""

End Sub

Private Sub List1_Click()

On Error GoTo useErr

If List1 <>"" And List2 <>"" And List3 <>"" And List3 <>"" And List3 <>"" Then

MSComm1.CommPort = Val(List1)

End If

useErr:

End Sub

Private Sub List2_Click()

If List1 <>"" And List2 <>"" And List3 <>"" And List3 <>"" And List3 <>"" Then

MSComm1.Settings = List2 &"," &List3 &"," &List5 &"," &List4

cmdOpen.Enabled = True

End If

End Sub

Private Sub List3_Click()

If List1 <>"" And List2 <>"" And List3 <>"" And List3 <>"" And List3 <>"" Then

MSComm1.Settings = List2 &"," &List3 &"," &List5 &"," &List4

cmdOpen.Enabled = True

End If

End Sub

Private Sub List4_Click()

If List1 <>"" And List2 <>"" And List3 <>"" And List3 <>"" And List3 <>"" Then

MSComm1.Settings = List2 &"," &List3 &"," &List5 &"," &List4

cmdOpen.Enabled = True

End If

End Sub

Private Sub List5_Click()

If List1 <>"" And List2 <>"" And List3 <>"" And List3 <>"" And List3 <>"" Then

MSComm1.Settings = List2 &"," &List3 &"," &List5 &"," &List4

cmdOpen.Enabled = True

End If

End Sub

Private Sub MSComm1_OnComm() '接收数据

Dim strBuff As String

Select Case MSComm1.CommEvent

Case 2

MSComm1.InputLen = 0

strBuff = MSComm1.Input

BytReceived() = strBuff

jieshou

lenInput = Len(strData)

Text2 = lenInput \ 2

'数据处理代码

End Select

End Sub

Public Function jieshou() '接收数据处理为16进制

Dim i As Integer

For i = 0 To UBound(BytReceived)

If Len(Hex(BytReceived(i))) = 1 Then

strData = strData &"0" &Hex(BytReceived(i))

Else

strData = strData &Hex(BytReceived(i))

End If

Next

txtReceive = strData

End Function

VB里面有串口控件MSComm。 使用比较简单的。

提供了两种处理通信问题的方法:一是事件驱动(Event-driven)方法,一是查询法。

1.MSComm控件两种处理通讯的方式

MSComm控件提供下列两种处理通讯的方式:事件驱动方式和查询方式。

1.1 事件驱动方式

事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。在许多情况下,在事件发生时需要得到通知,例如,在串口接收缓冲区中有字符,或者 Carrier Detect (CD) 或 Request To Send (RTS) 线上一个字符到达或一个变化发生时。在这些情况下,可以利用 MSComm 控件的 OnComm 事件捕获并处理这些通讯事件。OnComm 事件还可以检查和处理通讯错误。所有通讯事件和通讯错误的列表,参阅 CommEvent 属性。在编程过程中,就可以在OnComm事件处理函数中加入自己的处理代码。这种方法的优点是程序响应及时,可靠性高。每个MSComm 控件对应着一个串行端口。如果应用程序需要访问多个串行端口,必须使用多个 MSComm 控件。

1.2 查询方式

查询方式实质上还是事件驱动,但在有些情况下,这种方式显得更为便捷。在程序的每个关键功能之后,可以通过检查 CommEvent 属性的值来查询事件和错误。如果应用程序较小,并且是自保持的,这种方法可能是更可取的。例如,如果写一个简单的电话拨号程序,则没有必要对每接收一个字符都产生事件,因为唯一等待接收的字符是调制解调器的“确定”响应。

2.MSComm 控件的常用属性

MSComm 控件有很多重要的属性,但首先必须熟悉几个属性。

CommPort 设置并返回通讯端口号。

Settings 以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。

PortOpen 设置并返回通讯端口的状态。也可以打开和关闭端口。

Input 从接收缓冲区返回和删除字符。

Output 向传输缓冲区写一个字符串。

下面分别描述:

CommPort属性:设置并返回通讯端口号。

语法 object.CommPort[value ] (value 一整型值,说明端口号。)

说明 在设计时,value 可以设置成从 1 到 16 的任何数(缺省值为 1)。但是如果用 PortOpen 属性打开一个并不存在的端口时,MSComm 控件会产生错误 68(设备无效)。

注意:必须在打开端口之前设置 CommPort 属性。

RThreshold 属性:在 MSComm 控件设置 CommEvent 属性为 comEvReceive 并产生 OnComm 之前,设置并返回的要接收的字符数。

语法:object.Rthreshold [ = value ](value 整型表达式,说明在产生 OnComm 事件之前要接收的字符数。 )

说明:当接收字符后,若 Rthreshold 属性设置为 0(缺省值)则不产生 OnComm 事件。例如,设置 Rthreshold 为 1,接收缓冲区收到每一个字符都会使 MSComm 控件产生 OnComm 事件。

CTSHolding 属性:确定是否可通过查询 Clear To Send (CTS) 线的状态发送数据。Clear To Send 是调制解调器发送到相联计算机的信号,指示传输可以进行。该属性在设计时无效,在运行时为只读。

语法: object.CTSHolding(Boolean)

Mscomm 控件的 CTSHolding 属性设置值:

True Clear To Send 线为高电平。

False Clear To Send 线为低电平。

说明:如果 Clear To Send 线为低电平 (CTSHolding = False) 并且超时时,MSComm 控件设置 CommEvent 属性为 comEventCTSTO (Clear To Send Timeout) 并产生 OnComm 事件。

Clear To Send 线用于 RTS/CTS (Request To Send/Clear To Send) 硬件握手。如果需要确定 Clear To Send 线的状态,CTSHolding 属性给出一种手工查询的方法。

SThreshold 属性: MSComm 控件设置 CommEvent 属性为 comEvSend 并产生 OnComm 事件之前,设置并返回传输缓冲区中允许的最小字符数。

语法 object.SThreshold [ = value ] value 整形表达式,代表在 OnComm 事件产生之前在传输缓冲区中的最小字符数。

说明:若设置 Sthreshold 属性为 0(缺省值),数据传输事件不会产生 OnComm 事件。若设置 Sthreshold 属性为 1,当传输缓冲区完全空时,MSComm 控件产生 OnComm 事件。如果在传输缓冲区中的字符数小于 value,CommEvent 属性设置为 comEvSend,并产生 OnComm 事件。comEvSend 事件仅当字符数与 Sthreshold 交叉时被激活一次。例如,如果 Sthreshold 等于 5,仅当在输出队列中字符数从 5 降到 4 时,comEvSend 才发生。如果在输出队列中从没有比 Sthreshold 多的字符,comEvSend 事件将绝不会发生。

Handshake 常数

常数值 描述

comNone 0 无握手。

comXonXoff 1 XOn/Xoff 握手。

comRTS 2 Request-to-send/clear-to-send 握手。

comRTSXOnXOff 3 Request-to-send 和 clear-to-send 握手皆可。

OnComm 常数

常数值 描述

comEvSend 1发送事件。

comEvReceive 2 接收事件。

comEvCTS 3 clear-to-send 线变化。

comEvDSR 4 data-set ready 线变化。

comEvCD 5 carrier detect 线变化。

comEvRing 6 振铃检测。

comEvEOF 7 文件结束。

Settings 属性: 设置并返回波特率、奇偶校验、数据位、停止位参数。

语法: object.Settings[ = value]

说明:当端口打开时,如果 value 非法,则 MSComm 控件产生错误 380(非法属性值)。

Value 由四个设置值组成,有如下的格式:

"BBBB,P,D,S"

BBBB 为波特率,P 为奇偶校验,D 为数据位数,S 为停止位数。value 的缺省值是:

"9600,N,8,1"

InputLen 属性:设置并返回 Input 属性从接收缓冲区读取的字符数。

语法 object.InputLen [ = value]

InputLen 属性语法包括下列部分:

value 整型表达式,说明 Input 属性从接收缓冲区中读取的字符数。

说明:InputLen 属性的缺省值是 0。设置 InputLen 为 0 时,使用 Input 将使 MSComm 控件读取接收缓冲区中全部的内容。

若接收缓冲区中 InputLen 字符无效,Input 属性返回一个零长度字符串 ("")。在使用 Input 前,用户可以选择检查 InBufferCount 属性来确定缓冲区中是否已有需要数目的字符。该属性在从输出格式为定长数据的机器读取数据时非常有用。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/6735402.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-27
下一篇 2023-03-27

发表评论

登录后才能评论

评论列表(0条)

保存