und wieder c++ problem:D
Hi leute und wieder habe ich ein problem
es geht um folgendes ich habe paar threads davor geschrieben dass ich eine schnittstelle angesprochen habe. also text in eingabe feld eingegegen und der text erschien dann bei COM1 nun will ich den text aus COM1 erhalten habe die funktion ReadFile genutzt
problem an der ganzen sache ist das ich 255 zeichen erhalte und neue zeile wird geschrieben aber ich will soviele zeichen erhalten wie gesendet wurden sind. wie kann ich die länge des eingegebenen textes aus COM1 ermitteln. in foren wird ReadFIle meist für Datei lesen benutzt und die benutzen da GetLenght() aber in meinem fall würde es nciht gehen oder doch??
MFG
es geht um folgendes ich habe paar threads davor geschrieben dass ich eine schnittstelle angesprochen habe. also text in eingabe feld eingegegen und der text erschien dann bei COM1 nun will ich den text aus COM1 erhalten habe die funktion ReadFile genutzt
|
|
Quellcode |
1 |
ReadFile(hFile,pszBuffer,255, &dwBytesRead, NULL); |
problem an der ganzen sache ist das ich 255 zeichen erhalte und neue zeile wird geschrieben aber ich will soviele zeichen erhalten wie gesendet wurden sind. wie kann ich die länge des eingegebenen textes aus COM1 ermitteln. in foren wird ReadFIle meist für Datei lesen benutzt und die benutzen da GetLenght() aber in meinem fall würde es nciht gehen oder doch??
MFG
Mein kleines Projekt
-Cruel Online-
-Cruel Online-
Ja das ist nicht so einfach.
GetLength kannste nich nehmen weil du nciht weist ob zur ausführung schon alles übertragen wurde.
Hier habe ich das mal schematisch besnipplet:
Die Applikation muss ja erkennen wann der Text zuende ist; Meist wird das über ein Protokoll geregelt.
Im fall von "Hallo Welt." währe das Letzte Zeichen also der "."
Existiert ein Protokoll/ein Schema für die Datenübertragung? Oder wie stellst du fest dass keine Zeichen mehr folgen?
GetLength kannste nich nehmen weil du nciht weist ob zur ausführung schon alles übertragen wurde.
Hier habe ich das mal schematisch besnipplet:
Die Applikation muss ja erkennen wann der Text zuende ist; Meist wird das über ein Protokoll geregelt.
|
|
Quellcode |
1 2 3 4 5 6 7 8 9 |
WIEDERHOLE {
WIEDERHOLE ( BIS ZEICHEN ZUR VERFÜGUNG STEHT ) {
WARTE ( ... )
WENN ( ZEITLIMIT ERREICHT ) ABBRUCH;
}
LESE ZEICHEN
} BIS ZEICHEN = LETZTES_ZEICHEN
|
Im fall von "Hallo Welt." währe das Letzte Zeichen also der "."
Existiert ein Protokoll/ein Schema für die Datenübertragung? Oder wie stellst du fest dass keine Zeichen mehr folgen?
Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von »nocturne« (8. August 2008, 15:06)
also ich schicke los das ist ein test und es kommt raus das ist ein test dann schicke es ungefair 3 mal ab und ab 3en mal kommt dann dann das ist und dann neue zeile ist ein test weil nach 3 mal + sind die 255 zeichen verbraucht das finde ich auch das komische daran ich dachte der reserviert ein puffer für jeden read aber er benutzt alle 255 zeichen bis sie aufgebraucht sind
Mein kleines Projekt
-Cruel Online-
-Cruel Online-
Hmm du musst dir die RS 232 Implementierung von Windows so vorstellen:
InternerWindowsPuffer = 0;
IndexPointer = 0;
Kommen daten an, werden sie in den Puffer gepackt
InternerWindowsPuffer = "Das ist ein TestString";
IndexPointer = 0;
Machst du jetzt einen Read
ReadFile(hFile,pszBuffer,3, &dwBytesRead, NULL);
tut sich folgendes:
pszBuffer wird "Das" enthalten, und der IndexPointer wird um 3 erhöht.
Machst du jetzt einen Read von z.B. 255, dann ließt er ab den aktuellen IndexBuffer bis zum ende des Buffer, das kann dann weniger als 255 Zeichen sein -> deshab auch die variable dwBytesRead, die der sagt wieviel Bytes gelesen worden sind.
Was dir jetzt vielleicht passiert ist folgedes:
Read 1 (vollen string bekommen, pszBuffer wurde bis zum ende verwendet: pszBuffer = { 'D', 'a', 's', ' ', 'i', 's', 't' ..... };
Read 2 (nur 3 Buchstaben empfangen),: pszBuffer = { 'N', 'E', 'U', [alte daten, wurde ja nicht überschrieben] }.
Read reserviert ja keinen buffer, das musst du ja machen (pszBuffer).
Übrigens, wie verschickst du den Text? Wie ist er kodiert? ASCII? (Singlebyte), Widechar (2-Byte), Unicode (Multybyte?). Enden deine Texte mit '\0'? falls ja kannst du ja folgendes machen:
Den oberen code kann mit mit ein paar modifkationen so verwendet, das so lange zeichen gelesen werden bis der text zu ende ist ( z.B. '\0' ), und er dann wieder von vorne beginnt.
Dann würdest du dir ne Funktion "OnTextLineRcv( String empfangenerText )" schreiben und darin weiterarbeiten ;-)
InternerWindowsPuffer = 0;
IndexPointer = 0;
Kommen daten an, werden sie in den Puffer gepackt
InternerWindowsPuffer = "Das ist ein TestString";
IndexPointer = 0;
Machst du jetzt einen Read
ReadFile(hFile,pszBuffer,3, &dwBytesRead, NULL);
tut sich folgendes:
pszBuffer wird "Das" enthalten, und der IndexPointer wird um 3 erhöht.
Machst du jetzt einen Read von z.B. 255, dann ließt er ab den aktuellen IndexBuffer bis zum ende des Buffer, das kann dann weniger als 255 Zeichen sein -> deshab auch die variable dwBytesRead, die der sagt wieviel Bytes gelesen worden sind.
Was dir jetzt vielleicht passiert ist folgedes:
Read 1 (vollen string bekommen, pszBuffer wurde bis zum ende verwendet: pszBuffer = { 'D', 'a', 's', ' ', 'i', 's', 't' ..... };
Read 2 (nur 3 Buchstaben empfangen),: pszBuffer = { 'N', 'E', 'U', [alte daten, wurde ja nicht überschrieben] }.
Read reserviert ja keinen buffer, das musst du ja machen (pszBuffer).
Übrigens, wie verschickst du den Text? Wie ist er kodiert? ASCII? (Singlebyte), Widechar (2-Byte), Unicode (Multybyte?). Enden deine Texte mit '\0'? falls ja kannst du ja folgendes machen:
|
|
Quellcode |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
ReadFile(hFile,pszBuffer,255, &dwBytesRead, NULL);
int i=0;
String strLine;
while( i < dwBytesRead )
{
switch( pszBuffer[i] )
{
case '\0':
//strLine enthält nun einen empfangen text, tu was damit
OnTextLineRcv( strLine );
strLine.clear();
break;
default:
strLine.AppenChar( pszBuffer[i++] );
break;
}
}
|
Den oberen code kann mit mit ein paar modifkationen so verwendet, das so lange zeichen gelesen werden bis der text zu ende ist ( z.B. '\0' ), und er dann wieder von vorne beginnt.
Dann würdest du dir ne Funktion "OnTextLineRcv( String empfangenerText )" schreiben und darin weiterarbeiten ;-)
Aktuell nutze ich: Windows, Linux, MacOS X, Solaris...weil die Welt nicht nur S/W ist!
Blog
Blog
ich versende den text als char ursprünglich ist er ansistring und danke für deine hilfe muss mal den text nur noch ändern und testen
Mein kleines Projekt
-Cruel Online-
-Cruel Online-
hm.. stecke immer noch in dem problem. habe mir überlegt sobald das end zeichen angekommen ist soll der puffer auf 0 gesetzt werden. aber wie? also in meinem beispiel sieht das so aus:
text den ich eingebe = "Das ist ein Test"
text der gesendet wird = "02 19 00 00 02 00 03 44 61 73 74 20 65 69 6E 20 54 65 73 74 00 03"
die zahlen folge kommen an und "Das ist ein Test" wird in einer message box ausgegeben.
03 ganz hinten steht für ETX vllt könnte man ja irgendwie den buffer leeren um wieder von vorne zu lesen.
und die 19 steht für die länge der gesendeten bytes.(vllt hilft das irgendwie weiter) ich weis cshon vorher wieviele zeichen ich sende es sind nur jedes mal unterschiedlich viele desswegen kann ich 255 als size nicht verwenden
MFG
text den ich eingebe = "Das ist ein Test"
text der gesendet wird = "02 19 00 00 02 00 03 44 61 73 74 20 65 69 6E 20 54 65 73 74 00 03"
die zahlen folge kommen an und "Das ist ein Test" wird in einer message box ausgegeben.
03 ganz hinten steht für ETX vllt könnte man ja irgendwie den buffer leeren um wieder von vorne zu lesen.
und die 19 steht für die länge der gesendeten bytes.(vllt hilft das irgendwie weiter) ich weis cshon vorher wieviele zeichen ich sende es sind nur jedes mal unterschiedlich viele desswegen kann ich 255 als size nicht verwenden
MFG
Mein kleines Projekt
-Cruel Online-
-Cruel Online-
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »cccpmik« (12. August 2008, 16:22)
Welchen Buffer? Deinen eigenen?
|
|
Quellcode |
1 2 3 4 5 |
BYTE *pBuffer = new BYTE[255]; //buffer löschen: memset( pBuffer, 0, 255 ); //oder ZeroMemory( pBuffer, 255 ); |
Aktuell nutze ich: Windows, Linux, MacOS X, Solaris...weil die Welt nicht nur S/W ist!
Blog
Blog
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »silence« (12. August 2008, 20:27)
ja diese funktionen habe ich gemacht aber irgendwie funzt das nicht genau so wie delete pszBuffer
Mein kleines Projekt
-Cruel Online-
-Cruel Online-
delete dealloziert den speicher komplett, d.h. du musst nachdem du delete buffer aufgerufen hast mit new einen neuen erstellen.
Performencemäßig besser sollten memset und zeromemory machen, sie setzten allozierten speicher auf 0 bzw. im Falle von memset auf einen beliebigen wert.
Übringens, ein mit new allozierter Speicherbereich ist keineswegs 0, vielmehr besteht er aus "zufälligen" daten...
Performencemäßig besser sollten memset und zeromemory machen, sie setzten allozierten speicher auf 0 bzw. im Falle von memset auf einen beliebigen wert.
Übringens, ein mit new allozierter Speicherbereich ist keineswegs 0, vielmehr besteht er aus "zufälligen" daten...
Aktuell nutze ich: Windows, Linux, MacOS X, Solaris...weil die Welt nicht nur S/W ist!
Blog
Blog
ich habe ein tipp bekommen. ich versende ja zeichen codes wie ich davor das geschrieben habe. mir wurde gesagt am besten sollte ich prüfen ob das gesendete mit 02 beginnt und mit 03 endet und die anzahl der zeichen enthält die in den ersten 4 zeichen folgen stehen alles was davor oder danach kommt soll ignoriert werden. aber was wenn ein 02 und 03 zeichen kommt und es gar nicht das anfang und ende zeichen ist? wie soll ich sowas am besten prüfen?
zb ich verschicke 02 04 00 03 das bedeutet 02 ist anfang 04 00 ist anzahl der gesendeten zeichen und 03 ist ende des gesendeten telegramms. was wenn da 02 02 00 03 03 gesendet wird? dann weis ich nciht wirklich wo anfang und ende ist.
kann mir jemand da weiterhelfen?
zb ich verschicke 02 04 00 03 das bedeutet 02 ist anfang 04 00 ist anzahl der gesendeten zeichen und 03 ist ende des gesendeten telegramms. was wenn da 02 02 00 03 03 gesendet wird? dann weis ich nciht wirklich wo anfang und ende ist.
kann mir jemand da weiterhelfen?
Mein kleines Projekt
-Cruel Online-
-Cruel Online-
Ähnliche Themen
-
Hardware »-
USB Stick wird nicht mehr erkannt
(12. April 2008, 13:12)
-
FreeWebspace »-
Webspace nix funktioniert
(22. August 2004, 22:31)
-
Archiv: Software »-
Problem mit optischer USB Maus
(27. April 2003, 10:58)
-
Foren-, Blog- und Content-Managementsysteme »-
Burning Board- Einlogg Problem
(15. März 2003, 21:58)


