Op deze website gebruiken we cookies om content en advertenties te personaliseren, om functies voor social media te bieden en om ons websiteverkeer te analyseren. Ook delen we informatie over uw gebruik van onze site met onze partners voor social media, adverteren en analyse. Deze partners kunnen deze gegevens combineren met andere informatie die u aan ze heeft verstrekt of die ze hebben verzameld op basis van uw gebruik van hun services. Meer informatie.

Akkoord

Vraag & Antwoord

Programmeren

C++,

None
9 antwoorden
  • 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: http://www.digibytes.net/~opslag/Project.zip

    Alvast bedankt :)
  • [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.
  • [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 :)
  • [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]
  • [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.
  • 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="[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 :(
  • Print gewoon eens de uitkomst van CLetter.Length(). Het lijkt erop dat hij de loop maar 2 keer doorloopt.
  • Het probleem is opgelost.

    Blijkbaar gooide hij de buffer te snel vol waarna hij helemaal niks meer deed. Een sleep van 25 milliseconden was genoeg om het geheel aan het werk te krijgen.

    Thnx iedereen !

Beantwoord deze vraag

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.