VB中实现9位数据格式的串行通信

IT商界

  在多机通信中经常要用到9位数据格式的串行通信,而第9位数据则通常用于区分地址帧与数据帧,一般第9位是1的数据为地址,第9位是0的则为数据。异步串行通信的数据格式是:起始位+数据+奇偶校验位+停止位。其中,起始位1位;数据位位7位或者8位;奇偶校验位0或者1位;停止位1、1.5、或者2位。PC机上要传输9位数据的串行通信,可以通过设置奇偶检验位来实现。

  一、VB中串行通信的编程

  VB中可以使用MSCOMM控件实现串行通信。具体步骤如下:

  1.新建一个工程。

  2.在工具箱右击,选择“部件”,将“Microsoft Comm Control 6.0”选上。

  3.在Form1中加入MSComm1、Command1、Text1。

  4.初始化。

  Private Sub Form_Load()

  Me.MSComm1.CommPort=1 'COM1

  '波特率9600,无奇偶检验,8位数据,一位停止位

  Me.MSComm1.Setting="9600,n,8,1"

  '输入缓冲区有一个字节数据就触发OnComm事件

  Me.MSComm1.RThreshold = 1

  Me.MSComm1.InputLen = 1 '接收长度为1个字节

  '二进制接收方式

  Me.MSComm1.InputMode = comInputModeBinary

  Me.MSComm1.PortOpen = True '打开串口

  End Sub

  5.发送数据。

  Private Sub Command1_Click()

  '发送的数据定义成Byte型数据

  Dim DataToSend(1 To 100) As Byte

  Dim i As Integer

  For i = 1 To 100 '假设发送数据1 到 100

  DataToSend(i) = i

  Next i

  Me.MSComm1.Output = DataToSend '发送数据

  End Sub

  6.接收数据。

  Private Sub MSComm1_OnComm()

  Dim DataReceive() As Byte

  Select Case Me.MSComm1.CommEvent

  Case comEvReceive: '接收到数据

  DataReceive = Me.MSComm1.Input '接收数据

  '显示数据

  Me.Text1.Text = CStr(DataReceive(0))

  Case Else:

  '其它事件处理

  End Select

  End Sub

  二、第9位数据的实现

  奇偶检验中有MASK和SPACE两个值,当设置成MASK时输出的数据中奇偶检验位始终为1,如果设置为SPACE则输出的数据的奇偶检验位始终为0,因而可以通过这种方式来实现9位数据格式的传输。

  1.发送第9位为1的数据。

  Private Sub sendaddress(ByVal address As Byte)

  Dim tmp(1 To 1) As Byte

  tmp(1) = address

  If Me.MSComm1.PortOpen=True Then

  Me.MSComm1.PortOpen = False '修改设置前必须先关闭串口

  End if

  Me.MSComm1.Settings = "9600,m,8,1" '修改设置

  Me.MSComm1.PortOpen = True

  Me.MSComm1.Output = tmp

  End Sub

  2.发送第9位为0的数据。

  发送第9位为0的数据只要将上面的设置改为“9600,s,8,1“就可以了。

  Private Sub senddata(ByVal data As Byte)

  Dim tmp(1 To 1) As Byte

  tmp(1) = data

  If Me.MSComm1.PortOpen=True Then

  Me.MSComm1.PortOpen = False '修改设置前必须先关闭串口

  End if

  Me.MSComm1.Settings = "9600,s,8,1" '修改设置

  Me.MSComm1.PortOpen = True

  Me.MSComm1.Output = tmp

  End Sub

  通过sendaddress、senddata就可以对数据进行简单的打包传输了。

  以上代码在VB6.0中测试通过,且在笔者的直流电流传感器的调试中使用过。