Ga naar inhoud

C++,


anoniem

Aanbevolen berichten

Nu heb ik dit probleem; er is een terminal gemaakt in C++ Builder... Er is een microcontroller aangesloten op de compoort zodat we stukjes tekst in de microcontroller kunnen zetten. Nu gaat dat helemaal goed met behulp van een Memo veldje, het "luisterd" naar toetsaanslagen en stuurt ze direct door naar de com poort. Nu wil ik ook graag een String uit een txt'je op het internet kunnen versturen naar de microcontroller. Daarvoor gebruik ik: [code:1:cf81ca3812] //--------------------------------------------------------------------------- #include <vcl\vcl.h> #pragma hdrstop #include "Main.h" #include "Thread.h" // GLOBAL VARIABLES HANDLE hComm = NULL; TRead *ReadThread; COMMTIMEOUTS ctmoNew = {0}, ctmoOld; //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TfrmMain *frmMain; //--------------------------------------------------------------------------- __fastcall TfrmMain::TfrmMain(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TfrmMain::FormCreate(TObject *Sender) { DCB dcbCommPort; // OPEN THE COM PORT. // REPLACE "COM1" WITH A STRING OR "COM1", "COM3", ETC. TO OPEN // ANOTHER PORT. hComm = CreateFile ("COM1", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0); // IF THE PORT CAN'T BE OPENED, BAIL OUT. if (hComm == INVALID_HANDLE_VALUE) Application->Terminate(); // SET THE COMM TIMEOUTS IN OUR EXAMPLE. GetCommTimeouts (hComm,&ctmoOld); // Default setting is 100 ctmoNew.ReadTotalTimeoutConstant = 0; ctmoNew.ReadTotalTimeoutMultiplier = 0; ctmoNew.WriteTotalTimeoutMultiplier = 0; ctmoNew.WriteTotalTimeoutConstant = 0; SetCommTimeouts (hComm, &ctmoNew); // SET BAUD RATE, PARITY, WORD SIZE, AND STOP BITS. dcbCommPort.DCBlength = sizeof (DCB); GetCommState(hComm, &dcbCommPort); BuildCommDCB("9600,N,8,1", &dcbCommPort); SetCommState(hComm, &dcbCommPort); // Start the thread ReadThread = new TRead(false); } //--------------------------------------------------------------------------- void __fastcall TfrmMain::FormClose(TObject *Sender, TCloseAction &Action) { // Stop the thread ReadThread->Terminate(); // WAIT FOR THE THREAD TO TERMINATE, // PURGE THE INTERNAL COMM BUFFER, // RESTORE THE PREVIOUS TIMEOUT SETTINGS // AND CLOSE THE COMM PORT. Sleep(250); PurgeComm(hComm, PURGE_RXABORT); SetCommTimeouts(hComm, &ctmoOld); CloseHandle(hComm); } //--------------------------------------------------------------------------- void __fastcall TfrmMain::mInvoerKeyPress(TObject *Sender, char &Key) { // TRANSMITS ANYTHING TYPED INTO THE MEMO AREA. TransmitCommChar(hComm, Key); // THIS PREVENTS TYPED TEXT FROM DISPLAYING GARBAGE ON THE SCREEN. // IF WE ARE CONNECTED TO A DEVICE THAT ECHOES CHARACTERS, SET // Key = 0 WITHOUT THE OTHER STUFF. if (Key != 13 && (Key < ' ' || Key > 'z')) Key = 0; } //--------------------------------------------------------------------------- void __fastcall TfrmMain::Exit1Click(TObject *Sender) { frmMain->Close(); } //---------------------------------------------------------------------------6 void __fastcall TfrmMain::iExitClick(TObject *Sender) { frmMain->Close(); } //--------------------------------------------------------------------------- void __fastcall TfrmMain::iUploadClick(TObject *Sender) { NMHTTP->Get("http://www.digibytes.net/~opslag/uitvoer.txt"); String sOverbreng = NMHTTP->Body; TransmitCommChar(hComm, sOverbreng); } //--------------------------------------------------------------------------- [/code:1:cf81ca3812] Dit werkte dus niet, dus toen maar de volgende oplossing bedacht: [code:1:cf81ca3812] { NMHTTP->Get("http://www.digibytes.net/~opslag/uitvoer.txt"); String cLetter = NMHTTP->Body; int i = 0; while(cLetter[i] != '/0') { edtUitvoer->Text = (" test "); i++; } } [/code:1:cf81ca3812] Maar dan krijg ik steeds een overflow error... :( Misschien dat iemand naar de code kan kijken? Dit is de link: [url]http://www.digibytes.net/~opslag/Project.zip[/url] Alvast bedankt :)
Link naar reactie
[quote:27001ce7c3] [code:1:27001ce7c3] NMHTTP->Get("http://www.digibytes.net/~opslag/uitvoer.tx"); String cLetter = NMHTTP->Body; int i = 0; while(cLetter[i] != '/0') { edtUitvoer->Text = (" test "); i++; } } [/code:1:27001ce7c3] Maar dan krijg ik steeds een overflow error... :( [/quote:27001ce7c3] Ik weet niet of het probleem hiermee gerelateerd is, maar die NetMaster componenten werken niet geheel foutvrij. Gebruik bijvoorbeeld de componenten van Indy o.i.d. P.S. 1. Misschien is het ook handig als je de lengte van cLetter checkt. 2. Een standaard string heeft een maximum lengte van 255 karakters. Om helemaal safe te zijn zou ik cLetter definieren als AnsiString. Tenzij je bij de compiler opties "huge strings" o.i.d. aanzet.
Link naar reactie
[quote:35ea2f7da9="h4xX0r"][quote:35ea2f7da9] [code:1:35ea2f7da9] NMHTTP->Get("http://www.digibytes.net/~opslag/uitvoer.tx"); String cLetter = NMHTTP->Body; int i = 0; while(cLetter[i] != '/0') { edtUitvoer->Text = (" test "); i++; } } [/code:1:35ea2f7da9] Maar dan krijg ik steeds een overflow error... :( [/quote:35ea2f7da9] Ik weet niet of het probleem hiermee gerelateerd is, maar die NetMaster componenten werken niet geheel foutvrij. Gebruik bijvoorbeeld de componenten van Indy o.i.d. P.S. 1. Misschien is het ook handig als je de lengte van cLetter checkt. 2. Een standaard string heeft een maximum lengte van 255 karakters. Om helemaal safe te zijn zou ik cLetter definieren als AnsiString. Tenzij je bij de compiler opties "huge strings" o.i.d. aanzet.[/quote:35ea2f7da9] jah, daar heb ik ook al aan gedacht... Maar met deze code: [code:1:35ea2f7da9] for(int c=0;c<(string.lengt());c++){ verstuurobject->send(string[c],...); } [/code:1:35ea2f7da9] krijg ik nog steeds de overflow error :( En volgens mij werkt het NMHTTP component wel goed. Als ik de string namelijk in een editbox laat afdrukken komt keurig de tekst erin. De string bestaat trouwens uit maximaal 20 letters; checken op groote is dus niet echt nodig... Helemaal niet als ik later deze optie toevoeg in de website. Ik ben zoals je misschien ziet echt een beetje radeloos :) [/code]
Link naar reactie
[quote:66b19ee7fb="Toverstaf"][quote:66b19ee7fb="h4xX0r"][quote:66b19ee7fb] [code:1:66b19ee7fb] NMHTTP->Get("http://www.digibytes.net/~opslag/uitvoer.tx"); String cLetter = NMHTTP->Body; int i = 0; while(cLetter[i] != '/0') { edtUitvoer->Text = (" test "); i++; } } [/code:1:66b19ee7fb] Maar dan krijg ik steeds een overflow error... :( [/quote:66b19ee7fb] Ik weet niet of het probleem hiermee gerelateerd is, maar die NetMaster componenten werken niet geheel foutvrij. Gebruik bijvoorbeeld de componenten van Indy o.i.d. P.S. 1. Misschien is het ook handig als je de lengte van cLetter checkt. 2. Een standaard string heeft een maximum lengte van 255 karakters. Om helemaal safe te zijn zou ik cLetter definieren als AnsiString. Tenzij je bij de compiler opties "huge strings" o.i.d. aanzet.[/quote:66b19ee7fb] jah, daar heb ik ook al aan gedacht... Maar met deze code: [code:1:66b19ee7fb] for(int c=0;c<(string.lengt());c++){ verstuurobject->send(string[c],...); } [/code:1:66b19ee7fb] krijg ik nog steeds de overflow error :( [/quote:66b19ee7fb] Misschien handig als je vertelt op welk punt je de overflow error krijgt. [quote:66b19ee7fb="Toverstaf"] En volgens mij werkt het NMHTTP component wel goed. Als ik de string namelijk in een editbox laat afdrukken komt keurig de tekst erin. De string bestaat trouwens uit maximaal 20 letters; checken op groote is dus niet echt nodig... Helemaal niet als ik later deze optie toevoeg in de website. [/quote:66b19ee7fb] Ik zou toch een check inbouwen, met een foutmelding als "string te groot" als het misgaat of je moet liever de volgende meldingen willen hebben: 'access violation op adres xxx:xxx' of 'overflow error' waar je niets mee kunt. 1. Begint de werkelijke inhoud van een string inhoud bij string[0]? 2. Bevat NMHTTP->Body of cLetter een '/0' karakter? 3. De inhoud van edtUitvoer->Text laat in bovenstaande code altijd " test " zien, tenzij cLetter[0] gelijk is aan "/0" [quote:66b19ee7fb="Toverstaf"] Ik ben zoals je misschien ziet echt een beetje radeloos :)[/quote:66b19ee7fb]
Link naar reactie
[quote:68808edf65="h4xX0r"][quote:68808edf65="Toverstaf"][quote:68808edf65="h4xX0r"][quote:68808edf65] [code:1:68808edf65] NMHTTP->Get("http://www.digibytes.net/~opslag/uitvoer.tx"); String cLetter = NMHTTP->Body; int i = 0; while(cLetter[i] != '/0') { edtUitvoer->Text = (" test "); i++; } } [/code:1:68808edf65] Maar dan krijg ik steeds een overflow error... :( [/quote:68808edf65] Ik weet niet of het probleem hiermee gerelateerd is, maar die NetMaster componenten werken niet geheel foutvrij. Gebruik bijvoorbeeld de componenten van Indy o.i.d. P.S. 1. Misschien is het ook handig als je de lengte van cLetter checkt. 2. Een standaard string heeft een maximum lengte van 255 karakters. Om helemaal safe te zijn zou ik cLetter definieren als AnsiString. Tenzij je bij de compiler opties "huge strings" o.i.d. aanzet.[/quote:68808edf65] jah, daar heb ik ook al aan gedacht... Maar met deze code: [code:1:68808edf65] for(int c=0;c<(string.lengt());c++){ verstuurobject->send(string[c],...); } [/code:1:68808edf65] krijg ik nog steeds de overflow error :( [/quote:68808edf65] Misschien handig als je vertelt op welk punt je de overflow error krijgt. [quote:68808edf65="Toverstaf"] En volgens mij werkt het NMHTTP component wel goed. Als ik de string namelijk in een editbox laat afdrukken komt keurig de tekst erin. De string bestaat trouwens uit maximaal 20 letters; checken op groote is dus niet echt nodig... Helemaal niet als ik later deze optie toevoeg in de website. [/quote:68808edf65] Ik zou toch een check inbouwen, met een foutmelding als "string te groot" als het misgaat of je moet liever de volgende meldingen willen hebben: 'access violation op adres xxx:xxx' of 'overflow error' waar je niets mee kunt. 1. Begint de werkelijke inhoud van een string inhoud bij string[0]? 2. Bevat NMHTTP->Body of cLetter een '/0' karakter? 3. De inhoud van edtUitvoer->Text laat in bovenstaande code altijd " test " zien, tenzij cLetter[0] gelijk is aan "/0" [quote:68808edf65="Toverstaf"] Ik ben zoals je misschien ziet echt een beetje radeloos :)[/quote:68808edf65][/quote:68808edf65] Antwoord op je vragen: 1. Ja, de string begint echt bij string[0] (of ik moet echt iets fouts hebben gedaan 2. Geen idee. Wat ik wel weet is dat het niet hier aan ligt, de inhoud van de opgehaalde string is "Dit is ff een leuk test". Ik krijg de foutmelding ook als ik hem laat zoeken naar 't' .... het ligt dus niet aan een karakter die hij niet kan vinden. 3. Correct, dit was ook alleen even als voorbeeld bedoelt; maar zelfs die tekst komt niet in de editbox te staan. De code zou kunnen worden gewijzigd in: [code:1:68808edf65] void __fastcall TfrmMain::iUploadClick(TObject *Sender) { NMHTTP->Get("http://www.digibytes.net/~opslag/uitvoer.txt"); String cLetter = NMHTTP->Body; for (int i=0; cLetter[i] != '\0'; i++) { TransmitCommChar(hComm, cLetter[i]); } } [/code:1:68808edf65] Het probleem is dus dat ik wel karakters kan versturen als ik in de memo typ, maar ik kan geen hele string versturen. Ik moet de string dus in karakters omzetten; en die 1 voor 1 versturen naar de com poort.
Link naar reactie
[quote:2379c11506="[DarthV]"]Zet er een dubbele check in zo te zien komt het programma geen '\0' tegen zodat er buiten het string geheugen gebied gelezen wordt wat als gevolg de buffer overflow heeft. Dit is regel 1 : controleer altijd de buffersize. (PS in het eerste voorbeeld dat je geeft check je op /0 inplaats van \0)[/quote:2379c11506] Ik ben er bijna uit... De code is nu: [code:1:2379c11506] { int Index; NMHTTP->Get("http://www.digibytes.net/~opslag/uitvoer.txt"); String cLetter = NMHTTP->Body; for (Index = 1; Index <= cLetter.Length(); Index++) TransmitCommChar(hComm, cLetter[Index]); } [/code:1:2379c11506] Je moet index dus een begin waarde meegeven. Het probleem nu is alleen dat hij alleen de eerste 2 karakters verstuurd :(
Link naar reactie

Om een reactie te plaatsen, moet je eerst inloggen

Gast
Reageer op dit topic

×   Geplakt als verrijkte tekst.   Herstel opmaak

  Er zijn maximaal 75 emoji toegestaan.

×   Je link werd automatisch ingevoegd.   Tonen als normale link

×   Je vorige inhoud werd hersteld.   Leeg de tekstverwerker

×   Je kunt afbeeldingen niet direct plakken. Upload of voeg afbeeldingen vanaf een URL in

  • Populaire leden

    Er is nog niemand die deze week reputatie heeft ontvangen.

  • Leden

    Geen leden om te tonen

×
×
  • Nieuwe aanmaken...