Hallo,
ist wirklich nicht kompliziert, Du bekommst Pakete a 9 Bytes (bInputReport) von der HID (USB) Schnittstelle, in bData wird der Datensatz gesammelt:
//Für HID Erkennung
#define WMRS200_VENDOR_ID 0x0fde
#define WMRS200_PRODUCT_ID 0xca01
int iloop=0;
//bInputReport[1] = Anzahl gültiger Bytes im Paket
//die gültigen Bytes hintereinanderhängen, bis am Ende 2 mal 0xFF steht, dann geht neuer Datensatz los
//letzte 2 Bytes im Datensatz Checksumme
while (iloop<bInputReport[1])
{
bData[iDataPos++]=bInputReport[2+iloop];
if (iDataPos>3)
//2 mal 0xff ganz hinten heisst Datensatz fertig
if ((bData[iDataPos-1]==255)&&(bData[iDataPos-2]==255))
{
if (pWmrs200->ChecksumOK((LPBYTE)&bData,iDataPos))
pWmrs200->ParseWMRS200Data((LPBYTE)&bData));
iDataPos=0;
}
iloop++;
}
Dann die Prüfsumme rechnen:
DWORD dwCheckSoll,dwCheckIst;
int loop;
//Im Datensatz ist die Prüfsumme die letzten 2 Bytes vor den 2 0xFFs
dwCheckIst=(lpbData[iDataPos-3]*256)+lpbData[iDataPos-4];
//Prüfsumme ist die Summe aller Bytes im Datensatz ohne die Prüfsumme
for (dwCheckSoll=loop=0;loop<iDataPos-4;loop++)
dwCheckSoll+=lpbData[loop];
return (BOOL)(dwCheckSoll==dwCheckIst);
Und dann hat man eben diese Datensätze variabler Länge, und das ist das „eigentliche“ Protokoll:
Hier ist der Typ des Datensatzes codiert
switch (lpbData[1])
{
//Regen
case 65:
{
//Regen ist in Inch
iInchRainThisHour=lpbData[5]*256+lpbData[4];
iInchRainLast24h=lpbData[7]*256+lpbData[6];
iInchRainSinceReset=lpbData[9]*256+lpbData[8];
}
break;
//Temperatur & Luftfeuchte
case 66:
{
//0=Innen, 1=Aussen, 2-10 zusätzliche Sensoren
iSensor=(lpbData[2]&15);
iTemp=((lpbData[4]&127)256+lpbData[3]);
if (lpbData[4]&128)
iTemp=-1;
iHumidity=lpbData[5];
}
break;
//Luftdruck
case 70:
{
//es ist immer der Druck auf Seehöhe der zurückkommt
iPressLocal=((lpbData[3]&3)*256)+lpbData[2];
iPressSee=((lpbData[5]&3)*256)+lpbData[4];
iPresTrend=((lpbData[5]&252)<<4);
iPresStatus=((lpbData[3]&252)<<4);
fResult=TRUE;
}
break;
//Wind
case 72:
{
/*
0 N
1 NNe
2 ne
3 ene
4 e
5 ese
6 se
7 sse
8 s
9 ssw
10 sw
11 wsw
12 w
13 wnw
14 nw
15 nnw
*/
iWindDeg=lpbData[2]; /0-16 siehe oben
iWindSpitze=lpbData[4]; // in M/s
iWindAvg=(int)((lpbData[6]*256+lpbData[5])/16);// in M/s
}
break;
}
Wirklich, wenn man nicht Wert auf eine Software dazu legt oder ein Bedienterminal, dann ist das Ding für den Preis eigentlich unschlagbar. Und da es sich über das USB Kabel mit Strom versorgt, muss man nicht auch noch ein Netzteil nehmen.
Grüße
Andreas