Toon posts:

C-Struct via UDP inlezen in VB.NET

Pagina: 1
Acties:

Verwijderd

Topicstarter
Over niveau gesproken:

Een sensor stuurt de volgende struct per UDP naar een IP op een bepaalde poort. De C-Struct is dit:

code:
1
2
3
4
5
6
7
8
typedef struct Message
{
   char         Name[25];
   unsigned int     Type;
   unsigned int     RH;
   unsigned int     Temp;
   unsigned int     Buffer
}


en de routines om RH en Temp te converten van unsigned int naar float zijn dit (en ja, ik heb ze al omgezet naar VB>NET, maar de C code leest wat beter):
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
float ConvertTemp(unsigned int Temp)    /* converts 16 bit notation to real temp */
{
    float temperature;
    temperature=Temp;
    return (temperature/168.055)-273.16;
}

float ConvertRH(unsigned int RH)            /* converts 16 bit notation to real RH */
{
    float rh;
    float CalcRH;
    float Volt;
    float temp = 18;
    rh=RH;
    Volt = (2.500 * (rh/65536));
    Volt=(1/0.558)*Volt;
    CalcRH= (161.29/(1.0546-(0.00216*temp)))*((Volt/5)-0.16);
    return CalcRH;
}


Deze struct wordt verstuurd via UDP, en ik vang deze in VB op in een Byte-array (alles achter elkaar dus).
Nu wil ik zorgen dat ik de properties kan uitlezen.

mijn idee was dit:
code:
1
2
3
4
5
6
'rdata = byte array van length 33 (unsigned int is 16 bit)
Dim name As String = Encoding.ASCII.GetString(rdata, 0, 25)
Dim Type As Int16 = CInt(rdata.GetValue(25)) * 256 + CInt(rdata.GetValue(26))
Dim RH As Int16 = CInt(rdata.GetValue(27)) * 256 + CInt(rdata.GetValue(28))
Dim Temp As Int16 = CInt(rdata.GetValue(29)) * 256 + CInt(rdata.GetValue(30))
Dim Buffer As Int16 = CInt(rdata.GetValue(31)) * 256 + CInt(rdata.GetValue(32))


helaas geeft dit temperaturen van -83 etc... niet direct de bedoeling.

Nu is mijn vraag, kan iemand me helpen met het uitlezen van deze waardes (het byta array) in VB.NET?

  • Korben
  • Registratie: Januari 2001
  • Laatst online: 14-11-2025

Korben

() => {};

Heeft het misschien te maken met big/little endian?

.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?


Verwijderd

Topicstarter
Mogelijk, toen ik het hele zaakje in C++ inlas moest ik ook de byte alignment op 1 zetten. Dat lijkt me hier echter niet van toepassing omdat de syntax van
Byte.GetValue(offset as integer) is. Je geeft dus zelf aan waar hij de waarde moet pakken, zou erg zinloos zijn als hij dan niet eens per byte kan offsetten, toch?

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 12:21
Probeer eens de binary data in hexadecimale notatie te printen, vanuit C++ en BASIC? Dan zie is iig duidelijk hoe de data er uitziet.

Verwijderd

Bekijk het UDP frame eens middels een sniffer en kijk vervolgens of bij de verstuurde waarden de lsb voorop zit (little endian) of de msb voorop zit (big endian), waarschijnlijk doet VB dit net andersom

Verwijderd

Topicstarter
het stomme is, ik C kan ik makkelijk de struct uitlezen uit een bestand (gewoon de struct inlezen, en daarna de individuele types eruit pakken)
Als ik het zelfde in dotNET wil doen, moet ik de gegevens ui het byte array pakken.

Ik heb met UltraEdit de waardes in HEX bekeken, de eerste string kan ik zonder problemen herkennen. Het probleem wat ik nu heb is dat ik de waardes uit het byte array kan pakken in een UInt16 (16 bit unsigned int, klopt ook), maar met die Unsigned int kan ik nou net niets! nog niet eens een vermenigvuldiging, of conversie naar integer.

Verwijderd

Topicstarter
anyway, ik zit er nu sterk aan te denken om het hele pakket maar in c++ te maken, ook al kunnen mijn collega's dat niet lezen... hebben ze meteen een mooie reden om c++ te leren :)
Pagina: 1