请问用scomm控件的mscomm1.output()如何发送二进制码?

时间:2021-12-08 20:58:53
在和单片机通讯的时候需要发送二进制码,请问如何发送0,1?

mscomm1.output="01010101"可以么?  一次发送一帧。一帧包括8个数据位。

5 个解决方案

#1


dim  outinfo  as  byte
outinfo=&h十六进制代码
mscomm.output=outinfo

#2


把你要发送的0和1按每8位组合成一个字节发送就可以了
其实你那一句mscomm1.output="01010101"相当于
发送了8个字节,就是0和1的ASCII码,因为UniCode的缘故,准确地说
发送了16个字节,单片机如果不能解释UniCode你就需要发送非UniCode的代码.
最好使用字节数组.dim byteArray() as byte
mscomm控件可以直接发送字节数组 ko

#3


MSComm1.CommPort = 1                        '采用COM端口
        MSComm1.InputMode = comInputModeBinary      '采用二进制传输   !!!
        MSComm1.NullDiscard = False                 'NULL字符从端口传送到接受缓冲区
        MSComm1.DTREnable = False                   'DTR线无效
        MSComm1.EOFEnable = False                   '不寻找EOF符
        MSComm1.RTSEnable = False                   'RTS线无效
        MSComm1.InBufferCount = 0                   '清空接受缓冲区
        MSComm1.OutBufferCount = 0                  '清空传输缓冲区
        MSComm1.SThreshold = 1                      '如果传输缓冲区完全空时产生MSComm事件
        MSComm1.RThreshold = 1                      '获得一个字节则产生MSComm事件
        MSComm1.InBufferSize = 1024

 Dim MyArray(0 To 6) As Byte         '这是我做的系统的一段代码
    Dim strBCD As String
    
    strBCD = Trim(Format(lngNum, "00000"))
    
    MyArray(0) = &HAC
    MyArray(1) = Val(Mid(strBCD, 1, 1)) * 16 + Val(Mid(strBCD, 2, 1))
    MyArray(2) = MyArray(1)
    MyArray(3) = Val(Mid(strBCD, 3, 1)) * 16 + Val(Mid(strBCD, 4, 1))
    MyArray(4) = MyArray(3)
    MyArray(5) = Val(Mid(strBCD, 5, 1)) * 16 + Val(ErrNo.StrNum)
    MyArray(6) = MyArray(5)
    
   If bCommFlag = False Then
      MSComm1.Output = MyArray                '发送车位数据到大屏
   End If

#4


一次发送一帧。一帧包括8个数据位 

应该这样说:帧是以字节为单位的,一般完整的帧包括帧头,帧地址,帧命令,帧数据,帧的校验的数据。

在发一个字节的数据的时候,发出的一般11个比特(位)1个起始位+ 8个数据位+一个校验位+停止位。

日本:数据位为7,其它西欧国家为8位。

#5


在MSComm_ONComm

 Case comEvReceive      '收到 RThreshold # of chars.
          tmrSendCar.Enabled = False          '一旦消息来到就停止发车位数据
          intDataNum = 0                      '超时计数清零
          
        
          Dim MyArray() As Byte
          Dim MyData As Variant
          Dim i As Integer
          Dim bErrorFlag As Boolean
          Static MyArrays(128) As Byte
          Static lngBytNum As Long
          MyData = MSComm1.Input
          MyArray = MyData
                    
          If MyArray(0) = &HAC Then
             lngBytNum = 0
             txtData.Text = ""
          End If
          
          For i = 0 To UBound(MyArray)
             MyArrays(lngBytNum) = MyArray(i)
             lngBytNum = lngBytNum + 1
             txtData.Text = txtData.Text + Format(Hex(MyArray(i)), "00") + " "
          Next i
          
          If lngBytNum >= 18 Then
            MSComm1.InBufferCount = 0   '清空接收缓冲区
            lngBytNum = 0
             
            If MyArrays(1) = MyArrays(2) And MyArrays(1) = &HB4 Then
               bErrorFlag = False
               For i = 0 To 7
                  If MyArrays(3 + i * 2) <> MyArrays(4 + i * 2) Then
                     bErrorFlag = True
                  End If
               Next i
               
               If bErrorFlag = False Then
                  For i = 0 To 3
                     NoNum(i).StrNum = Right(Hex(MyArrays(3 + i * 4)), 1) + Hex(MyArrays(5 + i * 4))
                  Next i
               End If
            
            End If
           End If

#1


dim  outinfo  as  byte
outinfo=&h十六进制代码
mscomm.output=outinfo

#2


把你要发送的0和1按每8位组合成一个字节发送就可以了
其实你那一句mscomm1.output="01010101"相当于
发送了8个字节,就是0和1的ASCII码,因为UniCode的缘故,准确地说
发送了16个字节,单片机如果不能解释UniCode你就需要发送非UniCode的代码.
最好使用字节数组.dim byteArray() as byte
mscomm控件可以直接发送字节数组 ko

#3


MSComm1.CommPort = 1                        '采用COM端口
        MSComm1.InputMode = comInputModeBinary      '采用二进制传输   !!!
        MSComm1.NullDiscard = False                 'NULL字符从端口传送到接受缓冲区
        MSComm1.DTREnable = False                   'DTR线无效
        MSComm1.EOFEnable = False                   '不寻找EOF符
        MSComm1.RTSEnable = False                   'RTS线无效
        MSComm1.InBufferCount = 0                   '清空接受缓冲区
        MSComm1.OutBufferCount = 0                  '清空传输缓冲区
        MSComm1.SThreshold = 1                      '如果传输缓冲区完全空时产生MSComm事件
        MSComm1.RThreshold = 1                      '获得一个字节则产生MSComm事件
        MSComm1.InBufferSize = 1024

 Dim MyArray(0 To 6) As Byte         '这是我做的系统的一段代码
    Dim strBCD As String
    
    strBCD = Trim(Format(lngNum, "00000"))
    
    MyArray(0) = &HAC
    MyArray(1) = Val(Mid(strBCD, 1, 1)) * 16 + Val(Mid(strBCD, 2, 1))
    MyArray(2) = MyArray(1)
    MyArray(3) = Val(Mid(strBCD, 3, 1)) * 16 + Val(Mid(strBCD, 4, 1))
    MyArray(4) = MyArray(3)
    MyArray(5) = Val(Mid(strBCD, 5, 1)) * 16 + Val(ErrNo.StrNum)
    MyArray(6) = MyArray(5)
    
   If bCommFlag = False Then
      MSComm1.Output = MyArray                '发送车位数据到大屏
   End If

#4


一次发送一帧。一帧包括8个数据位 

应该这样说:帧是以字节为单位的,一般完整的帧包括帧头,帧地址,帧命令,帧数据,帧的校验的数据。

在发一个字节的数据的时候,发出的一般11个比特(位)1个起始位+ 8个数据位+一个校验位+停止位。

日本:数据位为7,其它西欧国家为8位。

#5


在MSComm_ONComm

 Case comEvReceive      '收到 RThreshold # of chars.
          tmrSendCar.Enabled = False          '一旦消息来到就停止发车位数据
          intDataNum = 0                      '超时计数清零
          
        
          Dim MyArray() As Byte
          Dim MyData As Variant
          Dim i As Integer
          Dim bErrorFlag As Boolean
          Static MyArrays(128) As Byte
          Static lngBytNum As Long
          MyData = MSComm1.Input
          MyArray = MyData
                    
          If MyArray(0) = &HAC Then
             lngBytNum = 0
             txtData.Text = ""
          End If
          
          For i = 0 To UBound(MyArray)
             MyArrays(lngBytNum) = MyArray(i)
             lngBytNum = lngBytNum + 1
             txtData.Text = txtData.Text + Format(Hex(MyArray(i)), "00") + " "
          Next i
          
          If lngBytNum >= 18 Then
            MSComm1.InBufferCount = 0   '清空接收缓冲区
            lngBytNum = 0
             
            If MyArrays(1) = MyArrays(2) And MyArrays(1) = &HB4 Then
               bErrorFlag = False
               For i = 0 To 7
                  If MyArrays(3 + i * 2) <> MyArrays(4 + i * 2) Then
                     bErrorFlag = True
                  End If
               Next i
               
               If bErrorFlag = False Then
                  For i = 0 To 3
                     NoNum(i).StrNum = Right(Hex(MyArrays(3 + i * 4)), 1) + Hex(MyArrays(5 + i * 4))
                  Next i
               End If
            
            End If
           End If