現在我要利用mscomm 傳送一個byte的資料
1個byte中有8個bits(12345678),
我想做到中分別代表是3個項目的signal-->>>>>>>>(123)是代表項目A(456)代表項目B,(78)代表項目C我可以做到這樣的嗎?請各位幫幫忙急用
1個byte中有8個bits(12345678),
我想做到中分別代表是3個項目的signal-->>>>>>>>(123)是代表項目A(456)代表項目B,(78)代表項目C我可以做到這樣的嗎?請各位幫幫忙急用
调试欢乐多
signal = 81
a = signal And 224
b = signal And 56
c = signal And 3
A = (Siginal And &HE0) \ &H20
B = (Siginal And &H1C) \ 4
C = (Siginal And &H3)
End SubSub SetSignal(ByRef Siginal As Byte, ByVal A As Byte, ByVal B As Byte, ByVal C As Byte)
Siginal = ((A And 7) * &H20) Or _
((B And 7) * 4) Or _
(C And 3)
End Sub
事实上每BIT可代表1个项目的signal状态,开或关。
你可进行BIT运算,来判断某BIT是0或1从而发送控制信号。
具体的进制转换可参阅下列链接:
http://topic.csdn.net/u/20080108/14/67783c1e-1a7e-4613-904c-dda5e08a380b.html
Option Explicit
Dim sBin As String
Dim sHex As StringPublic Function HexToBin(ByVal sHex As String) As String
Const s1 = "0000101001101111000", s2 = "0125A4936DB7FEC8"
Dim i As Integer
sHex = UCase(sHex)
For i = 1 To Len(sHex)
sBin = sBin & Mid(s1, InStr(1, s2, Mid(sHex, i, 1)), 4)
Next i
HexToBin = sBin
End FunctionPublic Function BinToHex(ByVal sBin As String) As String
Const s1 = "0000101001101111000", s2 = "0125A4936DB7FEC8"
Dim i As Integer
sBin = String(3 - (Len(sBin) - 1) Mod 4, "0") & sBin
For i = 1 To Len(sBin) Step 4
sHex = sHex & Mid(s2, InStr(1, s1, Mid(sBin, i, 4)), 1)
Next i
BinToHex = sHex
End FunctionPrivate Sub Command1_Click() '2进制转16进制
sBin = ""
sHex = ""
sBin = Text1
BinToHex (sBin)
Text2 = sHex
If Len(sHex) Mod 2 = 0 And Len(sHex) > 0 Then
Command2_Click
End If
End SubPrivate Sub Command2_Click()
Dim sj(0) As Byte
sj(0) = Val("&H" & sHex)
MSComm1.Output = sj
End SubPrivate Sub Form_Load()
MSComm1.PortOpen = True
Text1 = ""
Text2 = ""
End Sub
2个BYTE字节可代表16个设备的开或关状态
这种方法在实时控制的串口通信中应用较多,我做过输出32个设备控制,输入24个故障报警,在中间就使用前面给出的代码做状态组合或分解。