S
Ich hab in den letzten Tagen ein bisschen rumprobiert. Zunächst gingen durch den alten Einlesemechanismus viel zu viele Pakete verloren, auch mit dem Timeouts konnte das nicht kompensiert werden.
Nun lese ich byteweise ein, und bekomme so 200 Pakete pro Sekunde, bei 200Hz kann man nicht mehr erwarten.
Ich weiß nicht ob es ein MFC-Effekt ist, aber die falschen Werte hatten nichts mit der Struktur und auch nichts mit dem Casten zu tun.
Jetzt für die MFC-Profis:
Mit dem neuen Empfangsmechanismus hab ich einfach mal gemessen und die Werte permanent in der GUI ausgeben lassen, mit dem Effekt: je länger ich messe, desto mehr Murks kommt gegen Ende dabei raus.
Der Code dazu sah ja so aus:
tsRead->m_Wnd->m_Edit_Out.GetWindowTextW(csOut);
csOut = csOut + csAcc0 + _T("\r\n");
tsRead->m_Wnd->m_Edit_Out.SetWindowTextW(csOut);
Dann dachte ich mir, ich gebe nicht mehr alle Messwerte in der GUI aus, sondern nur noch den Aktuellen, mit dem Effekt: KEIN falscher Wert mehr!
Inzwischen gebe ich gar nichts mehr in der GUI aus, sondern schreibe alles in eine Textdatei, mit dem Effekt: die 2. Zeile in der Textdatei ist immer Murks, alle anderen sind ok, egal wie lange ich messe. Sie ist sowohl in der Textdatei Murks, als auch wenn ich sie mir in der GUI ausgeben lasse...
Hat jemand irgendeine Erklärung für diese ganze Geschichte?
Der neue Empfangsthread sieht so aus:
UINT CserialtestDlg::Thread_Read(LPVOID param)
{
THREADSTRUCT* tsRead = (THREADSTRUCT*)param;
float fAcc0 = .0;
float fAcc1 = .0;
float fAcc2 = .0;
float fOmg0 = .0;
float fOmg1 = .0;
float fOmg2 = .0;
float m_ScaleFactorACC = (float)0.0000186264;
float m_ScaleFactorOMG = (float)720 / 2147483648 * 200;
int iCount = 0;
int iTempCount = 0;
unsigned char Buffer[1];
unsigned char Temp[56];
CString csAcc0, csAcc1, csAcc2, csOmg0, csOmg1, csOmg2, csCRC, csMsgLength, csOut, csCount, csData;
CStdioFile csFile;
csFile.Open(_T("..\\test.txt"), CFile::modeCreate | CFile::modeNoTruncate | CFile::modeWrite);
while(tsRead->m_Wnd->bPortOpen)
{
memset(Buffer, 0, sizeof(Buffer));
memset(Temp, 0, sizeof(Temp));
// Lesemechanismus, das einlesen erfolgt byteweise
if(tsRead->m_Wnd->ComRead(Buffer, 1) == 1)
{
if((Buffer[0] == 0xAA)) // pruefe syncbyte 1
{
iTempCount = 0;
Temp[iTempCount] = Buffer[0];
iTempCount++;
if(tsRead->m_Wnd->ComRead(Buffer, 1) == 1)
{
if(Buffer[0] == 0x44) // pruefe syncbyte 2
{
Temp[iTempCount] = Buffer[0];
iTempCount++;
if(tsRead->m_Wnd->ComRead(Buffer, 1) == 1)
{
if(Buffer[0] == 0x13) // pruefe syncbyte 3
{
Temp[iTempCount] = Buffer[0];
iTempCount++;
for(int i = 0; i < 53; i++) // wenn syncbytes ok, restlichen 53 bytes einlesen
{
if(tsRead->m_Wnd->ComRead(Buffer, 1) == 1)
{
Temp[iTempCount] = Buffer[0];
iTempCount++;
}
}
Struktur_RawImuDaten *ImuDat = (Struktur_RawImuDaten*)Temp;
fAcc0 = ImuDat->acc0 * m_ScaleFactorACC;
fAcc1 = ImuDat->acc1 * m_ScaleFactorACC;
fAcc2 = ImuDat->acc2 * m_ScaleFactorACC;
fOmg0 = ImuDat->phi0 * m_ScaleFactorOMG;
fOmg1 = ImuDat->phi1 * m_ScaleFactorOMG;
fOmg2 = ImuDat->phi2 * m_ScaleFactorOMG;
csAcc0.Format(_T("%f"), fAcc0);
csAcc1.Format(_T("%f"), fAcc1);
csAcc2.Format(_T("%f"), fAcc2);
csOmg0.Format(_T("%f"), fOmg0);
csOmg1.Format(_T("%f"), fOmg1);
csOmg2.Format(_T("%f"), fOmg2);
csOut = csAcc0 + _T("; ") + csAcc1 + _T("; ") + csAcc2 + _T("; ") + csOmg0 + _T("; ") + csOmg1 + _T("; ") + csOmg2 + _T("\r\n");
csFile.WriteString(csOut);
}
}
}
}
}
}
}
//bFileOpen = csFile.Open(_T("..\\test.txt"), CFile::modeCreate | CFile::modeNoTruncate | CFile::modeWrite);
//csFile.WriteString(csData);
return 0;
}