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.
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 {
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
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;
// 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
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;
// 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
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.
Synes godt om
Ny brugerNybegynder
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.