Avatar billede baltazar_ Nybegynder
17. november 2002 - 14:28 Der er 18 kommentarer og
2 løsninger

adresser ?

Jeg har en enhed der giver følgende output
0x0012FF50
0x0012FF54
0x0012FF58
0x0012FF5C
0x0012FF60

hvordan kan jeg convertere disse data til asci

sig til hvis jeg skal gå mere i dataljer, dog er jeg ude efter et eksempel hvis muligt som er forholdsvis godt kommenteret
Avatar billede arne_v Ekspert
17. november 2002 - 14:56 #1
Er det adresser på noget ASCII tekst ?

char *p = 0x0012FF50

printf("%s\n",p);

vil printe det ud, som adreserne peger på.

Det ligner absolut ikke ASCII tekst selv.

Men måske skulle du forklare lidt mere.
Avatar billede baltazar_ Nybegynder
17. november 2002 - 20:37 #2
sorry  glemte at sige det er en byte ;O)
Gør vist en stor forskel
Avatar billede arne_v Ekspert
17. november 2002 - 20:41 #3
Er det adresser på bytes ?

char *p = 0x0012FF50

printf("%c\n",*p);

men jeg er stadigvæk ikke sikker på, at jeg har forstået det
rigtigt.
Avatar billede baltazar_ Nybegynder
17. november 2002 - 20:45 #4
ja det er 8 bit adresser på bytes
og der er data i de oplyste adresser, ( det er det output min kode gir på en ev_rxchar på comport.
Avatar billede arne_v Ekspert
17. november 2002 - 20:59 #5
Hvis det er 32 bit adresser på 8 bit data,
så vil mit sidste kode fragment skrive dem ud som
bogstav.

Hvis du vil have dem ud i hex så:

char *p = 0x0012FF50

printf("%02X\n",*p);
Avatar billede baltazar_ Nybegynder
17. november 2002 - 21:15 #6
ok dette var outputtet  ↕╠╠╠╠§      med

char *p,*p2,buf[1];

p = buf;
p2 = buf + sizeof(buf);
while(p<p2)
{
  // behandl *p
  cout << p++;
}
det ser ok, men de data der vises er ikke det som kommer ind, dvs det der kommer ind er dette og det er det output jeg skal kunne se
data fra seriel port
$GPGSA,A,1,,,,,,201500.966,5538.9124,N,01212.9173,E,0,00,0.0,92.1,M,,,,0000*32
$GPGSA,A,1,,,,,,,,,,,,,0.0,0.0,0.0*30
$GPRMC,201500.966,V,5538.9124,N,01212.9173,E,,,171102,,*16
$GPGGA,201501.965,5538.9124,N,01212.9173,E,0,00,0.0,92.1,M,,,,0000*30
hvad kan vi gøre så det kommer ud som vist.
Avatar billede arne_v Ekspert
17. november 2002 - 21:17 #7
Der mangler en * !

Prøv med:

p = buf;
p2 = buf + sizeof(buf);
while(p<p2)
{
  cout << *p
  p++;
}
Avatar billede baltazar_ Nybegynder
17. november 2002 - 21:21 #8
nu skriver den dette    &#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;
Avatar billede baltazar_ Nybegynder
17. november 2002 - 21:22 #9
ups  det kunne den ikke finde ud af.  den viser nogle sjove tegn.  svært at forklare hvorden det ser ud men det ligner consol grafiske tegn
Avatar billede baltazar_ Nybegynder
17. november 2002 - 21:24 #10
her er en stup kode så du får dybbere indsigt

BYTE Byte;



DWORD dwBytesTransferred;
read:
ReadFile (SerialPort,                // Port handle
          &Byte,                // BOF Pointer
          100,                    // Læser første 25 bytes
          &dwBytesTransferred,  // Pointer to number of bytes
                                // read
          NULL                  // Must be NULL for Windows CE
);
                   
                     
                     
                        // To do.
}
                if (dwEvtMask &EV_RXCHAR ) // Data set ready
{





 
char *p,*p2,buf[100];

p = buf;
p2 = buf + sizeof(buf);
while(p<p2)
{
  cout << *p;
  p++;
}


   


   
           
                        // Hvad skal der ske hvis sand
}
Avatar billede arne_v Ekspert
17. november 2002 - 22:10 #11
Den blev jeg bare mere forvirret af.

