Problem med GetCommMask

Tags:    c++ c++ apps iphone android

Hej....

Jeg vil gerne have nedenstående eks. til at virke. Problemet med koden er at den går ud og læser bufferen hver gang i stedet for at vente på 'EventChar'en bliver skrevet i bufferen. Jeg skal IKKE bruge WaitCommMask, medmindre man kan sætte en timeout på den! Eftersom den stopper programmet så man ikke kan skrive noget på tasteturet mens programmet kører fordi WaitCommMask venter på EventChar vil blive skrevet i bufferen.

Jeg skal nok prøve at beskrive det bedre hvis I har spørgsmål! :D

***************************Kode Begynd****************

#include <stdio.h>
#include <windows.h>
#include <conio.h>

void SetTimeOut(HANDLE Port, int sec)
{
COMMTIMEOUTS commtimeouts;
GetCommTimeouts(Port, &commtimeouts);
commtimeouts.ReadIntervalTimeout = 1000*sec;
commtimeouts.ReadTotalTimeoutMultiplier = 10;
commtimeouts.ReadTotalTimeoutConstant = 1000*sec;
SetCommTimeouts(Port, &commtimeouts);
}

void Tx(HANDLE Port, const char *data)
{
DWORD Dummy;
WriteFile(Port, data, strlen(data), &Dummy, 0);

}

void Rx(HANDLE Port)
{
char Buffer[128];
DWORD Length, i;

ReadFile(Port, Buffer, 128, &Length, 0);

for(i = 0; i < Length; i++)
printf("%c", Buffer);
}

int main(void)
{

DWORD dwEvtMask = 0;
OVERLAPPED o;

DCB dcb;
HANDLE ComPort = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);

GetCommState(ComPort, &dcb);
dcb.EvtChar = '\\n';
SetCommState(ComPort, &dcb);
SetTimeOut(ComPort, 1);
SetCommMask(ComPort, EV_RXFLAG);


int in1, DONE = 0;
char in2[128];

while(!DONE)
{
if (kbhit())
{
if ((in1 = getch()) == '\\x1B')
{
DONE = 1;
}
else
{
putch(in1);
in2[0] = in1;
Tx(ComPort, in2);
}
}
if(GetCommMask(ComPort, &dwEvtMask))
{
if(dwEvtMask & EV_RXFLAG)
{
Rx(ComPort);
}
}
}


CloseHandle(ComPort);
}

**************************Kode Slut********************

På forhånd tak! :D

Romsen




3 svar postet i denne tråd vises herunder
0 indlæg har modtaget i alt 0 karma
Sorter efter stemmer Sorter efter dato
Jeg er ikke sikker på at det løser problemet, men du kunne prøve at kalde WaitCommEvent når du har kaldt GetCommMask, og set at din event er sat:

Fold kodeboks ind/udKode 


Problemet er måske at GetCommMask ikke sletter eventen.

Jeg er heller ikke sikker på hvordan jeg skal tolke:
"lpEvtMask [out] Pointer to the variable to be filled with a mask of events that are currently enabled. This parameter can be one or more of the following values. "
som kan læses på MSDN under GetCommMask.

Ellers er jeg bange for at du skal bruge noget overlapped og/eller selv lave en buffer hvori du gemmer data indtil en '\\n' er modtaget. Du kan sætte timeout til 0 så returnerer ReadFile med det samme og fortæller hvor mange karakterer den har læst.



Jeg kunne ikke få det til at virke med GetCommMask, så jeg lavede nedenstående, det ser ud til at virke:

Fold kodeboks ind/udKode 




Nu virker det, så jeg lukker spørgsmålet. :D

Mikkel



t