热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

《串口编程调试代码》之二

《串口编程调试代码》之二主form**********************************字符表示的十六进制数转化为相应的整数错误则返回-1*

《串口编程调试代码》之二

主form 

'********************************** 
'字符表示的十六进制数转化为相应的整数 
'错误则返回  -1 
'********************************** 

Function ConvertHexChr(str As String) As Integer 
     
    Dim test As Integer 
     
    test = Asc(str) 
    If test >= Asc("0") And test <= Asc("9") Then
test = test - Asc("0")
ElseIf test >= Asc("a") And test <= Asc("f") Then
test = test - Asc("a") + 10
ElseIf test >= Asc("A") And test <= Asc("F") Then
test = test - Asc("A") + 10
Else
test = -1 '出错信息
End If
COnvertHexChr= test

End Function

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

Function strHexToByteArray(strText As String, bytByte() As Byte) As Integer

Dim HexData As Integer '十六进制(二进制)数据字节对应值
Dim hstr As String * 1 '高位字符
Dim lstr As String * 1 '低位字符
Dim HighHexData As Integer '高位数值
Dim LowHexData As Integer '低位数值
Dim HexDataLen As Integer '字节数
Dim StringLen As Integer '字符串长度
Dim Account As Integer '计数

strTestn = "" '设初值
HexDataLen = 0
strHexToByteArray = 0

StringLen = Len(strText)
Account = StringLen / 2
ReDim bytByte(Account)

For n = 1 To StringLen

Do '清除空格
hstr = Mid(strText, n, 1)
n = n + 1
If (n - 1) > StringLen Then 
                HexDataLen = HexDataLen - 1 
                 
                Exit For 
            End If 
        Loop While hstr = " " 
         
        Do 
            lstr = Mid(strText, n, 1) 
            n = n + 1 
            If (n - 1) > StringLen Then 
                HexDataLen = HexDataLen - 1 
                 
                Exit For 
            End If 
        Loop While lstr = " " 
        n = n - 1 
        If n > StringLen Then 
            HexDataLen = HexDataLen - 1 
            Exit For 
        End If 
         
        HighHexData = ConvertHexChr(hstr) 
        LowHexData = ConvertHexChr(lstr) 
         
        If HighHexData = -1 Or LowHexData = -1 Then     '遇到非法字符中断转化 
            HexDataLen = HexDataLen - 1 
             
            Exit For 
        Else 
             
            HexData = HighHexData * 16 + LowHexData 
            bytByte(HexDataLen) = HexData 
            HexDataLen = HexDataLen + 1 
             
             
        End If 
                         
    Next n 
     
    If HexDataLen > 0 Then                              '修正最后一次循环改变的数值 
        HexDataLen = HexDataLen - 1 
        ReDim Preserve bytByte(HexDataLen) 
    Else 
        ReDim Preserve bytByte(0) 
    End If 
     
     
    If StringLen = 0 Then                               '如果是空串,则不会进入循环体 
        strHexToByteArray = 0 
    Else 
        strHexToByteArray = HexDataLen + 1 
    End If 
     
     
End Function 

 


'********************************** 


Private Sub cboHexAscii_Click() 

     
     
    If frmMain.cboHexAscii.Text = "按ASCII码" Then 
        intOutMode = 0 
         
    Else 
        intOutMode = 1 
         
    End If 
         
End Sub 

Private Sub chkAddress_Click() 
     
    If chkAddress.Value = 0 Then 
        intAddressChk = 0 
    Else 
        intAddressChk = 1 
    End If 
     
    Call ScrollRedisplay 
     
End Sub 

Private Sub chkAddress48_Click() 
     
    If chkAddress48.Value = 1 Then 
        intAdd48Chk = 1 
    Else 
        intAdd48Chk = 0 
    End If 
     
    Call SlideRedisplay 
     
End Sub 

Private Sub chkAscii_Click() 
     
    If chkAscii.Value = 1 Then 
        intAsciiChk = 1 
    Else 
        intAsciiChk = 0 
    End If 
     
    Call ScrollRedisplay 
     
End Sub 

Private Sub chkHex_Click() 
     
    If chkHex.Value = 0 Then 
        intHexChk = 0 
    Else 
        intHexChk = 1 
    End If 
     
    Call ScrollRedisplay 
     
End Sub 

Private Sub cmdAutoSend_Click() 
     
    If blnAutoSendFlag Then 
         
        frmMain.ctrTimer.Enabled = False 
         
        If Not blnReceiveFlag Then 
            frmMain.ctrMSComm.PortOpen = False 
        End If 
         
        frmMain.cmdAutoSend.Caption = "自动发送" 
    Else 
        If Not frmMain.ctrMSComm.PortOpen Then 
            frmMain.ctrMSComm.CommPort = intPort 
            frmMain.ctrMSComm.Settings = strSet 
            frmMain.ctrMSComm.PortOpen = True 
        End If 
         
        frmMain.ctrTimer.Interval = intTime 
        frmMain.ctrTimer.Enabled = True 
        frmMain.cmdAutoSend.Caption = "停止发送" 
    End If 
         
     
         
    blnAutoSendFlag = Not blnAutoSendFlag 
     
     
End Sub 

Private Sub cmdClear_Click() 

    Dim bytTemp(0) As Byte 
     
    ReDim bytReceiveByte(0) 
    intReceiveLen = 0 
     
    Call InputManage(bytTemp, 0) 
     
    Call GetDisplayText 
    Call display 
     
     
End Sub 

Private Sub cmdManualSend_Click() 
     
    If Not frmMain.ctrMSComm.PortOpen Then 
        frmMain.ctrMSComm.CommPort = intPort 
        frmMain.ctrMSComm.Settings = strSet 
        frmMain.ctrMSComm.PortOpen = True 
    End If 
     
        Call ctrTimer_Timer 
         
    If Not blnAutoSendFlag Then 
     
    frmMain.ctrMSComm.PortOpen = False 
    End If 
     
End Sub 

Private Sub cmdReceive_Click() 
     
     
    If blnReceiveFlag Then 
         
        If Not blnAutoSendFlag And Not blnReceiveFlag Then 
            frmMain.ctrMSComm.PortOpen = False 
        End If 
         
        frmMain.cmdReceive.Caption = "开始接收" 
    Else 
         
        If Not frmMain.ctrMSComm.PortOpen Then 
            frmMain.ctrMSComm.CommPort = intPort 
            frmMain.ctrMSComm.Settings = strSet 
            frmMain.ctrMSComm.PortOpen = True 
        End If 
         
        frmMain.ctrMSComm.InputLen = 0 
        frmMain.ctrMSComm.InputMode = 0 
         
     
        frmMain.ctrMSComm.InBufferCount = 0 
        frmMain.ctrMSComm.RThreshold = 1 
        frmMain.cmdReceive.Caption = "停止接收" 
    End If 
     
    blnReceiveFlag = Not blnReceiveFlag 
     
         
End Sub 

Private Sub cmdSetting_Click() 
     
    dlgSetting.Show 
    dlgSetting.txtPort.Text = str(intPort) 
    dlgSetting.txtSetting.Text = strSet 
    dlgSetting.txtTime.Text = str(intTime) 


End Sub 

Private Sub ctrMSComm_OnComm() 
     
    Dim bytInput() As Byte 
    Dim intInputLen As Integer 
     
     
    Select Case frmMain.ctrMSComm.CommEvent 
         
         
        Case comEvReceive 
            If blnReceiveFlag Then 
             
                If Not frmMain.ctrMSComm.PortOpen Then 
                    frmMain.ctrMSComm.CommPort = intPort 
                    frmMain.ctrMSComm.Settings = strSet 
                    frmMain.ctrMSComm.PortOpen = True 
                End If 
                 
                '此处添加处理接收的代码 
                 
                frmMain.ctrMSComm.InputMode = comInputModeBinary 
                intInputLen = frmMain.ctrMSComm.InBufferCount 
                ReDim bytInput(intInputLen) 
                bytInput = frmMain.ctrMSComm.Input 
                Call InputManage(bytInput, intInputLen) 
                Call GetDisplayText 
                Call display 
       
                 
                If Not blnAutoSendFlag And Not blnReceiveFlag Then 
                    frmMain.ctrMSComm.PortOpen = False 
                End If 
            End If 
             
    End Select 
     
End Sub 

Private Sub ctrTimer_Timer() 
    Dim longth As Integer 
     
    strSendText = frmMain.txtSend.Text 
    If intOutMode = 0 Then 
        frmMain.txtReceive.Text = "ascii" 
        frmMain.ctrMSComm.Output = strSendText 
    Else 
        'add code 
        lOngth= strHexToByteArray(strSendText, bytSendByte()) 
         
        If longth > 0 Then 
            frmMain.ctrMSComm.Output = bytSendByte 
        End If 
         
    End If 

End Sub 

'***************************************** 
'初始化 
'***************************************** 


