Public gDiameter(55) As Single '粒径数组
Public gDataInDiamete(55) As Long '每次从串口读取的粒径通道的数据(52个粒径通道)
Public gChannelData(65) As Long '从串口读取的强度通道数据(64个强度通道)
'CRC-16校验函数,参数待校验的数组,返回值 余数
Function CRC16(data() As Byte) As String
Dim CRC16Lo As Byte, CRC16Hi As Byte 'CRC寄存器
Dim CL As Byte, CH As Byte '多项式码 & H8001
Dim SaveHi As Byte, SaveLo As Byte
Dim i As Integer
Dim Flag As Integer
CRC16Lo = &HFF
CRC16Hi = &HFF
CL = &H1
CH = &H80
For i = 0 To UBound(data)
CRC16Lo = CRC16Lo Xor data(i) '每一个数据与CRC寄存器进行异或
For Flag = 0 To 7
SaveHi = CRC16Hi
SaveLo = CRC16Lo
CRC16Hi = CRC16Hi \ 2 '高位右移一位
CRC16Lo = CRC16Lo \ 2 '低位右移一位
If ((SaveHi And &H1) = &H1) Then '如果高位字节最后一位为1
CRC16Lo = CRC16Lo Or &H80 '则低位字节右移后前面补1
End If '否则自动补0
If ((SaveLo And &H1) = &H1) Then '如果LSB为1,则与多项式码进行异或
CRC16Hi = CRC16Hi Xor CH
CRC16Lo = CRC16Lo Xor CL
End If
Next Flag
Next i
Dim ReturnData(1) As Byte
ReturnData(0) = CRC16Hi 'CRC高位
ReturnData(1) = CRC16Lo 'CRC低位
CRC16 = ReturnData
End Function
'处理串口数据
Private Sub MSComm1_OnComm()
'Dim rs_sChannelData(55) As Long
'Dim rs_sIntensityData(52, 64) As Long
'Dim rs_pIntensity(65) As Long
Dim vbReceive As Variant
Dim i, j As Integer
Dim L As Integer
Dim dSum As Long
Dim pm25t As Single
Dim pm10t As Single
pm25t = 0
pm10t = 0
If MSComm1.CommEvent = comEvReceive Then
'wait (50) 'Receive the rs232 chars
If MSComm1.InBufferCount >= 6764 Then
vbReceive = ((MSComm1.Input))
If ((vbReceive(0) = 255) And (vbReceive(1) = 1)) Then
If gAutoSave = 1 Then
'自动保存文件
If gSaveFileFlag >= gSaveFileCycle Or gSaveFileFlag = 0 Then
'周期到
AutoSaveFile
gSaveFileFlag = 1
' End Select
End If
End If
count_t = 0
pm25 = 0
pm10 = 0
End If
' //接下来是64个强度通道的生物粒子荧光强度
sSum = 0
'For i = 0 To 51
' For j = 0 To 63
' rs_sIntensityData(i + 1, j + 1) = 0
' rs_sIntensityData(i + 1, j + 1) = vbReceive(2 + 2 * i * 64 + 2 * j) * 256 + vbReceive(2 + 2 * i * 64 + 2 * j + 1)
' Next j
' Next i
For j = 0 To 65
gChannelData(j) = 0
'For i = 0 To 52
' rs_pIntensity(j) = 0
' rs_pIntensity(j) + rs_sIntensityData(i, j)
'Next i
sSum = 0 'sSum + rs_pIntensity(j)
Next j
TransitSign = True
Else
runstop
Call Stopd_Click
wait (1000)
Call Start_Click
End If
'这里可以不作拷贝,在上面直接用gDataInDiamete,这样可以节省oncomm的运行时间
'CopyData gDataInDiamete, rs_sChannelData
'CopyData gChannelData, rs_pIntensity
'可能这个地方比较费时
ShowDiameterData False
'ShowChannelData False
ShowDpsAndFrq Picture5, dSum \ 3, sSum \ 3
'以上是绘图的部分,可能会比较费时
Text5.Text = str(dSum \ 3)
Text6.Text = Format(pm25t, "#.####")
Text1.Text = Format(pm10t, "#.####")
MSComm1.InBufferCount = 0 '...清空输入寄存器
timer4public = 1
End If
End If
End Sub