下位机给我传上来的数据是这样的
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秒最少一次。我是想用定时器来做,但是又没有思路。
请大家帮忙开拓一下思路吧。感激!!
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秒最少一次。我是想用定时器来做,但是又没有思路。
请大家帮忙开拓一下思路吧。感激!!
怎么取10个数做平均(最好有举例说明)。
另外数据上传速度是多快?-------------------------------
你可以试着把上传的数据分别装入两个数组(两路),用100ms定时器定时计算。
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次后,暂时不进行累加,等定时器计算后清零再分别重新累加。
要是我用两个数组
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()里,该把那些放在定时器里。
还请楼上的各位能再详细说明一下。
谢谢。
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我这样写了程序,只是实现了采集功能,就是不知道会不会有什么问题。
这是我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;
}
}
}
}