Private Sub Form_Load() 


    '设置默认发送接收关闭状态 
    blnAutoSendFlag = False 
    blnReceiveFlag = False 
     
    '接收初始化 
    intReceiveLen = 0 
     
    '默认发送方式为ASCII 
    intOutMode = 0 
    frmMain.cboHexAscii.Text = "按ASCII码" 
     
    '默认显示宽度位数为8 
    intHexWidth = 8 
     
    frmMain.sldLenth(0).Value = intHexWidth 
     
    '默认各复选框处于选定状态 
    intHexChk = 1 
    intAsciiChk = 1 
    intAddressChk = 1 
    intAdd48Chk = 1 
     
    frmMain.chkAddress.Value = intAddressChk 
    frmMain.chkAscii.Value = intAsciiChk 
    frmMain.chkHex.Value = intHexChk 
    frmMain.chkAddress48.Value = intAdd48Chk 
     
    '初始化显示视窗 
    frmMain.fraHexEditBackground.Left = frmMain.txtReceive.Left + 30 
    frmMain.fraHexEditBackground.Top = frmMain.txtReceive.Top + 30 
    frmMain.fraHexEditBackground.Width = frmMain.txtReceive.Width - 60 
    frmMain.fraHexEditBackground.Height = frmMain.txtReceive.Height - 60 
     
    frmMain.txtHexEditAddress.Top = 0 
    frmMain.txtHexEditHex.Top = 0 
    frmMain.txtHexEditText.Top = 0 
    frmMain.txtBlank.Top = 0 
     
    frmMain.txtHexEditAddress.Height = frmMain.fraHexEditBackground.Height 
    frmMain.txtHexEditHex.Height = frmMain.fraHexEditBackground.Height 
    frmMain.txtHexEditText.Height = frmMain.fraHexEditBackground.Height 
    frmMain.txtBlank.Height = frmMain.fraHexEditBackground.Height 
     
    '初始化滚动条 
    frmMain.vsclHexEdit.Width = 2 * ChrWidth 
    frmMain.vsclHexEdit.Top = frmMain.fraHexEditBackground.Top 
    frmMain.vsclHexEdit.Left = frmMain.fraHexEditBackground.Left + frmMain.fraHexEditBackground.Width - frmMain.vsclHexEdit.Width 
    frmMain.vsclHexEdit.Height = frmMain.fraHexEditBackground.Height 
     
    frmMain.hsclHexEdit.Height = ChrHeight 
    frmMain.hsclHexEdit.Left = frmMain.fraHexEditBackground.Left 
    frmMain.hsclHexEdit.Top = frmMain.fraHexEditBackground.Top + frmMain.fraHexEditBackground.Height - frmMain.hsclHexEdit.Height 
    frmMain.hsclHexEdit.Width = frmMain.fraHexEditBackground.Width 
     
     
    '设置滚动条最小和最大滚动 
    frmMain.vsclHexEdit.Min = 0 
    frmMain.vsclHexEdit.SmallChange = 1 
    frmMain.vsclHexEdit.LargeChange = 3 
    frmMain.vsclHexEdit.Value = 0 
     
    frmMain.hsclHexEdit.Min = 0 
    frmMain.hsclHexEdit.SmallChange = 1 
    frmMain.hsclHexEdit.LargeChange = 3 
    frmMain.hsclHexEdit.Value = 0 
     
    '显示初始化 
    Call cmdClear_Click 
     
     '初始化串行口 
    intPort = 2 
    intTime = 1000 
    strSet = "9600,n,8,1" 
    frmMain.ctrMSComm.InBufferSize = 1024 
    frmMain.ctrMSComm.OutBufferSize = 512 
     
     
    If Not frmMain.ctrMSComm.PortOpen Then 
        frmMain.ctrMSComm.CommPort = intPort 
        frmMain.ctrMSComm.Settings = strSet 
        frmMain.ctrMSComm.PortOpen = True 
    End If 
     
    frmMain.ctrMSComm.PortOpen = False 
     
     
End Sub 


Private Sub hsclHexEdit_Change() 
    intOriginX = -frmMain.hsclHexEdit.Value * ChrWidth 
    Call ScrollRedisplay 
End Sub 

Private Sub sldLenth_Change(Index As Integer) 

    intHexWidth = frmMain.sldLenth(0).Value 
    Call SlideRedisplay 
     

End Sub 

Private Sub vsclHexEdit_Change() 

    intOriginY = frmMain.vsclHexEdit.Value 
    Call ScrollRedisplay 
     
End Sub


推荐阅读
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 学习Java异常处理之throws之抛出并捕获异常(9)
    任务描述本关任务:在main方法之外创建任意一个方法接收给定的两个字符串,把第二个字符串的长度减1生成一个整数值,输出第一个字符串长度是 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
author-avatar
暗恋达志_227
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有