level 1
我写了一个串口通讯的小程序,用收到的数据点亮20个指示灯。前16个都没有问题,但是发送8000的数据的时候不仅第16个灯亮了,而且17到20也亮了。想点17到20的时候第16个灯也一直亮着。
串口接收模式是文本型(不会用二进制的接收,接收过来显示不对)。接收过来的数据用命令buff=val("&H"+mscomm1.input)转化为16进制。
控制灯(shape)亮是用if (buff and &H1) <> 0 then
一直到&H7fff都好好的,上了&H8000就不对了,shape17到shape20就都亮起来。不知道怎么回事啊?
2009年04月17日 04点04分
1
level 8
变量buff是Integer类型吧,超过&H8000就变成负数了,再进行与操作不正确。可以将buff定义为Long。另外,最好采用二进制方式,通过字节数组接收串口数据。
2009年04月17日 05点04分
2
level 1
Private Sub Command1_Click()
If MDIForm1.MSComm1.PortOpen = False Then
MDIForm1.MSComm1.PortOpen = True
End If
Dim buff As Long
buff = Val("&H" + MDIForm1.MSComm1.Input)
If (buff And &H1) <> 0 Then
Shape1.FillColor = &HFFC0FF
Else
Shape1.FillColor = &HFFFFFF
End If
If (buff And &H2) <> 0 Then
Shape2.FillColor = &HFFC0FF
Else
Shape2.FillColor = &HFFFFFF
End If
If (buff And &H4) <> 0 Then
Shape3.FillColor = &HFFC0FF
Else
Shape3.FillColor = &HFFFFFF
End If
If (buff And &H8) <> 0 Then
Shape4.FillColor = &HFFC0FF
Else
Shape4.FillColor = &HFFFFFF
End If
If (buff And &H10) <> 0 Then
Shape5.FillColor = &HFFC0FF
Else
Shape5.FillColor = &HFFFFFF
End If
If (buff And &H20) <> 0 Then
Shape6.FillColor = &HFFC0FF
Else
Shape6.FillColor = &HFFFFFF
End If
If (buff And &H40) <> 0 Then
Shape7.FillColor = &HFFC0FF
Else
Shape7.FillColor = &HFFFFFF
End If
If (buff And &H80) <> 0 Then
Shape8.FillColor = &HFFC0FF
Else
Shape8.FillColor = &HFFFFFF
End If
If (buff And &H100) <> 0 Then
Shape9.FillColor = &HFFC0FF
Else
Shape9.FillColor = &HFFFFFF
End If
If (buff And &H200) <> 0 Then
Shape10.FillColor = &HFFC0FF
Else
Shape10.FillColor = &HFFFFFF
End If
If (buff And &H400) <> 0 Then
Shape11.FillColor = &HFFC0FF
Else
Shape11.FillColor = &HFFFFFF
End If
If (buff And &H800) <> 0 Then
Shape12.FillColor = &HFFC0FF
Else
Shape12.FillColor = &HFFFFFF
End If
If (buff And &H1000) <> 0 Then
Shape13.FillColor = &HFFC0FF
Else
Shape13.FillColor = &HFFFFFF
End If
If (buff And &H2000) <> 0 Then
Shape14.FillColor = &HFFC0FF
Else
Shape14.FillColor = &HFFFFFF
End If
If (buff And &H4000) <> 0 Then
Shape15.FillColor = &HFFC0FF
Else
Shape15.FillColor = &HFFFFFF
End If
If (buff And &H8000) <> 0 Then
Shape16.FillColor = &HFFC0FF
Else
Shape16.FillColor = &HFFFFFF
End If
If (buff And &H10000) <> 0 Then
Shape17.FillColor = &HFFC0FF
Else
Shape17.FillColor = &HFFFFFF
End If
If (buff And &H20000) <> 0 Then
Shape18.FillColor = &HFFC0FF
Else
Shape18.FillColor = &HFFFFFF
End If
If (buff And &H40000) <> 0 Then
Shape19.FillColor = &HFFC0FF
Else
Shape19.FillColor = &HFFFFFF
End If
If (buff And &H80000) <> 0 Then
Shape20.FillColor = &HFFC0FF
Else
Shape20.FillColor = &HFFFFFF
End If
End Sub
2009年04月17日 07点04分
3
level 1
定义成long了,应该是4个字节,如果第一位是符号的话,不应该在第16位出现问题啊,可是还是不行,第16位置1的时候17到20全亮。如果输入5个字符时候不管16位是什么数第16个灯总是亮着
2009年04月17日 07点04分
4
level 1
我是用文本方式发送的,没有用二进制。所以也没有用byte数组,因为用二进制发送到我这里,我再在文本框中显示和我发的数据就对不上了,不太会用。
2009年04月17日 07点04分
8
level 0
不是,是你那个常数的问题,
If (buff And &H10000) <> 0 Then
MsgBox &H10000 看看
2009年04月17日 07点04分
9
level 0
MsgBox &H8000 看看,这个是负数
Dim a As Long
a = 2 ^ 16
If (buff And a) <> 0 Then
不要用常数,而是定义一个long变量,然后
2009年04月17日 07点04分
10
level 1
这个问题我用了个笨方法解决了,就是用if语句判断传过来的数据是多长,16位之前的和16位之后的分开。程序长了一些
2009年04月21日 14点04分
12
level 1
我在书上看到有这样一段话用VB实现支持无符号整数的功能。
推荐了两种最佳方法
1. long变量的转换
处理0到65535之间的无符号整数,将其存储在long整型中。将16位值赋给模拟16位变量的带符号Integer变量,进行以下运算
intShort = (lngLong And &H7FFF&) - (lngLong And &H8000&)
该运算的逆运算
lngLong = intShort And &HFFFF&
2009年04月21日 14点04分
13