2013-08-20 69 views
0

有人可以嘗試圍繞這一個包裝他們的大腦?我認爲這只是確保在十六進制字節中有2個字節,並確保值在0-9和A-F之間,但不是。瞭解此VB代碼

用於紅外控制器/爆發器的程序片段。該子程序會將實際的信號(或其他代碼)從串口發送到控制器,以完成作業。

樣品呼叫:

SendCode ("04241001") 

的VB6代碼表示:

Public Sub SendCode(ByVal strOut As String) 
' **************************** 
' This sub sends the hex codes 
' **************************** 


Dim numb1 As Integer, numb2 As Integer 
Dim strRS As String 
Dim i As Long 
Dim newline(200) As String, outline(200) As String 

Debug.Print "Sending IR - " & strOut 

    strRS = vbNullString 

    For i = 1 To Len(strOut) 
     newline(i) = Mid(strOut, i, 1) 
    Next 

    For i = 1 To Len(strOut) Step 2 
     If Asc(newline(i)) < 64 Then 
      numb1 = (Asc(newline(i)) - 48) * 16 
      strRS = strRS + Format(Hex(numb1/16), "0") 
     Else 
      numb1 = (Asc(newline(i)) - 55) * 16 
      strRS = strRS + Format(Hex(numb1/16), "0") 
     End If 
     If Asc(newline(i + 1)) < 64 Then 
      numb2 = (Asc(newline(i + 1)) - 48) 
      strRS = strRS + Format(Hex(numb2), "0") 
     Else 
      numb2 = (Asc(newline(i + 1)) - 55) 
      strRS = strRS + Format(Hex(numb2), "0") 
     End If 
     numb1 = numb1 + numb2 
     outline((i + 1) \ 2) = CByte(numb1) 
     strRS = strRS + " " 
    Next 

    With MSComm1 
     .RTSEnable = True 
     Sleep (20) 
     .OutBufferCount = 0 
     For i = 1 To (Len(strOut)/2) 
      .Output = Chr(outline(i)) 
     Next 
     Sleep (20) 
     .RTSEnable = False 
    End With 

End Sub 

問題是基於圍繞第二FOR/NEXT循環與步驟2和嵌入的IF語句。循環內部發生了什麼? numb1 and numb2

這個循環的目的是什麼?

+0

據我所知,'strRS'沒有效果。 – muratgu

+0

@ muratgu它很可能用於調試。我敢打賭,原作者在某個時間點有另一個debug.print值。 –

+0

好的,我們假設strRS是用於調試的。循環中發生了什麼? – Eddiie

回答

1

它將十六進制字符串轉換爲二進制字節字符串,然後發送二進制字節字符串。 它還將二進制字節轉換回十六進制(strRS),以便您可以檢查轉換和輸出。檢查/調試字符串不用於任何事情,但如果你在那裏放置一個斷點,你可以檢查這些值。

+0

你好,我想我找到了一個.net函數。它被稱爲Bitconverter。例如,serialport將數據存儲在數組中並將其轉換爲字符串...如果st是一個字符串,並且Buffer =緩衝區中的所有字節,則「st = Bitconverter.ToString(Buffer)」會顯示十六進制數。希望我解釋正確,並幫助別人。 – Eddiie