Jeg kan ikke se, sammenhængen mellem Byte og buf.

Jeg forstår ikke hvorfor 100 læser 25 bytes.

Og jeg forstå ikke hvordan du kan læse flere bytes
ind  noget som kun er 1 byte.
Avatar billede baltazar_ Nybegynder
17. november 2002 - 23:21 #12
Byte fortæller den læser 1 Byte Buf skulle jo så fortælle hvor mange Bytes den skal hente af ind i bufferen

jeg ved ikke hvad du mener med det sidste
Avatar billede arne_v Ekspert
18. november 2002 - 04:08 #13
Jeg kender ikke den ReadFile funktion.

Men hvis den er ligesom alle andre rad funktioner,
så giver man den:
  - adressen på en buffer med X bytes
  - X
Avatar billede soepro Nybegynder
20. november 2002 - 14:05 #14
Balthazar >> Hvad er det du prøver på ? Læser du fra COM-porten ? Hvis du gør, så tror jeg at grunden til at 100 giver 25 "bytes" er fordi at du læser 4 registre på COM-porten som tilsammen giver een 32-bit integer = 4 bytes. (Byte = 8 bit = 1 char)

Der er noget grundlæggende forkert i den måde du kalder ReadFile() på, som også arne_v er inde på. Den adresse du overfører til ReadFile skal være til en dataområde der er stort nok til at holde (maksimalt) det antal "bytes" du vil hente:

typedef union
{
  char asBYTES[4];
  int  asDWORD;
}      serData;
serData buffer[25];
DWORD  dwBytesTransferred;

// dwEvtMask forudsætter jeg læst et eller andet sted
if (dwEvtMask & EV_RXCHAR) // Data set ready
{
  ReadFile(SerialPort,          // Port handle
          &buffer,              // Buffer pointer !!!
          sizeof(buffer),      // Længde på den !!
          &dwBytesTransferred,  // Pointer to number of bytes actually read
          NULL                  // Must be NULL for Windows CE
  for (int idx = 0; idx < dwBytesTransferred/sizeof(serData); idx++)
  {
    cout << "As bytes" << buffer[idx].asBYTES[0] << buffer[idx].asBYTES[1] << buffer[idx].asBYTES[2] << buffer[idx].asBYTES[3] << endl;
    cout << "As DWORD" << buffer[idx].asDWORD << endl;
  };
}; // If port ready
Avatar billede soepro Nybegynder
20. november 2002 - 14:22 #15
Hvis det du får tilbage fra ReadFile rent faktisk er der tekst du skriver ovenfor (altså 0x0012FF50, ox0012FF54, 0x0012FF58, 0x0012FF5C, 0x0012FF60 osv.), så ligner det jo til forveksling pointere til et DWORD (offset ændres med 4 bytes = 32 bits hver gang). Hvis du skal have fat i de værdier (og Windows tillader dette, for værdierne ligger vel så i et andet programs segment - eller er det shared memory ?), så skal du oversætte teksterne til en DWORD pointer, før du kan få fat i dem:

typedef union
{
  char asBYTES[4];
  int  asDWORD;
}      serData;

serdata *ptr;
char  buffer[11]; // 8 cifre + 0x + '\x0'
DWORD  dwBytesTransferred;

// dwEvtMask forudsætter jeg læst et eller andet sted
if (dwEvtMask & EV_RXCHAR) // Data set ready
{
  ReadFile(SerialPort,          // Port handle
          &buffer,              // Buffer pointer !!!
          sizeof(buffer),      // Længde på den !!
          &dwBytesTransferred,  // Pointer to number of bytes actually read
          NULL                  // Must be NULL for Windows CE
  if (dwBytesTransferred == sizeof(buffer))
  {
    int x;
    sscanf("0x0012FF50", "%x", &x);
    ptr = (serData *)x;
    cout << "As bytes" << ptr->asBYTES[0] << ptr->asBYTES[1] << ptr->asBYTES[2] << ptr->asBYTES[3] << endl;
    cout << "As DWORD" << ptr->asDWORD << endl;
  };
}; // If port ready
Avatar billede soepro Nybegynder
20. november 2002 - 14:23 #16
Hvor sscanf("0x0012FF50", "%x", &x); selvfølgelig skulle have været:

sscanf(buffer, "%x", &x);
Avatar billede baltazar_ Nybegynder
20. november 2002 - 21:52 #17
hmm kan stadigt ikke få gang i det,  nu skriver den slet ikke noget, jeg har testet min signal kilde og den er ok, signalet som kommer er, jeg kan simpelthen ikke gennemskue hvor det går galt

min kode ser således ud nu. Håber i har lidt tid

  if (WaitCommEvent(SerialPort, &dwEvtMask, &o))

if (dwEvtMask & EV_DSR) //Clear to send
{
printf("DSR SIGNAL MODTAGET");
Sleep(5000);
return 4;
}
if (dwEvtMask &EV_CTS ) // Data set ready
{
// IF To do Start.
printf("CTS SIGNAL MODTAGET");
Sleep(5000);
return 5;
// IF To do Slut.
}
typedef union
{
  char asBYTES[4];
  int  asDWORD;
   


}
serData;
serData *ptr;
char  buffer[11]; // 8 cifre + 0x + '\x0'
DWORD  dwBytesTransferred;

// dwEvtMask forudsætter jeg læst et eller andet sted
if (dwEvtMask & EV_RXCHAR) // Data set ready
{
  ReadFile(SerialPort,          // Port handle
          &buffer,              // Buffer pointer !!!
          sizeof(buffer),      // Længde på den !!
          &dwBytesTransferred,  // Pointer to number of bytes actually read
          NULL  ) ;              // Must be NULL for Windows CE
  if (dwBytesTransferred == sizeof(buffer))
  {
    int x;
    sscanf(buffer, "%x", &x);
    ptr = (serData *)x;
    cout << "As bytes" << ptr->asBYTES[0] << ptr->asBYTES[1] << ptr->asBYTES[2] << ptr->asBYTES[3] << endl;
    cout << "As DWORD" << ptr->asDWORD << endl;

     
  };
 

}; // If port ready


 


Sleep(600); // Venter 6 sek.

}           
// To do EV_RXCHAR slut

}


