说一下我的认识:我这两天也被这个问题困扰了,看样子这个问题很有难度。现在与大家分享一下 我的想法。我要搞定的是:比如说现在马路边,有4盏路灯,分别叫做L1、L2、L3、L4 ,要求把这4盏灯的状态传输到电脑中,并用电脑中的VB软件显示出来。假设某一时刻,4盏灯的状态分别是亮灭亮灭 ,也就是1010。我们知道,一般数据传输是以ASCII码的格式传输。这就要先将1010转换16进制的BCD码,就是字符A,再将字符A转换成ASCII码,就是65.计算过程就是Asc(Hex(1*8 + 0*4 + 1*2 + 0*1))= Asc(Hex(10))=Asc("A")=65。
这个ASCII码65在传输线中 传啊传啊,.................,很快就传到了 电脑的VB软件中。我们在VB软件中画出4个小灯,那么如何将ASCII码65转换出这4个小灯的状态1010呢?首先就要把ASCII码转化成16进制的BCD码,也就是字符AVal("&H" & Chr(65))=1010\8=1就是L1的状态
(10 Mod 8)\4=0就是L2的状态
((10 Mod 8)Mod 4 )\2 = 1就是=L3的状态
((10 Mod 8)Mod 4 )Mod 2  \1= 0 就是L4的状态我待会再仔细看看 希望能说得更明白一下看到大家不断讨论 进制转换 。我都弄的糊涂糊涂啊
继续讨论...............

解决方案 »

  1.   

    数字本身无需转换,只是用字符串来表示数字的才需要转换。下边是我的16进制字符串转化成长整形数字的代码:
    vPrivate Function StrToNum(str As String) As Long
        Dim i As Integer, num As Long
        For i = 1 To Len(str)
            num = Asc(Mid$(str, i, 1))
            If num > &H39 Then num = num - 7 '处理A-F
            num = num - 48                     '把ascii变成数字
            StrToNum = StrToNum * 16 + num
        Next
    '    If StrToNum > &H8000& Then          '负数
    '        StrToNum = StrToNum - 65536
    '    End If
    End Function
      

  2.   

    Val("&H" & Chr(65))=  这种方法还是不容易懂  下次我估计我就看不懂了我还是弄成 那种  -48    -65哪种方法好了
      

  3.   


    你真费劲:~~~~~看看这个 全为1111也就十六进制的F,10进制的15,当然15是可以从0-15的   '用这样的方式  ASC(字符) and 状态      '如果等=8说明第一个灯亮,也就是说与的结果不为0这个灯就是亮的,为0就是灭的
       Debug.Print Asc(Chr(15)) And &H8
       '如果等=4说明第二个灯亮
       Debug.Print Asc(Chr(7)) And &H4
       '如果等=0说明第三个灯灭
       Debug.Print Asc(Chr(15)) And &H2
       '如果等=1说明第四个灯亮
       Debug.Print Asc(Chr(15)) And &H1
       
       '以上可以是很简单来判断是个灯哪个灯亮,哪个灯灭.
      

  4.   

    Debug.Print Asc(Chr(15)) And &H8 
      '如果等=4说明第二个灯亮 
      Debug.Print Asc(Chr(15)) And &H4 
      '如果等=0说明第三个灯灭 
      Debug.Print Asc(Chr(13)) And &H2 
      '如果等=1说明第四个灯亮 
      Debug.Print Asc(Chr(15)) And &H1 
      
    刚才有点错,红字部分是改正的。
      

  5.   

    如果不是字节数据,还可以跟更大的数与,关键是你要用 AND 这可以VB的位运算,它是按位与的。
      

  6.   

    为什么要使用字符来传呢?我认为可以把每个灯的开关用一个Byte来表示(当然只有0和1),VB不支持直接对位的操作,直接处理字节来的容易些。
      

  7.   

    你的转换有问题1010为何要转什么BCD码,直接转成10进制的10再转成字符chr(10)发送,
    接收到的ASC码就是10进制的10,你绕这么多弯干什么????
      

  8.   

    http://topic.csdn.net/u/20080108/14/67783c1e-1a7e-4613-904c-dda5e08a380b.html
    请LZ参阅上述连接.
      

  9.   

    “我们知道,一般数据传输是以ASCII码的格式传输。”
    这句话我不赞同工控传输上传输二进制数据是非常容易且不产生带宽浪费的事情。假设某一时刻,4盏灯的状态分别是亮灭亮灭 ,也就是1010。补足一个字节也就是00001010。将这个字节传输到计算机很容易吧,上位机用一个byte类型的变量接收该值就会得到一个十进制数值:10。当然如果你有更多的灯可以用int或者long或者用数组进行接收好了,现在我们设计一个函数来判断第N盏灯是否亮。
    输入参数肯定要有下位机传上来的那个数据,下面的例子里面我用一个long变量4个字节,可以用来表示不多于32盏灯。其次还要有一个N来指定对第几盏灯进行判断,从第一个参数的定义可以知道输入值为1~32。输出为一个bool结果。事先约定数据从最低位开始编号为1,以此类推。一句话解决问题:Private Function Test(InputData As Long, N As Integer) As Boolean
        Test = IIf((InputData And (2 ^ (N - 1))) > 0, True, False)
    End Function测试一下Private Sub Command1_Click()
    Debug.Print Test(10, 1)
    Debug.Print Test(10, 2)
    Debug.Print Test(10, 3)
    Debug.Print Test(10, 4)
    End Sub输出False
    True
    False
    True
      

  10.   


    多用几个Long型数不就行了,每个Long型有32bit,每个bit代表一盏灯的状态,4个Long型数就可以代表128盏灯的状态了,用100除以32得3余4,也就是第100盏灯的状态在第4个Long型数中,拿这个Long型数去 And 2^(4-1) 返回1灯亮,返回0灯灭!
      

  11.   


    量大用数组。请注意我回复中提到的:“当然如果你有更多的灯可以用int或者long或者用数组进行接收”
    然后你可以给灯分组。于是我们的调用就改成
    Debug.Print Test(data(1), 1) 
    Debug.Print Test(data(2), 1) 
    ……
      

  12.   

    CityBird  
    chewinggum谢谢二位~~~~~
    一点小意思:
      

  13.   

    没必要搞的这么复杂吧
    直接HEX(A)就是1010了啊 
    。。
      

  14.   

    Val("&H" & Chr(65))&H就是代表后面的字符是16进制的
    如:
    &H11=17(10进制)
      

  15.   

    如果用并行打印口(需要专用dll可以下载到)无需转换。
    如果通过rs232接收外部状态可以采用查表法,你可以转换成任意方式。
    可以是线性和非线性的变化。
    用接受到的数据,去调数组里存好的控制格式。