Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Puffer leeren nach readfile, aber wie?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
06.05.2004, 19:04 Uhr
~Tomycat
Gast


hi,
es handelt sich um eine Schnittstellen für Comport 1 um zu einen Gerät Daten senden und empfangen.Es ist eine MFC c++ Anwendung, geschrieben in VS 2003 net
Ich habe 3 Köpfe:
Verbinden, resest-lesen, schreiben-lesen.
Der 1te Knopf funkt 1a
Der 2te Knopf funkt 1a
Beim 3ten Knopf bricht der Compiler ab, nach contine, schreibt er müll in die Variable log.Weil noch was im Puffer ist, wurde mir gesagt.
Wie kann ich den Puffer leeren daß ich nach writefile readfile benutzen kann?

------------------für die Verbindung auf com1 -------------------------------

C++:

//DCB dcb,dcb_neu; <--- das geändert.. auf global ;)
COMMTIMEOUTS cto,cto_neu;

//und das h_com geändert auf global ;)
h_com=CreateFile("\\\\.\\COM1",GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);

GetCommState(h_com, &dcb);
GetCommState(h_com, &dcb_neu);
GetCommTimeouts(h_com,&cto);
GetCommTimeouts(h_com,&cto_neu);

dcb_neu.DCBlength       = sizeof(dcb_neu);
dcb_neu.BaudRate        = 9600;    // Baudrate
dcb_neu.fParity         = FALSE;
dcb_neu.fBinary         = TRUE;
dcb_neu.Parity          = NOPARITY;// Kein Paritybit
dcb_neu.StopBits        = ONESTOPBIT;
dcb_neu.fOutxCtsFlow    = FALSE;
dcb_neu.fOutxDsrFlow    = FALSE;
dcb_neu.fDtrControl     = DTR_CONTROL_ENABLE;
dcb_neu.fDsrSensitivity = FALSE;
dcb_neu.fAbortOnError   = FALSE;
dcb_neu.ByteSize        = 8;       // 8 Datenbits

cto.ReadIntervalTimeout = MAXDWORD; // 0 ms Read-Tomeout
cto.ReadTotalTimeoutMultiplier = 0;
cto.ReadTotalTimeoutConstant   = 0;
cto.WriteTotalTimeoutMultiplier= 1; // 1*2 ms Write Timeout
cto.WriteTotalTimeoutConstant  = 2;

SetCommState(h_com, &dcb_neu);
SetCommTimeouts(h_com,&cto_neu);
GetDlgItem(IDC_verbinden3)->EnableWindow(FALSE);
GetDlgItem(IDC_trennen3)->EnableWindow(TRUE);

-------------reset impulse und darauf mit readfile lesen -------------------------------------------

dcb.fRtsControl=RTS_CONTROL_ENABLE; // RESET
if (!SetCommState(h_com, &dcb))
  return ;
dcb.fRtsControl=RTS_CONTROL_DISABLE; //RESET OFF
// Wait for 50 ms
Sleep(50);
if (!SetCommState(h_com, &dcb))
return ;

CString str;
DWORD dwCount;
unsigned char cData[2];
int byte;
for (byte = 0; byte <10; byte++)
{

ReadFile(h_com,cData,2,&dwCount,0);
log += dezhex(cData[0]);
log += dezhex(cData[1]);

}
------------------- writefile und darauf readfile (klappt nicht)-------------------

DWORD dwCount,up;
unsigned char cData[2];
unsigned char schreiben[2];
int byte;
char wert[6];
wert[0] = 1;
wert[1] = 2;
wert[2] = 2;
wert[3] = 3;
wert[4] = 0;
wert[5] = 0;
wert[6] = 125;


for (byte = 0; byte <7; byte++)
{
schreiben[byte] = wert[byte];
//  schreiben[1] = wert[1];
WriteFile(h_com,schreiben,1,&dwCount,0);
log += schreiben[byte];
// log += schreiben[1];
}
    UpdateData(FALSE);



for (byte = 0; byte <13; byte++)
{

ReadFile(h_com,cData,2,&dwCount,0);
log += dezhex(cData[0]);
log += dezhex(cData[1]);

}
log += "\r\n";
    UpdateData(FALSE);




Bearbeitung von Pablo:

Bitte sich an den Regeln halten und CPP Tags selber benutzen


Dieser Post wurde am 10.05.2004 um 22:42 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
06.05.2004, 19:29 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


PurgeComm ?
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
06.05.2004, 22:06 Uhr
~Tomycat
Gast


hi,
also,
wenn ich den Quelltext unverändert, so wie er ist, compiliert,
dann bekomme ich bei
klick auf knopf1(Verbinden),
dann klick auf kopf2(reset-read)
dann klick auf kopf3(write/read)
eine Fehlermeldung

Run-Time Check Failure #2 - Stack around the variable 'wert' was corrupted.

Nach ein bischen googleln nach "PurgeComm". fand ich

in einem Quelltext stand "Pufferleeren" und folgende if Abfrage:


C++:
if(!PurgeComm( h_com, PURGE_TXABORT  ))
    {
        log += "Befehl gibts nicht";
}



Den Befehl mal vor write und einmal nach readfile gesetzt,
gleiche Fehlermeldung!!!

Hab ich ein Programmierfehler gemacht?
Liegt es am Puffer?
Sorry, aber ich blicks gerade nicht, kann mir jemandauf die Sprünge helfen?

mfg Tomycat
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
07.05.2004, 16:55 Uhr
~Tomycat
Gast


hi,
also ich probierte jetzt folgendes,
tatsächlich fand ich was über PurgeComm bei Mircosoft. :-)
Jetzt ist folgendes:
ohne

C++:

if(!PurgeComm(h_com,PURGE_RXCLEAR ))
    {
UpdateData(TRUE);
        log += "Befehl gibts nicht";
UpdateData(FALSE);
}





bekomme ich die gleiche Variable wie beim zweiten Kopf, 9f 9F.....
Mit, da wird der Puffer gelöscht, beikomme ich CCCCCCCCCCC....
Ich sollte aber eine Antwort bekommen wie 01 02 ....
Wo liegt der Fehler?

--------------neuer 3ter Knopf (puffer löschen, writefile, readfile)----------

C++:
if(!PurgeComm(h_com,PURGE_RXCLEAR ))
    {
UpdateData(TRUE);
        log += "Befehl gibts nicht";
UpdateData(FALSE);
}

CString str;
    DWORD dwCount,down;
unsigned char ant[10];
unsigned char schreiben[2];
int byte;
char wert[7];
wert[0] = 1;
wert[1] = 2;
wert[2] = 2;
wert[3] = 3;
wert[4] = 0;
wert[5] = 0;
wert[6] = 125;

WriteFile(h_com,wert,8,&dwCount,0);

UpdateData(TRUE);
log += "ok\r\n";
str.Format("%d",wert[6]);
log += str;
    UpdateData(FALSE);



ReadFile(h_com,ant,10,&down,0);

UpdateData(TRUE);
log += "die antwort\r\n";
str.Format("%d",ant[0]);
log += str;
    UpdateData(FALSE);

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
10.05.2004, 18:33 Uhr
~Tomycat
Gast


hi,
geht nicht, will einfach nicht, verzweiflung !!!
ich habe folgendes zwieschen meinen beiden Befehle writefile und readfile geklemmt.

PurgeComm(h_com,PURGE_RXCLEAR );
PurgeComm(h_com,PURGE_TXCLEAR );

das was ich mit writefile in den Puffer reinschreibe und versende, das gleiche bekomme ich auch mit readfile wiederraus, einfach die gleiche Daten aber wieso? Ich mach doch den Puffer leer.

mfg Tomycat
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
10.05.2004, 18:36 Uhr
~Tomycat
Gast


hi,
kleiner Nachtrag,
den Befehl

FlushFileBuffers(h_com);

habe ich auch dazwieschen geklemmt, geht auch nicht
10000 DAnk im Voraus.
mfg Tomycat
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
10.05.2004, 18:41 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


ich habe purgecomm bisher nur für nen receive-buffer benutzt(genauso wie du es auch gepostet hast) und da hats einwandfrei gefunzt...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
10.05.2004, 22:12 Uhr
~Tomycat
Gast


hi,
*riesenfreudeherzlacht*
ich muß nur zwieschen writefile und readfile sleep(50);
mehr nicht !!!
trotzdem thx an Windalf
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: