首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

VB停关于串口通讯

2013-11-29 
VB下关于串口通讯刚开始接触VB。在串口通讯下执行以下代码,请各路大神解析下。一定要详细。谢谢Private Sub M

VB下关于串口通讯
刚开始接触VB。在串口通讯下执行以下代码,请各路大神解析下。一定要详细。谢谢

Private Sub MSComm1_OnComm()

    Dim i As Integer
    Dim Buf As Integer
    Dim strTemp As String
        
    buffer = MSComm1.Input
    
     Dim strRece As String   '串口接收的数据
     
    For i = 0 To UBound(buffer)
    
       strTemp = CStr(Hex(buffer(i)))
       
       If Len(strTemp) = 1 Then
        
          strRece = strRece + "0" + strTemp
          
       Else
       
          strRece = strRece + strTemp
          
       End If
       
    Next
    
     
 
  '  Text1 = Text1 + strRece + Chr(13) + Chr(10)

    If Len(strRece) >= 18 Then
  
     Call ShowData(strRece)
     
'       MSComm1.PortOpen = False
'      TimerForTingdun.Enabled = True
   
    ' Debug.Print strRece
  End If
  
  '此处 表示如果 对光感采集遮挡住归 0  就触发情景号
  
   ' If CStr(intData) <= 1 Then
        
         
         'If Buf <> intData Then 'intData 为光感值 比较两次获取的光感值不同就触发事件
        If intData <> Buf Then 'intData 为光感值 比较两次获取的光感值不同就触发事件
        
        Timer1.Enabled = False
        TimerForTingdun.Enabled = True
        
        ConnOpen
        connSql.Execute "usp_CallSceneStep " & m_iqjh
        MsgBox ("存储过程执行成功!") '2013-11-11
        ConnClose
    
       intData = Buf  '光感值 = 当前光感值
      Else
        intData = Buf
        MsgBox ("两次值相等!") '2013-11-15
        Timer1.Enabled = True
        TimerForTingdun.Enabled = False
      End If
            
   Debug.Print intData, Buf
   
   Exit Sub
  
End Sub
'2013-11-11设法获取某一次和上一次strRece存储在变量中
'栈就是一种先进后出的数据结构
'堆是先进先出的数据结构

  
 '显示光感值
 Private Sub ShowData(strData As String) '注释于2013-11-07
 'Dim intData  As Integer
 Dim sT As String
' sT = Left(strData, 10)
' sT = Right(sT, 2)
'    sT = Left(strData, 2)

    Dim sql As String
    Dim ssss As String

   ' Debug.Print Now & "--" & strData


    intData = "&H" + Mid$(strData, 9, 2) '获取光感值 从第9个开始截取2个字符, 十六进制转化成十进制整数可以输出光感值 05 03 04 00 1A 00 00 9E 34
    'ssss = Format(CStr(intData / 10), "0.0")

    Label1.Caption = CStr(Now()) + " 光感值:" + CStr(intData)  'Format(CStr(intData / 10), "0.###") '此句显示出当前的光感值 整数
    
           
 End Sub
VB 串口


[解决办法]

Private Sub MSComm1_OnComm()

    Dim i As Integer
    Dim Buf As Integer
    Dim strTemp As String
    Dim strRece As String   '串口接收的数据  

    '所有变量声明都要在代码之前      
    buffer = MSComm1.Input  '这句将 MSComm 接收到的数据从缓存提取到 buffer 数组(要事先声明)。

    '下面这段,将数组数据转换为十六进制串
    For i = 0 To UBound(buffer)
       '我喜欢用下面的一个语句替代循环中他原来下面的整段代码
        'strRece = strRece & Right("0" & Hex(buffer(i)), 2)    
    
       strTemp = CStr(Hex(buffer(i))) '他首先将一个字节转换成 16 进制字符串,CStr 是多余的。因为 Hex 函数本身就是转换成 16 进制字符串。

       If Len(strTemp) = 1 Then '如果转换出 1 个字符(<16),就要加前缀 0 来补齐到 2 个字符
        
          strRece = strRece + "0" + strTemp '好的编程习惯是用字符串连接符 & 来取代 + 号
          
       Else
       
          strRece = strRece + strTemp
          
       End If
       
    Next
    
     
 
  '  Text1 = Text1 + strRece + Chr(13) + Chr(10)

    If Len(strRece) >= 18 Then '如果接收到 9 个以上字节
  
       Call ShowData(strRece) '这里他调用子程序将接收到的数据显示在 Label 中,并将 strRece 中的第 9-10(第 5 字节)放到另一个变量中
        'intData = "&H" + Mid$(strData, 9, 2)
        'Label1.Caption = CStr(Now()) & " 光感值:" & intData
     
'       MSComm1.PortOpen = False
'      TimerForTingdun.Enabled = True
   
    ' Debug.Print strRece
    End If
  
  '此处 表示如果 对光感采集遮挡住归 0  就触发情景号
  
   ' If CStr(intData) <= 1 Then
         
         'If Buf <> intData Then 'intData 为光感值 比较两次获取的光感值不同就触发事件
    If intData <> Buf Then 'intData 为光感值 比较两次获取的光感值不同就触发事件
        
        Timer1.Enabled = False
        TimerForTingdun.Enabled = True
        
        ConnOpen
        connSql.Execute "usp_CallSceneStep " & m_iqjh
        MsgBox ("存储过程执行成功!") '2013-11-11
        ConnClose
    
        intData = Buf  '光感值 = 当前光感值 '这句是错误的,应该如下句
        'Buf = intData
    Else
        intData = Buf '这句是多余的
        MsgBox ("两次值相等!") '2013-11-15
        Timer1.Enabled = True
        TimerForTingdun.Enabled = False
    End If
            
   Debug.Print intData, Buf
   
   Exit Sub
  
End Sub
'2013-11-11设法获取某一次和上一次strRece存储在变量中
'栈就是一种先进后出的数据结构
'堆是先进先出的数据结构

  
 '显示光感值
Private Sub ShowData(strData As String) '注释于2013-11-07


 'Dim intData  As Integer
    Dim sT As String
' sT = Left(strData, 10)
' sT = Right(sT, 2)
'    sT = Left(strData, 2)

    Dim sql As String
    Dim ssss As String

   ' Debug.Print Now & "--" & strData


    intData = "&H" + Mid$(strData, 9, 2) '获取光感值 从第9个开始截取2个字符, 十六进制转化成十进制整数可以输出光感值 05 03 04 00 1A 00 00 9E 34
    'ssss = Format(CStr(intData / 10), "0.0")

    Label1.Caption = CStr(Now()) + " 光感值:" + CStr(intData)  'Format(CStr(intData / 10), "0.###") '此句显示出当前的光感值 整数
    
           
End Sub


代码写得有点“邋遢”。

热点排行