Tegn går tabt...

Tags:    c++ opfinder

Hej...

Jeg har et problem med følgende kodestump:


////////////////////////////////////////////////////////////////////////////


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

char GlobalBuffer[256], GlobalBuffer1[128], GlobalBuffer2[128], GlobalBuffers[128];
int i, GlobalBufferIdx;
DWORD GlobalLength, GlobalDummy;

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

void SendCom(HANDLE Port)
{
WriteFile(Port, GlobalBuffer2, strlen(GlobalBuffer2), &GlobalDummy, 0);
}

void SendCom1s(HANDLE Port)
{
WriteFile(Port, GlobalBuffers, strlen(GlobalBuffers), &GlobalDummy, 0);
}

void ModtagerCom(HANDLE Port)
{
ReadFile(Port, GlobalBuffer2, 128, &GlobalLength, 0);
if(GlobalBuffer2 != '\\0' )
{
for(i = 0; i < GlobalLength; i++)
{
printf("%c ", GlobalBuffer2);
}
}
}

void Port2(int t)
{

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

if(ComPort == INVALID_HANDLE_VALUE)
{
printf("Failed to open port nr 1\\n");
}

GetCommState(ComPort, &dcb);
dcb.BaudRate = 4800;
dcb.ByteSize = 8;
dcb.Parity = 0;
dcb.StopBits = ONESTOPBIT;
dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
dcb.fOutxCtsFlow = 1;
SetCommState(ComPort, &dcb);
SetTimeOut(ComPort, 1);

if( t == 1) // hvis t er 1 så bliver ModtagerCom kørt
{
ModtagerCom(ComPort);
}
else
{
SendCom(ComPort);
}
CloseHandle(ComPort);

}

void Port1(int t)
{
DCB dcb;
HANDLE ComPort2 = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);

if(ComPort2 == INVALID_HANDLE_VALUE)
{
printf("Failed to open port nr 4\\n");
}

GetCommState(ComPort2, &dcb);
dcb.BaudRate = 9600;
dcb.ByteSize = 8;
dcb.Parity = 0;
dcb.StopBits = ONESTOPBIT;
dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
dcb.fOutxCtsFlow = 1;
SetCommState(ComPort2, &dcb);
SetTimeOut(ComPort2, 1);

if( t == 1) // hvis t er 1 så bliver ModtagerCom kørt
{
ModtagerCom(ComPort2);
}
else
{
SendCom(ComPort2);
}
CloseHandle(ComPort2);

}



int main()
{
int DONE=0, in1;
char in2[128];
DCB dcb;


while(!DONE)
{

Port2(1);
Port1(0);
for(i = 0; i < GlobalLength; i++)
{
GlobalBuffer2 = '\\0';
}
if(kbhit())
{
if ((in1 = getch()) == '\\x1B')
{
DONE = 1;
}
else
{
putch(in1);
GlobalBuffers[0] = in1;
GlobalBuffers[1] = 0;

HANDLE ComPort3 = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);

if(ComPort3 == INVALID_HANDLE_VALUE)
{
printf("Failed to open port nr 2\\n");
}

GetCommState(ComPort3, &dcb);
dcb.BaudRate = 9600;
dcb.ByteSize = 8;
dcb.Parity = 0;
dcb.StopBits = ONESTOPBIT;
dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
dcb.fOutxCtsFlow = 1;
SetCommState(ComPort3, &dcb);
SetTimeOut(ComPort3, 1);
SendCom1s(ComPort3);
CloseHandle(ComPort3);

}
}
Port1(1);
Port2(0);
for(i = 0; i < GlobalLength; i++)
{
GlobalBuffer2 = '\\0';
}
}
}

////////////////////////////////////////////////////////////////////////////


Meningen med programmet er at den skal videresende data fra en COMPORT til en anden og programmet udskriver det der blíver sendt videre!
Mit problem er at der går noget data tabt, oftest i starten af strengen.

Eksembel:
der bliver sendt "123" men den udskriver måske kun "23" "eller "3". Selvom ind imellem bliver det skrevet rigtigt ud!

Hvad kan være galt??

Hvis jeg skal uddybe forklaringen mere så bare skriv!

VH Mikkel




3 svar postet i denne tråd vises herunder
0 indlæg har modtaget i alt 0 karma
Sorter efter stemmer Sorter efter dato
Har du prøvet at åbne begge porte i starten af main, og lukke dem til slut i main, og kun der?



Hvor du kan, flush ud når du har skrevet noget der skal sikres ryger afsted.

Med hensyn til COM, tror jeg det er en fordel at lave din arkitektur om til enten at abonere på events fra en udbyder, hver gang der er data på com porten du vil lytte til, eller lave en tråd selv der ikke laver andet end at læse fra COM til en buffer.

Du skal sikre dig at du aldrig går glip af data på den COM du lytter til, og derfor vil jeg anbefale dig at lave en tråd som nævnt før, hvis ikke du kan finde en component et sted der tilbyder at lave arbejdet for dig.

Du skal uanset hvad isolerer de to events eller tråde fra hinanden, således at der er en buffer til fælles, som den ene tråd smider data i, og den anden tråd læser fra ... og den der læser skriver naturligvis også til den COM port der skal outputtes til.



Jeg har fundet ud af det....

Tak for hjælpen...



t