下位机给我传上来的数据是这样的 
aa 1 1 2 3 4 5 ee 
aa 2 4 5 6 7 8 ee 
aa 1 2 3 4 5 6 ee 
aa 2 5 5 6 6 7 ee  
......
上位机要完成的工作是:
一 第一路光每10个数据取一次平均值 VER1。
二 第二路光每10个数据取一次平均值 VER2。
三 计算ver1/ver2
四 要求每0.1秒最少一次。我是想用定时器来做,但是又没有思路。
请大家帮忙开拓一下思路吧。感激!!

解决方案 »

  1.   

    aa是开始标志位,ee是结束标志位,中间的是数据。
      

  2.   

    是说得不太清楚,8位是一回事,8字节是另一回事;怎么算一路(aa 1? aa 2?),
    怎么取10个数做平均(最好有举例说明)。
    另外数据上传速度是多快?-------------------------------
    你可以试着把上传的数据分别装入两个数组(两路),用100ms定时器定时计算。
      

  3.   

    你的收到的字符串格式是:aa   1   1   2   3   4   5   ee? 之间几空格?
                            aa   1   2   3   4   5   6   ee
    10组1的哪些数相加?1+2+3+...+2+3+4+...??
    1+1+2+3...+1+2+3...??12345+23456?
    112345+123456?有很多种,做好举例说明。可以考虑以下两种方案:
    --------------------------------
    收到数据时分别装入两个数组(两路),如果两个数组分别装满10条(逻辑变量置真),则暂时不在装入数据,等待定时器定时计算后(逻辑变量置假),再重新重头装入数据。--------------------------------
    也可以考虑,边接收边累加,两路各累计10次后,暂时不进行累加,等定时器计算后清零再分别重新累加。
      

  4.   

    100ms定时器如果用timer的话,会不准确的哦。建议一秒更新数据一次
      

  5.   

    请问,定时器的程序是要实现什么功能啊。如果用这种方法的话,直接把程序写在MSComm1_OnComm()里不就可以了吗?我现在思路很混乱,不知道定时器该怎么用。另外补充:
    要是我用两个数组
    Dim aa(10) As Single  ’第一路
    Dim bb(10) As Single  ’第二路那么像我举的例子,应该是这样的:aa[0]=123.45  aa[1]=234.56  ...... 
                                bb[0]=456.78  bb[1]=556.67 ......通信协议,还有数据转换方面我这没有问题,采集过来都实现了。
    就是我不知道该把那些程序放在MSComm1_OnComm()里,该把那些放在定时器里。
     还请楼上的各位能再详细说明一下。
    谢谢。
      

  6.   

    Private Sub Timer1_Timer()
    Dim temp_byte1() As Byte
    Dim temp_byte2() As Byte
    Dim i As Integer
    Dim t1 As Integer
    Dim t2 As Integer            Do
                DoEvents
            Loop Until MSComm1.InBufferCount >= 16
            temp_byte1 = MSComm1.Input
            temp_byte2 = MSComm1.Input
            If TimeCount > timenumber Then         '采集
              If temp_byte1(0) = &HAA And temp_byte1(7) = &HBB And temp_byte2(0) = &HAA And temp_byte2(7) = &HBB Then
                  If temp_byte1(1) = 1 And temp_byte2(1) = 2 Then
            buffer3 = temp_byte1(2) & temp_byte1(3) & temp_byte1(4) & "." & temp_byte1(5)
                   Datacomy_txt1(timenumber) = CSng(buffer3)
            buffer4 = temp_byte2(2) & temp_byte2(3) & temp_byte2(4) & "." & temp_byte2(5)
                   Datacomy_txt2(timenumber) = CSng(buffer4)
                   Else
                   If temp_byte1(1) = 2 And temp_byte2(1) = 1 Then
                   buffer4 = temp_byte1(2) & temp_byte1(3) & temp_byte1(4) & "." & temp_byte1(5)
                   Datacomy_txt2(timenumber) = CSng(buffer4)
                   buffer3 = temp_byte2(2) & temp_byte2(3) & temp_byte2(4) & "." & temp_byte2(5)
                   Datacomy_txt1(timenumber) = CSng(buffer3)
                  End If
              End If
            End If
            End If
        Timex_txt(timenumber) = timenumber / frequency
        Picture1.DrawStyle = 0
        Picture1.Line ((Timex_txt(timenumber - 1)), Datacomy_txt1(timenumber - 1))-(Timex_txt(timenumber), Datacomy_txt1(timenumber)), vbRed
        Picture1.Line ((Timex_txt(timenumber - 1)), Datacomy_txt2(timenumber - 1))-(Timex_txt(timenumber), Datacomy_txt2(timenumber)), &H8000&
        
            timenumber = timenumber + 1
        End Sub
    Private Sub Form_Load()
          frequency = 120
          timenumber = 1
        TimeCount = 99990
        
       Draw_Coordinate_pic1
       Timer1.Enabled = False
       MSComm1.CommPort = 1
       MSComm1.Settings = "115200,N,8,1"
       MSComm1.InputLen = 8 '接收缓冲区的大小
       MSComm1.RThreshold = 0 
       MSComm1.InputMode = comInputModeBinary                '接收二进制型数据
        If MSComm1.PortOpen = False Then
        MSComm1.PortOpen = True
        End If
        MSComm1.InBufferCount = 0
        Timer1.Enabled = True
    End Sub我这样写了程序,只是实现了采集功能,就是不知道会不会有什么问题。
      

  7.   

    最好不要在定时器里读 Input 属性这么弄,通过你串口控件的事件里处理数据接收过程。
    这是我VC里的一个处理过程,当然这不是全部,不过可以说明一些信息处理方法BOOL ExecOver;
    long ReturnValue;
    long Approach;long _stdcall IsSMSDevice(int hComProt)
    {
    BOOL OpenState;
    DWORD NowTickCount;
    DWORD SaveTickCount;
    VBString SendText;

    Approach = 0;
    ExecOver = FALSE;
    ReturnValue = 0; COMM1.EventRead = SMSDevice_Event;
    COMM1.Port = hComProt;
    COMM1.BaudRate = CBR_57600;
    COMM1.ByteSize = 8;
    COMM1.Parity = 0;
    COMM1.StopBits = 1;
    OpenState = COMM1.Open();
    if(OpenState==TRUE){
    SaveTickCount = GetTickCount();
    SendText.Format("AT\r");
    COMM1.Send((BYTE*)*SendText);
    SendText.Release();
    while(ExecOver==FALSE){
    Sleep(5);
    NowTickCount = GetTickCount();
    if(NowTickCount-SaveTickCount>=1000){
    ReturnValue = 0;
    ExecOver=TRUE;
    }
    }
    COMM1.Close();
    }
    return ReturnValue;
    }
    void SMSDevice_Event(DWORD pClassAddress, BYTE *ReadBuffers, DWORD ReadCount)
    {
    DWORD i;
    if(ReadCount>0){
    for(i=0;i<ReadCount;i++){
    switch(Approach){
    case 0:
    if((BYTE)ReadBuffers[i]==0x0D||(BYTE)ReadBuffers[i]==0x0A){
    Approach = 1;
    }else if((BYTE)ReadBuffers[i]==0x4F||(BYTE)ReadBuffers[i]==0x62){
    Approach = 2;
    }
    break;
    case 1:
    if((BYTE)ReadBuffers[i]==0x4F||(BYTE)ReadBuffers[i]==0x6F){
    Approach = 2;
    }else if((BYTE)ReadBuffers[i]==0x0D||(BYTE)ReadBuffers[i]==0x0A){
    Approach = 1;
    }else{
    Approach = 0;
    }
    break;
    case 2:
    if((BYTE)ReadBuffers[i]==0x4B||(BYTE)ReadBuffers[i]==0x6B){
    Approach = 3;
    }else{
    Approach = 0;
    }
    break;
    case 3:
    if((BYTE)ReadBuffers[i]==0x0D||(BYTE)ReadBuffers[i]==0x0A){
    ReturnValue = 1;
    ExecOver=TRUE;
    }
    Approach = 0;
    break;
    }

    }
    }
    }