Toon posts:

[VC++] Configuring a Serial Port

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb de volgende code gebruikt om de seriele poort in te stellen met Visual C++ 5.0 onder Windows XP.
De code lijkt foutloos, maar toch krijg ik de error dat de poort niet kon geconfigureerd worden.
Met GetLAstError krijg ik las error 1244808, een mij niet bekende error.
Weet iemand wat het probleem hier kan zijn? Ik heb echt geen gedacht van waar ik moet beginnen zoeken. Misschien hebben de meer ervaren VC++ gebruikers hier wel een antwoord op??

{
DWORD dwError;
DCB PortDCB;
PortDCB.DCBlength = sizeof (DCB);
GetCommState (hPort, &PortDCB);

PortDCB.BaudRate = 9600;
PortDCB.fBinary = TRUE;
PortDCB.fParity = TRUE;
PortDCB.fOutxCtsFlow = FALSE;
PortDCB.fOutxDsrFlow = FALSE;
PortDCB.fDtrControl =DTR_CONTROL_ENABLE;

PortDCB.fDsrSensitivity = FALSE;
PortDCB.fTXContinueOnXoff = TRUE;
PortDCB.fOutX = FALSE;
PortDCB.fInX = FALSE;
PortDCB.fErrorChar = FALSE;
PortDCB.fNull =FALSE;
PortDCB.fRtsControl = RTS_CONTROL_ENABLE;

PortDCB.fAbortOnError = FALSE;

PortDCB.ByteSize = 8;
PortDCB.Parity = NOPARITY;
PortDCB.StopBits = ONESTOPBIT;

SetCommState(hPort, &PortDCB);


if (!SetCommState (hPort, &PortDCB))
{
MessageBox (NULL, TEXT("Unable to configure the serial port"));
dwError = GetLastError ();
};

}

  • Pooh
  • Registratie: April 2001
  • Niet online

Pooh

Lees eens een boek

[hier stond onzin]

edit:
code:
1
2
DWORD dwError;
PortDCB.DCBlength = sizeof (DCB);

Wat is hier het idee van? Dit is toch niet nodig?
code:
1
2
SetCommState(hPort, &PortDCB);
if (!SetCommState (hPort, &PortDCB))

Twee keer vlak na elkaar? Ten eerste niet nodig, bovendien zou 't wel eens een timing-probleem kunnen opleveren.

  • roelio
  • Registratie: Februari 2001
  • Niet online

roelio

fruitig, en fris.

Aan het einde van je code roep je twee keer SetComState() aan, een keer "de echte aanroep" en een keer een fout-test... Maar als die eerste aanroep al foutgaat waarom dan in de IF nog een keer aanroepen?

AMD Phenom II X4 // 8 GB DDR2 // SAMSUNG 830 SSD // 840 EVO SSD // Daar is Sinterklaas alweer!!


Verwijderd

Topicstarter
Op dinsdag 19 februari 2002 09:02 schreef limoentje het volgende:
Aan het einde van je code roep je twee keer SetComState() aan, een keer "de echte aanroep" en een keer een fout-test... Maar als die eerste aanroep al foutgaat waarom dan in de IF nog een keer aanroepen?
Ik begrijp de reactie niet goed. Dat if-statement staat er toch gewoon om te kijken als SetComState gelukt is of niet. Als ik dit niet doe, dan weet ik toch niet als het gelukt is of niet? :?

Verwijderd

Dat klopt maar dat testen doe je ip het statement binnen de if dus die er vlak voor is kinda overbodig.

Verwijderd

Op dinsdag 19 februari 2002 10:17 schreef fladder het volgende:
Dat klopt maar dat testen doe je op het statement binnen de if dus die SetComState er vlak voor is kinda overbodig.
[edit]Altijd leuk (lees: dom), quote ipv edit clicken :)

Verwijderd

Topicstarter
Op dinsdag 19 februari 2002 10:17 schreef fladder het volgende:
Dat klopt maar dat testen doe je ip het statement binnen de if dus die er vlak voor is kinda overbodig.
idd, thx.

Maar dat is hte probleem blijkbaar niet. Als ik het de eerste SetCommState weg doe, dan blijf ik dezelfde foutmelding krijgen.

Verwijderd

Retourneert de functie GetLastError die foutcode of genereert de compiler die fout.

Als de foutcode van GetLastError afkomt kun je proberen hem opzoeken in de MSDN(ik weet niet of dat gaat met compileerfouten). Als je die niet hebt dan kun je het eens proberen op msdn.microsoft.com maar dat is niet zo handig als de CD's die bij VC++ zitten. Ik kan helaas niet met je meezoeken ik heb die CD's nml niet bij de hand nu. Ik vind het echter wel een rare foutcode, normaal zijn die van GetLastError niet zolang volgens mij.

Mag ik trouwens vragen waarom je al die settings van het DCB invult? Is dat echt allemaal nodig? Kijk eens wat er standaard staat ingesteld voor die waarden dan kun je misschien de helft al wel weglaten. Dat komt naar mijn mening de leesbaarheid alleen maar ten goede.

Succes

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 12-09 23:01
Waar haal jij die hPort vandaan? iS dat wel een handle die van CreateFile(...) terug komt?

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Topicstarter
Op dinsdag 19 februari 2002 10:31 schreef vanbom het volgende:
Retourneert de functie GetLastError die foutcode of genereert de compiler die fout.

Als de foutcode van GetLastError afkomt kun je proberen hem opzoeken in de MSDN(ik weet niet of dat gaat met compileerfouten). Als je die niet hebt dan kun je het eens proberen op msdn.microsoft.com maar dat is niet zo handig als de CD's die bij VC++ zitten. Ik kan helaas niet met je meezoeken ik heb die CD's nml niet bij de hand nu. Ik vind het echter wel een rare foutcode, normaal zijn die van GetLastError niet zolang volgens mij.

Mag ik trouwens vragen waarom je al die settings van het DCB invult? Is dat echt allemaal nodig? Kijk eens wat er standaard staat ingesteld voor die waarden dan kun je misschien de helft al wel weglaten. Dat komt naar mijn mening de leesbaarheid alleen maar ten goede.

Succes
De foutcode komt van GetLastError. Die code heb ik opgezocht op msdn, maar het is geen standaard foutcode. (die foutcodes die in msdn staan, zijn idd niet zo lang.)
Vandaar dat ik het nogal bizar vind.
De standaard instellingen van de DCB waarden zijn geen goede waarden, dus ik moet ze idd zelf instellen. Wat de leesbaarheid idd niet ten goede komt, maar de werking van de poort wel :) (of het zou toch zo moeten zijn ;) )

alvast bedankt voor de reply *D

Verwijderd

Topicstarter
Op dinsdag 19 februari 2002 11:55 schreef farlane het volgende:
Waar haal jij die hPort vandaan? iS dat wel een handle die van CreateFile(...) terug komt?
ja, hPort is een handle van CreateFile. CreateFile gebeurt al vtoeger in het programma. Maar dat had idd het probleem kunnen zijn :) thx

  • Pooh
  • Registratie: April 2001
  • Niet online

Pooh

Lees eens een boek

code:
1
PortDCB.DCBlength = sizeof(DCB);

Voor de 2e keer dan maar, want blijkbaar las je er overheen: Waar haal je deze lugubere code vandaan, en waarom? Zo'n dcb'tje kan toch wel voor zichzelf zorgen?

Verwijderd

Topicstarter
Op dinsdag 19 februari 2002 12:18 schreef Poohbear het volgende:
code:
1
PortDCB.DCBlength = sizeof(DCB);

Voor de 2e keer dan maar, want blijkbaar las je er overheen: Waar haal je deze lugubere code vandaan, en waarom? Zo'n dcb'tje kan toch wel voor zichzelf zorgen?
Oops, sorry, ik las er idd overheen.
Dit stukje code is nog blijven staan uit de vorige versie van het programma. Het is ondertussen reeds verbannen ;)

Toch bedankt.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 12-09 23:01
Op dinsdag 19 februari 2002 12:15 schreef Herdore1 het volgende:

[..]
Heb jum ook gechecked op INVALID_HANDLE_VALUE?

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 12-09 23:01
Probeer anders dit (werkend) stukje code eens:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    if (!BuildCommDCB("COM1: baud=19200 parity=N data=8 stop=1", &dcb))
         return (-1);

    dcb.fOutxCtsFlow=FALSE;
    dcb.fOutxDsrFlow=FALSE;
    dcb.fDtrControl=DTR_CONTROL_DISABLE;
    dcb.fDsrSensitivity=FALSE;
    dcb.fOutX=FALSE;
    dcb.fInX=FALSE;
    dcb.fErrorChar=FALSE;
    dcb.fNull=FALSE;
    dcb.fRtsControl=RTS_CONTROL_ENABLE;
    dcb.fAbortOnError=FALSE;

    if (!SetCommState(handle, &dcb))
        return (-1);

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Topicstarter
Op dinsdag 19 februari 2002 12:24 schreef farlane het volgende:

[..]

Heb jum ook gechecked op INVALID_HANDLE_VALUE?
Nope, dat zal ik zeker doen. Stom van mij om daar niet aan te denken |:(

Verwijderd

Topicstarter
Thx for sharing Farlane !
ik ga al jullie tips morgen moeten proberen, omdat ik nu op school zit, en pas morgen terug thuis kom. Maar ik hou jullie zeker op de hoogte van de resultaten.

CU tomorrow . ;)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 11-09 08:26

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op dinsdag 19 februari 2002 12:18 schreef Poohbear het volgende:
code:
1
PortDCB.DCBlength = sizeof(DCB);

Voor de 2e keer dan maar, want blijkbaar las je er overheen: Waar haal je deze lugubere code vandaan, en waarom? Zo'n dcb'tje kan toch wel voor zichzelf zorgen?
't is maar goed dat ie er overheen leest, want dat stukje is nodig
In de meeste win API structures zit een element die de grootte van de struct aangeeft, dus het eerste wat je moet doen met die structures is altijd gelijk de grootte zetten

Dat is gedaan om verschillende versies van de functie van elkaar te onderscheiden. Misschien wordt de struct in de toekomst uitgebreid, en dan kan dus gezien worden aan de lengte of het een oudere struct betreft of een nieuwe

dus Herdore1, zet die statement maar weer terug, want hij staat prima zo :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1