Til Bertel

Tags:    c++ database locking timestamping samtidighed transaktion

Hej bertel
Jeg er kommet vidre med dette project: http://www.udvikleren.dk/thread.php?techid=1&f=1&t=660
Det var min computer der var noget galt med den gad ikke køre programmene du lavede til mig men da jeg formaterede og prøvede fik jeg lystet til at lyse og slukke hver gang jeg trykkede på enter! Men nu er spørgsmålet kan du hjælpe mig med at lære at forstå at lave programmer til serial porten så jeg selv kan lære det??? Kan du f.eks hjælpe mig med at forstå følgende program som vi lavede sidst:

#include <stdio.h>
#include <windows.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);
WriteFile(Port, "\\r\\n", 2, &Dummy, 0);
}

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

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

for(i = 0; i < Length; i++)
if(Buffer != '\\r')
printf("%c", Buffer);
}

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

GetCommState(ComPort, &dcb);
dcb.BaudRate = 9600;
dcb.ByteSize = 8;
dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
dcb.fOutxCtsFlow = 1;
SetCommState(ComPort, &dcb);
SetTimeOut(ComPort, 1);

int Counter = 0;
while(1)
{
if(Counter & 1)
dcb.fRtsControl = RTS_CONTROL_ENABLE;
else
dcb.fRtsControl = RTS_CONTROL_DISABLE;
printf("Counter: %d\\n", Counter);
SetCommState(ComPort, &dcb);
Counter++;
getchar();
}

CloseHandle(ComPort);

return 0;
}






49 svar postet i denne tråd vises herunder
0 indlæg har modtaget i alt 0 karma
Sorter efter stemmer Sorter efter dato
Min kode ser nu sådan ud:

#include <iostream>
#include <stdio.h>
#include <windows.h>
#include <time.h>

void SetTimeOut(HANDLE Port, int MSec)
{
COMMTIMEOUTS commtimeouts;
GetCommTimeouts(Port, &commtimeouts);
commtimeouts.ReadIntervalTimeout = MSec;
commtimeouts.ReadTotalTimeoutMultiplier = 1;
commtimeouts.ReadTotalTimeoutConstant = MSec;
SetCommTimeouts(Port, &commtimeouts);
}
unsigned int Start, End;

void Rx(HANDLE Port)
{
char Buffer[128];
DWORD Length = 0;
DWORD ErrorType = 0;
do
{
ReadFile(Port, Buffer, 128, &Length, 0);
ClearCommError(Port, &ErrorType, 0);
}
while(Length == 0 && ErrorType == 0);
Start = clock();
std::cout << "Du har sat de to ledninger sammen 1 gang" << std::endl;
}

void Rx1(HANDLE Port)
{
char Buffer[128];
DWORD Length = 0;
DWORD ErrorType = 0;
do
{
ReadFile(Port, Buffer, 128, &Length, 0);
ClearCommError(Port, &ErrorType, 0);
}
while(Length == 0 && ErrorType == 0 && End > 0.03);
End = clock();

std::cout << "Delay: " << (double )(End - Start)/CLOCKS_PER_SEC << std::endl;
getchar();
}


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

GetCommState(ComPort, &dcb);
dcb.BaudRate = 9600;
dcb.ByteSize = 8;
dcb.fRtsControl = RTS_CONTROL_ENABLE;
dcb.fErrorChar = TRUE;
dcb.fParity = TRUE;
dcb.Parity = ODDPARITY;
dcb.fAbortOnError = TRUE;
dcb.fOutxCtsFlow = 1;
SetCommState(ComPort, &dcb);
SetTimeOut(ComPort, 1);


Rx(ComPort);
Rx1(ComPort);

CloseHandle(ComPort);

return 0;
}

men det virker ikke jeg har to krokodille næbs ledninger på pin 2 og pin 7 og jeg kører dem hurtigt forbi hinanden så de kun lige snitter hinanden men den venter ikke til næste gang jeg skal gøre det den regner bare ud med det samme!





Det bør vist være:

