編碼本身都是為了在計算機中運算使用。實質(zhì)上,在計算機中只有以高低電平來表示的二進制。至于,BCD碼是一種8421編碼,它將一個字節(jié)分兩部分,高4位代表一個數(shù)字,低4位代表一個數(shù)字。也就是說,計算機怎么識別一個字節(jié)到底是二進制碼還是BCD碼,這是由程序代碼來運算的。
我的理解可由16進制數(shù)簡化理解:
每2個BCD碼構(gòu)成一字節(jié),接收到每字節(jié)二進制數(shù)據(jù)需處理成16進制的字符形式。僅是由00-99的范圍。而非00-FF范圍。
同樣發(fā)送的10進制數(shù)以每2個BCD碼組成1個16進制數(shù)形成二進制的一個字節(jié)發(fā)送來達到目的。
基于如上設(shè)想所做的收發(fā)代碼如下:
Option Explicit
Private Sub cmdSend_Click()
Call Timer1_Timer
End Sub
Private Sub Form_Load()
Me.MSComm1.CommPort = 1
Me.MSComm1.PortOpen = True
Me.MSComm1.RThreshold = 1
txtSend = "1234"
txtReceive = ""
Timer1.Interval = 0
End Sub
Private Sub MSComm1_OnComm()
On Error Resume Next
Dim BytesReceived() As Byte
Dim buffer As String
Dim HData As String
Dim i As Integer
Select Case MSComm1.CommEvent
Case comEvReceive '接收十六進制數(shù)據(jù)。并以十六進制顯示
MSComm1.InputLen = 0
MSComm1.InputMode = comInputModeBinary '設(shè)置當(dāng)前以二進制數(shù)接收數(shù)據(jù)
buffer = MSComm1.Input '接收數(shù)據(jù)至字符串中
BytesReceived() = buffer '將數(shù)據(jù)轉(zhuǎn)入BYTE中
For i = 0 To UBound(BytesReceived) '顯示結(jié)果以十六進制顯示
If Len(Hex(BytesReceived(i))) = 1 Then
HData = HData & "0" & Hex(BytesReceived(i))
Else
HData = HData & Hex(BytesReceived(i))
End If
txtReceive.Text = HData '最后將結(jié)果后入txtreceive中
MSComm1.OutBufferCount = 0 '清除發(fā)送緩沖區(qū)
MSComm1.InBufferCount = 0 '清除接收緩沖區(qū)
Next
End Select
End Sub
Private Sub Timer1_Timer()
On Error Resume Next
Dim bytData(1) As Byte
Dim i As Integer
For i = 1 To 4 Step 2
bytData((i - 1) / 2) = Val("&H" & Mid(txtSend, i, 2))
Next
MSComm1.Settings = "9600,n,8,1"
Call SendData(bytData) '發(fā)送命令
End Sub
Public Function SendData(ByRef bytData() As Byte) As Long
On Error Resume Next
MSComm1.InBufferCount = 0 '清空接收緩沖區(qū)
MSComm1.Output = bytData '發(fā)送數(shù)據(jù)
Do
DoEvents
Loop Until MSComm1.OutBufferCount = 0 '等待,直到數(shù)據(jù)發(fā)送完畢
MSComm1.OutBufferCount = 0 '清空發(fā)送緩沖區(qū)
End Function
附件:
Bcd.rar