首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

vb读取串口数据绘制实时曲线关键源码翻译求教,希望了解源程序通讯协议以及主要变量的计算表达式,改为用C#进行绘制,该怎么解决

2012-04-05 
vb读取串口数据绘制实时曲线关键源码翻译求教,希望了解源程序通讯协议以及主要变量的计算表达式,改为用C#

vb读取串口数据绘制实时曲线关键源码翻译求教,希望了解源程序通讯协议以及主要变量的计算表达式,改为用C#进行绘制
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
   
  ' //接下来是52个粒径通道的生物粒子浓度
  dSum = 0
   
  gDataInDiamete(1) = -1
  gDataInDiamete(2) = -1
  gDataInDiamete(3) = -1
  gDataInDiamete(4) = (vbReceive(2 + 2 * 52 * 64) * 256 + vbReceive(2 + 2 * 52 * 64 + 1)) ' + Int(800 * Rnd + 1)
   
  dSum = dSum + gDataInDiamete(4)
   
  For i = 1 To 51
  gDataInDiamete(i + 4) = vbReceive(2 + 2 * 52 * 64 + 2 * i) * 256 + vbReceive(2 + 2 * 52 * 64 + 2 * i + 1) ' + Int(800 * Rnd + 1)
  dSum = dSum + gDataInDiamete(i + 4)
   
  Next i
   
  For i = 0 To 22
   
  pm25t = pm25t + gDataInDiamete(i + 4) * gDiameter(i + 4) * gDiameter(i + 4) * gDiameter(i + 4)
   
  Next i
   
  For i = 0 To 41
   
  pm10t = pm10t + gDataInDiamete(i + 4) * gDiameter(i + 4) * gDiameter(i + 4) * gDiameter(i + 4)


   
  Next i
   
  pm25t = pm25t * 1.7 * 3.14159 * 0.00001 / 3
  pm10t = pm10t * 1.7 * 3.14159 * 0.00001 / 3
  pm25 = pm25 + pm25t
  pm10 = pm10 + pm10t
  count_t = count_t + 1
  gSaveFileFlag = 0
  If (count_t = 20) Then
   
  pm25 = pm25 / count_t
  pm10 = pm10 / count_t
  pm25 = Format(pm25, "#.####")
  pm10 = Format(pm10, "#.####")
   
  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

[解决办法]
http://www.carlosag.net/Tools/CodeTranslator/
这里转下看

热点排行