说一下我的认识:我这两天也被这个问题困扰了,看样子这个问题很有难度。现在与大家分享一下 我的想法。我要搞定的是:比如说现在马路边,有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的状态我待会再仔细看看 希望能说得更明白一下看到大家不断讨论 进制转换 。我都弄的糊涂糊涂啊
继续讨论...............
这个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的状态我待会再仔细看看 希望能说得更明白一下看到大家不断讨论 进制转换 。我都弄的糊涂糊涂啊
继续讨论...............
解决方案 »
- VB如何获得FTP服务器的文件以及文件夹列表
- TreeView中如何删除使用CheckBox选中的各个节点呀?
- 我要一次同时打开多个选定的bmp文件,显示在同一个窗体的多个图片框中----在线等待
- 请问如何在RichTextBox里面插入单选框或复选框
- 建立数据库时的“索引”有什么用?
- 求教mshflexgrid或true DBgrid一数字列最后求和的函数?多谢了!
- vb可以得到硬盘物理序号,谁有得到硬盘物理序号的vb源码?
- (正在急)哪里有数据库与vb连接方面的电子书籍下载
- +++++++大哥大姐救救我吧!!!一个报表问题....
- fuxc(Michael)兄请进
- 判断点是否在方框内,多点拟合求求线段
- VB DataEnvironment command属性中的SQL语句问题
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
你真费劲:~~~~~看看这个 全为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 &H4
'如果等=0说明第三个灯灭
Debug.Print Asc(Chr(13)) And &H2
'如果等=1说明第四个灯亮 Debug.Print Asc(Chr(15)) And &H1
刚才有点错,红字部分是改正的。
接收到的ASC码就是10进制的10,你绕这么多弯干什么????
请LZ参阅上述连接.
这句话我不赞同工控传输上传输二进制数据是非常容易且不产生带宽浪费的事情。假设某一时刻,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
多用几个Long型数不就行了,每个Long型有32bit,每个bit代表一盏灯的状态,4个Long型数就可以代表128盏灯的状态了,用100除以32得3余4,也就是第100盏灯的状态在第4个Long型数中,拿这个Long型数去 And 2^(4-1) 返回1灯亮,返回0灯灭!
量大用数组。请注意我回复中提到的:“当然如果你有更多的灯可以用int或者long或者用数组进行接收”
然后你可以给灯分组。于是我们的调用就改成
Debug.Print Test(data(1), 1)
Debug.Print Test(data(2), 1)
……
chewinggum谢谢二位~~~~~
一点小意思:
直接HEX(A)就是1010了啊
。。
如:
&H11=17(10进制)
如果通过rs232接收外部状态可以采用查表法,你可以转换成任意方式。
可以是线性和非线性的变化。
用接受到的数据,去调数组里存好的控制格式。