void Rx1(HANDLE Port)
{
char Buffer[128];
DWORD Length = 0;
DWORD ErrorType = 0;
double diff;
do
{
ReadFile(Port, Buffer, 128, &Length, 0);
ClearCommError(Port, &ErrorType, 0);
End = clock();
diff = (double )(End - Start)/CLOCKS_PER_SEC;
std::cout << "Diff " << diff << std::endl;
}
while(Length == 0 && ErrorType == 0 && diff < 0.03);



While sætningen skal vist laves om til:

while((Length == 0 && ErrorType == 0) || diff < 0.03);



Jeg har prøvet at lave endringerne men det gør ingen forskel jeg har så selv prøvet dette hvor der så mindst skal gå 1 sek før du må kunne tilslutte dem igen men det virker heller ikke men her er den:

#include <iostream>
#include <stdio.h>
#include <windows.h>
#include <time.h>

void SetTimeOut(HANDLE Port, int MSec)
{
COMMTIMEOUTS commtimeouts;
GetCommTimeouts(Port, &commtimeouts);
commtimeouts.ReadIntervalTimeout = MSec;
commtimeouts.ReadTotalTimeoutMultiplier = 1;
commtimeouts.ReadTotalTimeoutConstant = MSec;
SetCommTimeouts(Port, &commtimeouts);
}
unsigned int Start, End;

void Rx(HANDLE Port)
{
char Buffer[128];
DWORD Length = 0;
DWORD ErrorType = 0;
do
{
ReadFile(Port, Buffer, 128, &Length, 0);
ClearCommError(Port, &ErrorType, 0);
}
while(Length == 0 && ErrorType == 0);
Start = clock();
cout << "Du har sat de to ledninger sammen 1 gang" << endl;
}

void Rx1(HANDLE Port)
{
char Buffer[128];
DWORD Length = 0;
DWORD ErrorType = 0;
do
{
ReadFile(Port, Buffer, 128, &Length, 0);
ClearCommError(Port, &ErrorType, 0);
}
while(Length == 0 && ErrorType == 0);
End = clock();


}


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

GetCommState(ComPort, &dcb);
dcb.BaudRate = 9600;
dcb.ByteSize = 8;
dcb.fRtsControl = RTS_CONTROL_ENABLE;
dcb.fErrorChar = TRUE;
dcb.fParity = TRUE;
dcb.Parity = ODDPARITY;
dcb.fAbortOnError = TRUE;
dcb.fOutxCtsFlow = 1;
SetCommState(ComPort, &dcb);
SetTimeOut(ComPort, 1);


Rx(ComPort);
Rx1(ComPort);
if (End <= 1000)
{
Start = 0;
End = 0;
Rx(ComPort);
Rx1(ComPort);
}
else
{
cout << "Delay: " << (double )(End - Start)/CLOCKS_PER_SEC << endl;
getchar();
}

CloseHandle(ComPort);

return 0;
}




En testet udgave:

Fold kodeboks ind/udKode 




Tak Bertel nu virker det sku! Nu skal jeg bare lige have lavet selveste vindmåleren færdig her i weekenden og så lave lidt små endringer i programmet men jeg skriver en gang når jeg får problemmer! Håber det er iorden med dig at jeg lader tråden stå åben for jeg har ikke flere point så jeg kan ikke spørge mere hvis jeg lukker denne!



Hmm jeg har allerede et nyt spørgsmål hvorfor kan jeg ikke lave en lykke så den bliver ved med at køre istedet går den ud af programmet så snart jeg trykker ind i det:

#include <iostream>
#include <stdio.h>
#include <windows.h>
#include <time.h>

void SetTimeOut(HANDLE Port, int MSec)
{
COMMTIMEOUTS commtimeouts;
GetCommTimeouts(Port, &commtimeouts);
commtimeouts.ReadIntervalTimeout = MSec;
commtimeouts.ReadTotalTimeoutMultiplier = 1;
commtimeouts.ReadTotalTimeoutConstant = MSec;
SetCommTimeouts(Port, &commtimeouts);
}
unsigned int Start, End;

void Rx(HANDLE Port)
{
char Buffer[128];
DWORD Length = 0;
DWORD ErrorType = 0;
do
{
ReadFile(Port, Buffer, 128, &Length, 0);
ClearCommError(Port, &ErrorType, 0);
}
while(Length == 0 && ErrorType == 0);

Start = clock();
std::cout << "Du har sat de to ledninger sammen 1 gang" << std::endl;
}

void Rx1(HANDLE Port)
{
char Buffer[128];
DWORD Length = 0;
DWORD ErrorType = 0;
double diff;
do
{
ReadFile(Port, Buffer, 128, &Length, 0);
ClearCommError(Port, &ErrorType, 0);
End = clock();
diff = (double )(End - Start)/CLOCKS_PER_SEC;
}
while((Length == 0 && ErrorType == 0) || diff < 0.50);
std::cout << "Delay: " << (double )(End - Start)/CLOCKS_PER_SEC << std::endl;
}



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

GetCommState(ComPort, &dcb);
dcb.BaudRate = 9600;
dcb.ByteSize = 8;
dcb.fRtsControl = RTS_CONTROL_ENABLE;
dcb.fErrorChar = TRUE;
dcb.fParity = TRUE;
dcb.Parity = ODDPARITY;
dcb.fAbortOnError = TRUE;
dcb.fOutxCtsFlow = 1;
SetCommState(ComPort, &dcb);
SetTimeOut(ComPort, 1);

while(0)
{
Rx(ComPort);
Rx1(ComPort);
Start = 0;
End = 0;
getchar();
}

return 0;
}



Du skal bruge while(1) og ikke while(0).

Du må gerne lukke denne tråd (ved at lave et svar og acceptere det), og så lave et nyt. Dette spørgsmå er blevet lidt langt, og ser temmelig underligt ud i min browser. Jeg samler ikke på point.



Ok tak bertel jeg opretter en ny så snart jeg får brug for hjælp :-)



t