VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)
首页 - 经验之谈 - MSComm 控件的二进制传输的方法
发表评论(0)作者:, 平台:, 阅读:14439, 日期:2000-05-11
怪头之家/Visual Basic 专栏/MSComm 二进位传输的方法之一




MsComm 二进码传输

Level One




假如您对 MSComm 的基本属性还不了解, 建议请先至MSComm 基本介绍一文中详读

怪头学程式的方法就是由别人所写的程式中学习, 再加以融会贯通.

每个的学习的方法都不一样, 怪头也只能用我会的方式, 来和大家讨论.

Part 1. 传输原则

 二进位传输和文字传输不同的是二进位传输须先转换为二进码. 用 Output 属性传输文字资料, 必须指定一个包含一个字串的 Variant. 传送二进位资料,

必须传递一个包含一个位元组阵列的 Variant 到 Output 属性, 一般来说, 如果传送一个 ANSI 字串到通讯埠, 可以以文字资料的型式来传送,

如果传送的资料包含嵌入控制字元; Null 字元等等的资料, 则要以二进位型式传送.

Part 2. 传送方式

 1. 定义二进位资料暂存区, 方式有二 :

  定义为位元组阵列变数 -- Dim Out() As Byte

  以 Variant 充当为位元组阵列 -- Dim Out As Variant

  (怪头几乎都用 Variant, 因为... 比较方便...)

 2. 准备位元组资料.

  假如您位元组资料是固定的, 您可以用 ChrB() 函数转换.

  如 : Out = ChrB(&HAB) & ChrB(&HCD) & ...

  又假如您位元组资料是非固定的, 您必须先确定此变数为整数并小于 256.

  若大于 256, 必须将之转为十六进位值, 再将之分为高位元及低位元, 再以 ChrB() 函数转换.

  如 : Out = ChrB(Left(Hex(i), Len(Hex(i)) - 2)) & ChrB(Right(Hex(i), 2))

 3. InputMode 属性设定 comInputModeText(0) 或 comInputModeBinary(1)

  其实此属性是 MsComm 接收的方式, 与送出无关.

  假如将它设为 comInputModeText 时, 也可以送出二进位资料.

 4. 再来就是送出资料.

  如 : MsComm1.Output = Out

Part 3. 综合以上说明, 怪头截取自己所写的 WinCMC 中的送出程式做为范例...

' 以下会用的变数有 StrSend, SendData 及 SendBin

' strSend 为 String 型式; SendData 为 Variant 型式;

' SendBin 则为 Byte 阵列型式

If Len(strSend) Mod 2 Then

strSend = "0" & strSend

End If

' 此行将小写转换为大写, 您也可以不加上去

strSend = UCase(strSend)

SendData = ""

For i = 1 To Len(strSend) Step 2

' Hex2Dec 函式是怪头自己写的函式, 其作用是将十六进位转换成十进位

' 函式内容如下...

' Function Hex2Dec(HexNum As String) As Long

' Dim HexNo As String

' Dim i As Integer

' Dim Addr As Integer

' HexNum = UCase(HexNum)

' HexNo = "0123456789ABCDEF"

' For i = 1 To Len(HexNum)

' Addr = InStr(HexNo, Mid(HexNum, i, 1))

' If Addr <> 0 Then

' Hex2Dec = Hex2Dec + ((16 ^ (Len(HexNum) - i)) * (Addr - 1))

' Else

' Hex2Dec = -1

' Exit Function

' End If

' Next i

' End Function

SendData = SendData & ChrB(Hex2Dec(Mid(strSend, i, 2)))

Next i

MsComm1.InputMode = comInputModeBinary

SendBin = SendData

Comm.Output = SendBin




Part 4. 接收方法

 接收的方法有二种, 在此怪头先以简单的方法说明.

 假如您认为此法不合您的胃口, MsComm 二进传输之二中会详细地说明另一种接收方法.

 接收方法和文字传输的接收方法大同小异, 只不过是判断的片段不一样而已...

Do While Not bStop

If MSComm1.InBufferCount Then

' 通讯埠中假如有资料的话, 则读取进来

InString = InString & MSComm1.Input

' 在此加入您所要做判断或显示

........

........

' 暂时把系统资源让出来给其它的程式使用

' 记得! 先做完您所要做的判断或显示等事后,

' 才加上 DoEvents 指令,

' 要不然接收进来的资料很容易遗失...

DoEvents

End If

End If

DoEvents

Loop



 

假如以上说明如有错误,欢迎各路高手指教