{
Sleep(2000);

// I det tilfællede du vil evt vente på en char på porten er det evt EV_RXCHAR du skal vente på..
// Husk at rydde op



CloseHandle(SerialPort);
goto start;
return 7;

}
}
Avatar billede baltazar_ Nybegynder
20. november 2002 - 21:55 #18
jeg skal måske lige tilføje at jeg læser fra com porten med disse indstillinger

dcb.BaudRate = CBR_4800;
        dcb.ByteSize = 8;             
        dcb.Parity = NOPARITY;
        dcb.StopBits = ONESTOPBIT;
Avatar billede baltazar_ Nybegynder
20. november 2002 - 23:07 #19
det virker som om den slet ikke kommer ind og læser i bufferen
Avatar billede soepro Nybegynder
21. november 2002 - 10:49 #20
balthazar >> Hvorfor hopper du ud på DSR (DataSet Ready) og CTS (Clear To Send) ?

DSR betyder at enheden HAR noget at sende til dig - CTS at den er klar til evt. at modtage noget fra dig. Jeg vil næsten tro at ReadFile allerede checker dette (det er jo en del af standard RS232C protokollen), så det tror jeg altså ikke du selv behøver at håndtere. Normalt laver man kun disse checks, for lige at sikre sig at der er en enhed i den anden ende af COM-porten, inden man begynder at læse fra den. (For ikke at hænge.)

Den ser lidt rodet ud din kode - du laver CloseHandle() på serial porten til sidt, men har ikke åbnet den ?!? Hvorfor er det så mange blanke/ubrugte linier ?!? Har du ikke lavet lidt indrykning så du selv kan finde rundt i hvad der sker hvor ?!

Måske skulle du rydde lidt op i din kode, og skære ned til det grundlæggende og prøve at få det til at virke.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester