[C++/Win32] Compoort uitlezen lukt niet

Pagina: 1
Acties:
  • 124 views sinds 30-01-2008
  • Reageer

  • Donderwolk
  • Registratie: Januari 2002
  • Laatst online: 15-05 15:27
Op het moment ben ik bezig om een dll te schrijven voor m'n Pinnacle Remote Control die aan te sluiten is op een seriele/com poort. Ik wil deze uitlezen door gebruik te maken van api calls. Daarvoor heb ik de volgende code van msdn gehaald en hier en daar nog wat aangepast:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include <windows.h>
#include <assert.h>
#include <stdio.h>

void main( )
{
    HANDLE hCom;
    OVERLAPPED o;
    BOOL fSuccess;
    DWORD dwEvtMask;

    hCom = CreateFile( "COM1",
        GENERIC_READ | GENERIC_WRITE,
        0,    // exclusive access 
        NULL, // default security attributes 
        OPEN_EXISTING,
        FILE_FLAG_OVERLAPPED,
        NULL 
        );

    if (hCom == INVALID_HANDLE_VALUE) 
    {
        // Handle the error. 
        printf("CreateFile failed with error %d.\n", GetLastError());
        return;
    }

    // Set the event mask. 

    fSuccess = SetCommMask(hCom, EV_CTS | EV_DSR); //in mijn code veranderd naar EV_RXCHAR

    if (!fSuccess) 
    {
        // Handle the error. 
        printf("SetCommMask failed with error %d.\n", GetLastError());
        return;
    }

    // Create an event object for use by WaitCommEvent. 

    o.hEvent = CreateEvent(
        NULL,   // default security attributes 
        FALSE,  // auto reset event 
        FALSE,  // not signaled 
        NULL    // no name
        );
    

    // Intialize the rest of the OVERLAPPED structure to zero.
    o.Internal = 0;
    o.InternalHigh = 0;
    o.Offset = 0;
    o.OffsetHigh = 0;

    assert(o.hEvent);

    if (WaitCommEvent(hCom, &dwEvtMask, &o)) 
    {
        //hier staat in mijn code een printf om te kijken of er data binnenkomt
        if (dwEvtMask & EV_DSR) 
        {
             // To do. 
        }

        if (dwEvtMask & EV_CTS) 
        {
            // To do. 
        }
    }
    else
    {
        DWORD dwRet = GetLastError();
        if( ERROR_IO_PENDING == dwRet)
        {
            printf("I/O is pending...\n");

            // To do.
        }
        else 
            printf("WaitCommEvent failed with error %d.\n", GetLastError());
    }
}


Het probleem is dus dat ik niks kan uitlezen. Zelfs wanneer ik een DCB instel lukt het nog niet. De instelling die ik gebruik zijn: 1200 baud, 8 databits, no parity bits, en 1 stopbit. Ook met ReadFile(); lukt het niet om iets uit te lezen. Ik draai WinXP Professional SP2. Ik hoop dat jullie nog wat ideeen hebben wat er mis kan zijn?

Pwnd


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 17-05 17:19
Welke foutmelding krijg je? Probeer het anders eens met een simpele ReadFile zonder die events. Krijg je dan wel wat binnen ?

[ Voor 65% gewijzigd door farlane op 19-11-2004 12:36 ]

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.


  • Donderwolk
  • Registratie: Januari 2002
  • Laatst online: 15-05 15:27
Met readfile lukt het ook niet, ik ga er vanuit dat er iets mis is met de dcb instellingen. Dus ik zal daar nog eens even naar kijken. Ik post mijn bevindingen nog wel even.

Pwnd


  • MisterData
  • Registratie: September 2001
  • Laatst online: 16-05 23:29
Is het niet zo dat dat helemaal niet meer kan/mag in NT/XP? Voor paralelle poorten is het iig het geval :) Kijk anders eens naar DLPortIO ofzo :)

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 20:53

Creepy

Tactical Espionage Splatterer

MisterData schreef op vrijdag 19 november 2004 @ 15:21:
Is het niet zo dat dat helemaal niet meer kan/mag in NT/XP? Voor paralelle poorten is het iig het geval :) Kijk anders eens naar DLPortIO ofzo :)
Nah, seriele communicatie kan nog prima op deze manier. DLport IO is alleen nodig voor het direct kunnen aansturen van I/O poorten wat in dit geval niet nodig is.

Donderwolk: probeer anders eens te meten of er uberhaupt wel wat wordt verzonden of niet.

[ Voor 10% gewijzigd door Creepy op 19-11-2004 15:38 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Donderwolk
  • Registratie: Januari 2002
  • Laatst online: 15-05 15:27
Ik heb geen idee waar het aan ligt. Ik zal vanavond nog even verder puzzelen.
Op het moment stel ik de DCB als volgt in:

dcb.BaudRate = BAUD_1200;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
dcb.fRtsControl = RTS_CONTROL_ENABLE;
dcb.fDtrControl = DTR_CONTROL_DISABLE;

Dat er signaal uit komt is zeker, als ik de remote control tool van pinnacle gebruik kan ik dmv een test ledjes groen laten branden.

Pwnd


  • Donderwolk
  • Registratie: Januari 2002
  • Laatst online: 15-05 15:27
Probleem opgelost. Om de Pinnacle Remote aan te sturen moet RTS hoog zijn en DTR laag.

Ik heb nu de volgende werkende code:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>

int _tmain(int argc, _TCHAR* argv[]){
    DCB dcb;
    HANDLE hCom;
    BOOL fSuccess;
    char *pcCommPort = "COM1";
    DWORD dwEvtMask;
    DWORD bytesread;
    char buffer[1];
    COMMTIMEOUTS timeouts;

    hCom = CreateFile( 
        pcCommPort,
        GENERIC_READ,
        0,    // must be opened with exclusive-access
        NULL, // no security attributes
        OPEN_EXISTING, // must use OPEN_EXISTING
        0,    // not overlapped I/O
        NULL  // hTemplate must be NULL for comm devices
    );

    if( hCom == INVALID_HANDLE_VALUE ){
        // Handle the error.
        printf ("CreateFile failed with error %d.\n", GetLastError());
        return (1);
    }

    if( !GetCommState( hCom, &dcb ) ){
        return (4);
    }
    //dcb.DCBlength = sizeof(DCB);
    
    dcb.BaudRate = CBR_1200;
    dcb.ByteSize = 8;
    dcb.StopBits = ONESTOPBIT;
    dcb.Parity = NOPARITY;
    dcb.fRtsControl = RTS_CONTROL_ENABLE;
    dcb.fDtrControl = DTR_CONTROL_DISABLE;
    
    if( !SetCommState( hCom, &dcb ) ){
        return (5);
    }

    /*
    if( !GetCommTimeouts( hCom, &timeouts ) ){
        return (2);
    }
  timeouts.ReadTotalTimeoutConstant = 100;
  timeouts.ReadTotalTimeoutMultiplier = 0;
  timeouts.WriteTotalTimeoutMultiplier = 0;
  timeouts.WriteTotalTimeoutConstant = 0;
    if( !SetCommTimeouts(hCom, &timeouts ) ){
        return(3);
    }
    */

    printf ("Serial port %s successfully reconfigured.\n", pcCommPort);

    unsigned char myChar[1];
    while( true ){
        if( ReadFile( hCom, myChar, 1, &bytesread, NULL ) ){
            if( bytesread > 0 ){
                printf( "some bytes were read" );
            }
        }
    }

    system("PAUSE");
    return 0;
}

Pwnd

Pagina: 1